TCP/IP數據包的傳輸狀態

數據包的狀態

[root@m01 ~]$netstat -anptul
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      7127/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7212/master         
tcp        0     52 10.0.0.61:22            10.0.0.1:58421          ESTABLISHED 7808/sshd: root@pts 
tcp        0      0 10.0.0.61:22            10.0.0.1:54035          ESTABLISHED 7390/sshd: root@pts 
tcp6       0      0 :::21                   :::*                    LISTEN      7133/vsftpd         
tcp6       0      0 :::22                   :::*                    LISTEN      7127/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      7212/master  
連接狀態 說明 type
NEW 主機向遠程機器發時一個連接請求,這個數據包狀態是NEW STREAM/DGRAM
ESTABLISHED 當聯接建立之後,遠程主機和你主機通信數據狀態爲ESTABLISHED STREAM/DGRAM
RELATED 像ftp這樣的服務,用21端口傳送命令,而用20端口(port模式)或其他端口(PASV模式)傳送數據。在已有21端口上建立好連接後發送命令,用20傳送的數據,狀態是RELATED STREAM/DGRAM
LISTEN 正在監聽狀態,還未建立連接 STREAM/DGRAM
CONNECTED 已連接的狀態 STREAM/DGRAM

iptables設置數據狀態規則

通過IP tables防火牆規則來理解數據包的狀態連接

主動連接:向遠程主機主動發起連接,數據包的狀態是NEW,再接收到的數據包狀態就是ESTABLISHED。

1 iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT   

2 iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT

3 iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT

4 iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT

netstat查看服務的連接狀態

常見參數 功能(socket,進程,服務,端口)
a 顯示所有端口(監聽和監聽的)
t 僅顯示tcp的端口連接
u 僅顯示udp相關的端口連接
l 僅列出處於listen(監聽)服務狀態的socket
p 現實建立連接的程序名稱和進程ID
r 現實路由信息,路由表
e 顯示擴展信息
s 按照協議來統計程序連接的數據狀態
c 每隔一段時間執行netstat命令
i 顯示網絡接口列表,像是ifconfig使用netstat -ie
#兩秒執行一次netstat查詢TCP協議連接的進程
[root@m01 ~]$netstat -tup -c 2
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0     52 localhost:ssh           localhost:54035         ESTABLISHED 7390/sshd: root@pts 
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 localhost:ssh           localhost:54035         ESTABLISHED 7390/sshd: root@pts 

傳輸層TCP/UDP

點對點的連接:通信雙方在同一鏈路上

端對端的連接:通信雙方通過電纜進行通信

TCP:面向連接,提供服務前建立專門的傳輸連接,並且這條連接可管理,在需要或通信結束時進行拆除。面向連接的傳輸服務是可靠的傳輸服務,提供擁塞控制、差錯控制和流量控制。

​ 其建立在不可靠的分組傳輸服務上,可能出現丟失、亂序、延遲、重複等等問題,因此,TCP必須使用三次握手、超時與重傳功能。

UDP:無連接,直接發送,不管是否送達,盡力而爲,速度比較快

tcp數據包頭

socket端到端的連接

​ 區分不同應用進程間的網絡通信和連接,實現數據傳輸的併發服務,TCP/IP通信中,應用程序把數據傳送給socket,由socket通過傳輸層向下提交給網路驅動程序並向網絡上發送出去。計算機從網絡上收到與該socket綁定IP地址和端號相關的數據後,由網絡驅動程序通過傳輸層向上提交給應用層的socket,最後應用程序從socket中提取所要接受的數據。

通過簡單的python代碼來說明socket數據傳輸

#server
import socket                      #導入socket模塊
sk = socket.socket()               #引用socket函數
sk.bind(("127.0.0.1",8080))        #綁定IP地址和端口
sk.listen()                        #監聽
conn,address = sk.accept()                          #獲取連接
conn.send("哈嘍客戶端,我是server".encode("utf-8"))    #向客戶端發送數據
msg = conn.recv(1024).decode("utf-8")               #接收客戶端信息
print(msg)
sk.close()

#client
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",8080))                        #連接到服務器端
msg = sk.recv(1024).decode("utf-8")                   #接收服務端數據
sk.send("你好server,我是client".encode("utf-8"))        #回覆服務端消息
print(msg)
sk.close()

TCP socket.socket():

​ 設置端口和地址;send()向服務器發送數據;recv()接受服務器數據;close()關閉套接字

UDP socket.socket(type=socket.SOCK_DGRAM):

​ 設置端口和地址;sendto()向服務器發送數據;recvfrom()接受服務器數據;close()關閉套接字

圖例說明:

socket

TCP連接狀態

TCP/IP連接

狀態 描述
CLOSED 呈阻塞、關閉狀態,表示主機當前沒有活動的傳輸連接或者正在進行傳輸連接
LISTEN 呈監聽狀態,表示服務器正在等待新的傳輸連接進入
SYN RCVD 表示主機已經收到一個傳輸連接請求,但尚未確認
SYN SENT 表示主機已經發出一個傳輸連接請求,等待對方確認
ESTABLISHED 傳輸連接建立,通信雙方進入正常的數據傳輸狀態
FIN WAIT 1 (主動關閉)主機已經發送關閉連接請求,等待對方確認
FIN WAIT2 (主動關閉)主機已經收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求
TIMED WAIT 完成雙向傳輸連接關閉,等待所有分組消失
CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認
CLOSE WAIT (被動關閉)收到對方發來的關閉傳輸連接請求,並已確認
LAST ACK (被動關閉)等待最後一個關閉傳輸連接確認,並等待所有分組消失
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章