TCP協議三次握手和四次揮手抓包分析

  • 2019 年 10 月 31 日
  • 筆記

1、TCP數據段格式

ACK TCP協議規定,只有ACK=1時有效,也規定連接建立後所有發送的報文的ACK必須為1

SYN(SYNchronization) :在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連接請求或連接接受報文。

synchronization [ˌsɪŋkrənaɪ'zeɪʃn] 同步

FIN (finis)即完,終結的意思,用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,並要求釋放連接。

finis ['faɪnɪs] 終結

2、三次握手連接

1.連接開始時,連接建立方(Client)發送SYN包,並包含了自己的初始序號x;

2.連接接受方(Server)收到SYN包以後會回復一個SYN包,其中包含了對上一個x包

的回應信息ACK,回應的序號為下一個希望收到包的序號,即x+1,然後還包含

了自己的初始序號y;

3.連接建立方(Client)收到回應的SYN包以後,回復一個ACK包做響應,其中包含了下一個希望收到包的序號即y+1。

3、斷開tcp連接時的4次揮手整體過程

1.當客戶A沒有東西要發送時就要釋放A這邊的連接,A會發送一個報文(沒有數據),其中FIN設置為1, seq=u。

2.服務器B收到後會給應用程序一個信,這時A那邊的連接已經關閉,即A不再發送信息(但仍可接收信息)。B會發送收一個報文,其中FIN設置為1, ack=u+1;A收到B的確認包後,進入等待狀態,等待B請求釋放連接。

3.服務器B向客戶A發送斷開連接請求,包中FIN=1,seq=w,ack = u+1。

4.A收到後回復一個確認信息,發送包,ack=w+1,並進入TIME_WAIT狀態。

4、使用tcpdump抓包查看tcp三次握手過程

4.1建立連接

 [root@docker-01 ~]# yum install tcpdump   [root@docker-01 ~]# ssh [email protected]   The authenticity of host '172.17.2.25 (172.17.2.25)'can't be established.   RSA key fingerprint is SHA256:TL1e8gsDl+uD+crlcfs29HkPbdQih4zzse6/Z0k3lFg.   RSA key fingerprint is MD5:5a:05:f9:bb:02:3d:05:55:cd:9a:14:0d:07:33:47:39.   Are you sure you want to continue connecting (yes/no)? ###到這裡就不用執行了,tcp已經建議連接

4.2查看數據包

 [root@docker-01 ~]# tcpdump -i eth0 -vn -t tcp port 22   tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144bytes   IP (tos 0x12,ECT(0), ttl 64, id 4546, offset 0, flags [DF], proto TCP (6), length 164)      172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], cksum 0xe49e (incorrect -> 0x05ea), seq 1290388542:1290388666, ack 1470871262, win 77, length 124   IP (tos 0x12,ECT(0), ttl 64, id 4547, offset 0, flags [DF], proto TCP (6), length 324)   ##如果需要看絕對序號,可以在tcpdump命令中加-S   [root@docker-01 ~]# tcpdump port 22 -c 3 -n -S   tcpdump: verbose output suppressed, use -vor -vvforfull protocol decode   listening on eth0, link-type EN10MB (Ethernet), capture size 262144bytes   07:17:20.781294 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663038:1290663226, ack 1470872398, win 77, length 188   07:17:20.781489 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663226:1290663398, ack 1470872398, win 77, length 172   07:17:20.781565 IP 172.17.120.50.ssh > 192.168.255.27.49589: Flags [P.], seq 1290663398:1290663570, ack 1470872398, win 77, length 172   3packets captured   3packets received by filter   0packets dropped by kernel

5、使用tcpdum抓取4次揮手數據包

 [root@docker-02 ~]# tcpdump port 22 -n -S   ##只看最後4個包就可以了   17:29:31.709503 IP 172.17.120.51.57533 > 192.168.255.27.ssh: Flags [F.], seq 2176876951, ack 247624733, win 164, options [nop,nop,TS val 10421058ecr 9186853], length 0   17:29:31.710515 IP 172.17.120.51.ssh > 192.168.255.27.57533: Flags [.], ack 2176876952, win 175, options [nop,nop,TS val 9186854ecr 10421058], length 0   17:29:31.743381 IP 172.17.120.51.ssh > 192.168.255.27.57533: Flags [F.], seq 247624733, ack 2176876952, win 175, options [nop,nop,TS val 9186858ecr 10421058], length 0   17:29:31.743433 IP 172.17.120.51.57533 > 192.168.255.27.ssh: Flags [.], ack 247624734, win 164, options [nop,nop,TS val 10421092ecr 9186858], length 0