[轉]TCP三次握手詳細分析


tcp相關:

TCP(Transmission Control Protocol) 傳輸控制協議

TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接:

位碼即tcp標志位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)

Sequence number(順序號碼) Acknowledge number(確認號碼)

 

tcp的三次握手:

第一次握手:主機A發送位碼syn取值為1來建立連接(即syn=1),並且隨機產生seq number取值任意(即seq number=1234567)的數據包到服務器。

第二次握手:主機B收到請求后,檢查數據包發現SYN=1得知,A要求建立聯機。然后向A發送syn+ack包取值都為1(即yn=1,ack=1),並且ack number=(主機A的seq+1),隨機產生seq=7654321的包。

第三次握手:主機A收到后檢查ack number是否為自己上次發送的seq numer+1,並且確認數據包里面ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。

完成三次握手,主機A與主機B開始傳送數據。

 

tcp/ip的三次握手:
在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。 
第一次握手:建立連接時,客戶端發送syn=j的建立連接數據包到服務器,並進入SYN_SEND狀態,等待服務器確認。
第二次握手:服務器收到syn包,必須確認客戶的SYN,然后發回ack=j+1的ACK確認包,同時發送一個syn=k的SYN建立連接數據包,即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據。

 

tcpdump抓包分析:

1 Mint-ThinkPad-Edge wyy # tcpdump -i wlan0 tcp
2 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
3 listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
4 23:48:14.576489 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [S], seq 2876099301, win 14600, options [mss 1460,sackOK,TS val 5957112 ecr 0,nop,wscale 4], length 0
5 23:48:14.591469 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [S.], seq 2879119328, ack 2876099302, win 5792, options [mss 1440,sackOK,TS val 4205016500 ecr 5957112,nop,wscale 7], length 0
6 23:48:14.591517 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [.], ack 1, win 913, options [nop,nop,TS val 5957116 ecr 4205016500], length 0
7 23:48:14.847849 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [P.], seq 1:992, ack 1, win 913, options [nop,nop,TS val 5957180 ecr 4205016500], length 991
8 23:48:14.877899 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [.], ack 992, win 61, options [nop,nop,TS val 4205016787 ecr 5957180], length 0

這里的4-6行分別是三次握手的過程。

    第4行:第一次握手:

 23:48:14.576489 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [S], seq 2876099301, win 14600, options [mss 1460,sackOK,TS val 5957112 ecr 0,nop,wscale 4], length 0

這里可以看到本機通過40021端口發送數據到122.225.11.137這個ip的web端口,Flags是[S],表明是syn建立連接包,seq是2876099301。這就是第一次握手:client發送syn請求建立連接包。

    第5行:第二次握手:

23:48:14.591469 IP 122.225.11.137.http > Mint-ThinkPad-Edge.local.40021: Flags [S.], seq 2879119328, ack 2876099302, win 5792, options [mss 1440,sackOK,TS val 4205016500 ecr 5957112,nop,wscale 7], length 0

這里可以看到122.225.11.137此ip通過web端口發回到本機40021端口,Flags是[S. ],表明是syn包和未知包,后面看到seq 和ack,說明未知包是ack確認包。ack是2876099302,剛好等於第四行的seq+1。還可看到seq 2879119328。這就是第二次握手:server回應給client的ack+syn確認建立連接包。

    第6行:第三次握手:

23:48:14.591517 IP Mint-ThinkPad-Edge.local.40021 > 122.225.11.137.http: Flags [.], ack 1, win 913, options [nop,nop,TS val 5957116 ecr 4205016500], length 0

這里可以看到本機通過40021端口連接122.225.11.137的web端口,Flags是[ . ]未知,后面可以看到ack確認包。

 

總結:

tcpdump里面抓tcp三次握手,看Flags標志依次是[S] [S . ] [ . ]基本就可以確認是一次完整的三次握手,分別是:client發的建立連接包,server回復的ack+syn確認連接包,還有client再次發送的ack確認包。

tcpdump可以加 --v參數察看詳細解碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM