為什么建立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)。這么做有下述兩個原因:
-
被動關閉連接的一方(圖中的server)在一段時間內沒有收到對方的ACK確認數據包,會重新發送FIN數據包,因而主動關閉連接的一方需要停留在等待狀態以處理對方重新發送的FIN數據包。否則他會回應一個RST數據包給被動關閉連接的一方,使得對方莫名其妙。
-
在TIME_WAIT狀態下,不允許應用程序在當前ip和端口上和之前通信的client(這個client的ip和端口號不變)建立一個新的連接。這樣就能避免新的連接收到之前的ip和端口一致的連接殘存在網絡中的數據包。這也是TIME_WAIT狀態的等待時間被設置為2MSL的原因,以確保網絡上當前連接兩個方向上尚未接收的TCP報文已經全部消失。