一、TCP報文格式
在了解三次握手和四次揮手之前,先知道TCP報文內部包含了哪些東西。
-
TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP唯一確定一條TCP連接。TCP在發送數據前必須在彼此間建立連接,這里連接意思是:雙方需要內保存對方信息(例如:IP,Port…)
-
報文主要段的意思
序號:表示發送的數據字節流,確保TCP傳輸有序,對每個字節編號
確認序號:發送方期待接收的下一序列號,接收成功后的數據字節序列號加 1。只有ACK=1時才有效。
ACK:確認序號的標志,ACK=1表示確認號有效,ACK=0表示報文不含確認序號信息
SYN:連接請求序號標志,用於建立連接,SYN=1表示請求連接
FIN:結束標志,用於釋放連接,為1表示關閉本方數據流
二、“三次握手”
2.1 三次握手過程
建立TCP連接時,需要客戶端和服務器共發送3個包。
-
第一次:客戶端發送初始序號x和syn=1請求標志
-
第二次:服務器發送請求標志syn,發送確認標志ACK,發送自己的序號seq=y,發送客戶端的確認序號ack=x+1
-
第三次:客戶端發送ACK確認號,發送自己的序號seq=x+1,發送對方的確認號ack=y+1
2.2 三次握手過程分析:
- 第一次:客戶端發送請求到服務器,服務器知道客戶端發送,自己接收正常。SYN=1,seq=x
- 第二次:服務器發給客戶端,客戶端知道自己發送、接收正常,服務器接收、發送正常。ACK=1,ack=x+1,SYN=1,seq=y
- 第三次:客戶端發給服務器:服務器知道客戶端發送,接收正常,自己接收,發送也正常.seq=x+1,ACK=1,ack=y+1
上面分析過程可以看出,握手兩次達不到讓雙方都得出自己、對方的接收、發送能力都正常的結論的。
三、 “四次揮手”
3.1 四次揮手過程
- 第一次揮手:客戶端發出釋放FIN=1,自己序列號seq=u,進入FIN-WAIT-1狀態
- 第二次揮手:服務器收到客戶端的后,發出ACK=1確認標志和客戶端的確認號ack=u+1,自己的序列號seq=v,進入CLOSE-WAIT狀態
- 第三次揮手:客戶端收到服務器確認結果后,進入FIN-WAIT-2狀態。此時服務器發送釋放FIN=1信號,確認標志ACK=1,確認序號ack=u+1,自己序號seq=w,服務器進入LAST-ACK(最后確認態)
- 第四次揮手:客戶端收到回復后,發送確認ACK=1,ack=w+1,自己的seq=u+1,客戶端進入TIME-WAIT(時間等待)。客戶端經過2個最長報文段壽命后,客戶端CLOSE;服務器收到確認后,立刻進入CLOSE狀態。
3.2四次揮手過程分析
- 第一次:客戶端請求斷開FIN,seq=u
- 第二次:服務器確認客戶端的斷開請求ACK,ack=u+1,seq=v
- 第三次:服務器請求斷開FIN,seq=w,ACK,ack=u+1
- 第四次:客戶端確認服務器的斷開ACK,ack=w+1,seq=u+1
四、其他問題
4.1為什么三次握手和四次揮手?
- 三次握手時,服務器同時把ACK和SYN放在一起發送到了客戶端那里
- 四次揮手時,當收到對方的 FIN 報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方是否現在關閉發送數據通道,需要上層應用來決定,因此,己方 ACK 和 FIN 一般都會分開發送。
4.2為什么客戶端最后還要等待2MSL?
- 客戶端需要保證最后一次發送的ACK報文到服務器,如果服務器未收到,可以請求客戶端重發,這樣客戶端還有時間再發,重啟2MSL計時。
補充
參考:https://blog.csdn.net/u010918487/article/details/87207531