TCP(Transmission Control Protocol 傳輸控制協議)協議的作用是爲了確保數據傳輸的可靠性;爲了更容易傳送大數據,使用了字節流服務(Byte Stream Service)將大塊數據分割成報文段(segment)爲單位的數據包進行管理和傳輸;而且TCP協議能夠確認數據最終是否送達到對方。
爲了準確無誤的將數據送達目標處,TCP採用了三次握手(three-way handshaking)的策略。用TCP協議把數據包送出去後,TCP會向對方確認數據是否成功送達。握手過程中使用了TCP的標誌(flag)——SYN(synchronize)和ACK(acknowledgement)。
三次握手步驟:
- 服務器B處於LISTEN(監聽)狀態,等待來自客戶機A的連接請求。
- 客戶機A向服務器B發送連接請求報文SYN。
- 服務器B收到客戶機A發來的請求報文SYN,如果同意建立連接,則向客戶機A連接確認報文SYN ACK。
- 客戶機A收到連接確認報文SYN ACK後,還要向服務器B發出確認報文ACK。
- 服務器B收到確認報文ACK後,連接建立完成。
若在握手過程中某個階段莫名中斷,TCP協議會再次以相同的順序發送相同的數據包。
四次揮手:
FIN:FINISH
MSL:Maximum Segment Lifetime(報文最大生存時間):他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。
TIME-WAIT
客戶端收到服務器端的FIN連接釋放報文後進入此狀態,而不是直接進入CLOSED狀態,還需要等待一個時間計時器設置的時間2MSL;這麼做的理由有兩個:
- 確保最後一個確認報文ACK能夠達到。如果服務器端沒有收到客戶端發來的確認報文ACK那麼久需要從新發送連接釋放請求報文FIN,客戶端等待一段時間就是爲了處理這種情況的發送。
- 等待一段時間是爲了讓本次連接持續時間內產生的所有報文都從網絡中消失,使得下一個新的連接不會出現舊的連接請求報文SYN,從而錯誤打開連接。
四次揮手的過程:
- 客戶機A發送連接釋放報文FIN。
- 服務器B收到FIN之後發出確認ACK,此時TCP屬於半關閉狀態,服務器B能想客戶機A發送數據但是客戶機A不能向服務器B發送數據。
- 當服務器B不在需要連接時,發送連接釋放報文FIN。
- 客戶機A收到FIN後發出確認ACK,進入TIME-WAIT狀態,等待2倍的MSL(最大報文存活時間)後釋放連接。
- 服務器B收到ACK後釋放連接。
四次揮手的原因:
客戶端發送了FIN連接釋放報文之後,服務器端收到了這個報文,就進入了CLOSE-WAIT狀態。這個狀態是爲了讓服務器端發送還未完畢的數據,傳送完畢之後,服務器端會發送FIN連接釋放報文。