爲何創建TCP鏈接須要三次握手,爲何斷開TCP鏈接須要四次握手,TIME_WAIT狀態的意義

爲何創建TCP鏈接須要三次握手?

緣由:爲了應對網絡中存在的延遲的重複數組的問題

例子:

假設client發起鏈接的鏈接請求報文段在網絡中沒有丟失,而是在某個網絡節點長時間滯留了,致使延遲到達server。原本這是一個已經失效的鏈接報文,可是server接收到這個鏈接報文以後,誤認爲client發起了新的鏈接,因而向client發送確認報文段。此時由於沒有了鏈接的3次握手,client不會對server的確認報文做出迴應,也不會向server發送數據,server就覺得鏈接已經創建,一直在空等client的數據,這樣server的這一部分網絡資源就被浪費了。數組

爲何斷開TCP鏈接須要進行四次握手 ?

由於TCP鏈接是全雙工的網絡協議,容許同時通訊的雙方同時進行數據的收發,一樣也容許收發兩個方向的鏈接被獨立關閉,以免client數據發送完畢,向server發送FIN關閉鏈接,而server還有發送到client的數據沒有發送完畢的狀況。因此關閉TCP鏈接須要進行四次握手,每次關閉一個方向上的鏈接須要FIN和ACK兩次握手。網絡

TIME_WAIT狀態的意義

在TCP鏈接中,當被動關閉鏈接的一方(圖中client)發送的FIN報文到達時,被動關閉鏈接的一方會發送ACK確認報文,而且進入TIME_WAIT狀態,而且等待2MSL時間段(MSL:maximum segment life)。這麼作有下述兩個緣由:tcp

  1. 被動關閉鏈接的一方(圖中的server)在一段時間內沒有收到對方的ACK確認數據包,會從新發送FIN數據包,於是主動關閉鏈接的一方須要停留在等待狀態以處理對方從新發送的FIN數據包。不然他會迴應一個RST數據包給被動關閉鏈接的一方,使得對方莫名其妙。server

  2. 在TIME_WAIT狀態下,不容許應用程序在當前ip和端口上和以前通訊的client(這個client的ip和端口號不變)創建一個新的鏈接。這樣就能避免新的鏈接收到以前的ip和端口一致的鏈接殘存在網絡中的數據包。這也是TIME_WAIT狀態的等待時間被設置爲2MSL的緣由,以確保網絡上當前鏈接兩個方向上還沒有接收的TCP報文已經所有消失。blog

相關文章
相關標籤/搜索