TCP三次握手和四次分手

1.通過wireshark抓包看到

抓到的包和對應的協議層如下圖所示:


1. Frame:   物理層的數據幀概況
2. Ethernet II: 數據鏈路層以太網幀頭部信息
3. Internet Protocol Version 4: 互聯網層IP包頭部信息
4. Transmission Control Protocol:  傳輸層的數據段頭部信息,此處是TCP
5. Hypertext Transfer Protocol:  應用層的信息,此處是HTTP協議



2.TCP三次握手解析

請求百度鏈接,wireshark的抓包內容




1.第一次握手:客戶端發送一個SYN =1 和Seq =X 給服務器(一般 Seq =0)



2.第二次握手:服務器收到客戶端發送的報文後,由SYN=1知道客戶端要求建立聯機,向客戶端發送一個SYN=1,ACK =1(ACK=X+1=0+1=1) ,Seq=0的報文


3.第三次握手:客戶端收到服務器返回的報文後,檢測ACK是否確證(即是否爲第一次握手發出的 Seq+1,是否爲1),  若正確,客戶端再次發送確認包,ACK=1(ACK=Y+1),SYN爲0,Seq=1 ,服務端收到ACK=1後,連接成功,可以傳輸數據了





3.TCP四次分手解析

爲什麼TCP握手只要三次,而分手卻要四次呢?因爲當客戶端提出分手時,可能服務端還在傳輸數據,所以服務器在返回給客戶端ACK=1 時,還需要返回FIN



1.第一次分手:客戶端傳給服務器一個Seq =1 ,ACK=1 , FIN=1 的報文,用來關閉客戶端到服務端的數據傳輸


2.第二次分手:服務器收到FIN=1的報文後,知道客戶端要關閉連接,返回ACK=2(客戶端傳給服務端的Seq+1),Seq=1(客戶端傳給服務端的ACK值)



3.第三次分手:服務器關閉與客戶端的連接,返回客戶端一個FIN=1,ACK=2,Seq=1


4.第四次分手:客戶端收到服務端返回的FIN之後,返回ACK=2(服務端返回給客戶端的Seq+1),Seq=2(服務端返回給客戶端的ACK)



注意:自己之前抓包的時候,發現客戶端close掉連接後,服務端沒有立即返回FIN 數據包,這個原因是:

MSLMaximum Segment Lifetime英文的縮寫,中文可以譯爲“報文最大生存時間”,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄 2MSL即兩倍的MSLTCPTIME_WAIT狀態也稱爲2MSL等待狀態,當TCP的一端發起主動關閉,在發出最後一個ACK包後,即第3次握手完成後發送了第四次握手的ACK包後就進入了TIME_WAIT狀態,必須在此狀態上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最後一個ACK包對方沒收到,那麼對方在超時後將重發第三次握手的FIN包,主動關閉端接到重發的FIN包後可以再發一個ACK應答包。在TIME_WAIT狀態時兩端的端口不能使用,要等2MSL時間結束纔可繼續使用。當連接處於2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設置SO_REUSEADDR選項達到不必等待2MSL時間結束再使用此端口。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章