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