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