TCP 運輸連接管理
運輸連接有三個階段:
連接建立
數據傳送
連接釋放
三次握手
TCP 建立連接的過程叫做握手。
握手需要在客戶和服務器之間交換三個 TCP 報文段。稱之為三報文握手。采用三報文握手主要是為了防止已失效的連接請求報文段突然又傳送到了,因而產生錯誤。
A 的 TCP 向 B 發出連接請求報文段,其首部中的同步位 SYN = 1,并選擇序號 seq = x,表明傳送數據時的第一個數據字節的序號是 x。
B 的 TCP 收到連接請求報文段后,如同意,則發回確認。B 在確認報文段中應使 SYN = 1,使 ACK = 1,其確認號 ack = x + 1,自己選擇的序號 seq = y。
A 收到此報文段后向 B 給出確認,其 ACK = 1,確認號 ack = y + 1。A 的 TCP 通知上層應用進程,連接已經建立。
B 的 TCP 收到主機 A 的確認后,也通知其上層應用進程:TCP 連接已經建立。
* 第一次握手:建立連接時,客戶端發送 syn 包(syn = j)到服務器,
并進入 SYN_SENT 狀態,等待服務器確認;
SYN:同步序列編號(Synchronize Sequence Numbers)。
* 第二次握手:服務器收到 syn 包,必須確認客戶的 SYN(ack = j + 1),
同時自己也發送一個 SYN 包(syn = k),即 SYN + ACK 包,
此時服務器進入 SYN_RECV 狀態;
* 第三次握手:客戶端收到服務器的 SYN + ACK 包,
向服務器發送確認包 ACK (ack = k + 1),此包發送完畢,
客戶端和服務器進入 ESTABLISHED(TCP 連接成功)狀態,完成三次握手。
握手的目的是什么?
握手的目的是為了防止已失效的連接請求報文段突然又傳送到了,因而產生錯誤。比如一個客戶端發出一個連接請求報文雖然沒有丟失,但是由于一些原因在在某個網絡節點中長時間滯留,以至于在斷開連接后才到達服務端。這本身就是一個已經失效的報文。但是服務器誤以為是客戶端的又一個新的請求。假設沒有三次握手那么只要服務端發出確認鏈接就建立了。由于客戶端也沒有給服務端發請求,因此也不回復服務端的確認。但是服務端確認為新的連接開始了,等待客戶端發數據。這樣就容易造成服務端的資源的浪費。采用三次握手可以防止這種情況發生。
四次揮手
數據傳輸結束后,通信的雙方都可釋放連接。TCP 連接釋放過程是四報文握手。
數據傳輸結束后,通信的雙方都可釋放連接?,F在 A 的應用進程先向其 TCP 發出連接釋放報文段,并停止再發送數據,主動關閉 TCP 連接。A 把連接釋放報文段首部的 FIN = 1,其序號 seq = u,等待 B 的確認。
B 發出確認,確認號 ack = u + 1,而這個報文段自己的序號 seq = v。TCP 服務器進程通知高層應用進程。從 A 到 B 這個方向的連接就釋放了,TCP 連接處于半關閉狀態。B 若發送數據,A 仍要接收。
若 B 已經沒有要向 A 發送的數據,其應用進程就通知 TCP 釋放連接。
A 收到連接釋放報文段后,必須發出確認。
在確認報文段中 ACK = 1,確認號 ack = w + 1,自己的序號 seq = u + 1。
對于一個已經建立的連接,TCP使用改進的三次握手來釋放連接
(使用一個帶有 FIN 附加標記的報文段)。TCP 關閉連接的步驟如下:
* 第一步,當主機 A 的應用程序通知 TCP 數據已經發送完畢時,
TCP 向主機 B 發送一個帶有 FIN 附加標記的報文段(FIN 表示英文 finish)。
* 第二步,主機 B 收到這個 FIN 報文段之后,并不立即用 FIN 報文段回復主機 A,
而是先向主機 A 發送一個確認序號 ACK,同時通知自己相應的應用程序:
對方要求關閉連接(先發送 ACK 的目的是為了防止在這段時間內,對方重傳 FIN 報文段)。
* 第三步,主機 B 的應用程序告訴 TCP:
我要徹底的關閉連接,TCP 向主機 A 送一個 FIN 報文段。
* 第四步,主機 A 收到這個 FIN 報文段后,
向主機 B 發送一個 ACK 表示連接徹底釋放。
為什么 A 必須等待 2MSL 的時間?
為了保證 A 發送的最后一個 ACK 報文段能夠到達 B。
防止 “已失效的連接請求報文段” 出現在本連接中。A 在發送完最后一個 ACK 報文段后,再經過時間 2MSL,就可以使本連接持續的時間內所產生的所有報文段,都從網絡中消失。這樣就可以使下一個新的連接中不會出現這種舊的連接請求報文段。
為什么握手三次,揮手四次?
三次握手
因為要保證信道的可靠,就需要雙方溝通并且達成一致。而要解決這個問題 3 次是最小值。四次揮手
因為 TCP 連接是全雙工的,因此每個方向都必須單獨的斷開連接客戶端申請斷開連接,只是不再發送數據,還能接收數據。需要等待服務端將數據發送完畢后,等待服務端申請斷開連接。