TCP 運輸連接管理
運輸連接有三個階段:
連接建立
數(shù)據(jù)傳送
連接釋放
三次握手
TCP 建立連接的過程叫做握手。
握手需要在客戶和服務(wù)器之間交換三個 TCP 報文段俄周。稱之為三報文握手崎弃。采用三報文握手主要是為了防止已失效的連接請求報文段突然又傳送到了想括,因而產(chǎn)生錯誤儡陨。
A 的 TCP 向 B 發(fā)出連接請求報文段司致,其首部中的同步位 SYN = 1煞躬,并選擇序號 seq = x肛鹏,表明傳送數(shù)據(jù)時的第一個數(shù)據(jù)字節(jié)的序號是 x。
B 的 TCP 收到連接請求報文段后恩沛,如同意在扰,則發(fā)回確認(rèn)。B 在確認(rèn)報文段中應(yīng)使 SYN = 1雷客,使 ACK = 1芒珠,其確認(rèn)號 ack = x + 1,自己選擇的序號 seq = y佛纫。
A 收到此報文段后向 B 給出確認(rèn)妓局,其 ACK = 1,確認(rèn)號 ack = y + 1呈宇。A 的 TCP 通知上層應(yīng)用進(jìn)程好爬,連接已經(jīng)建立。
B 的 TCP 收到主機 A 的確認(rèn)后甥啄,也通知其上層應(yīng)用進(jìn)程:TCP 連接已經(jīng)建立存炮。
* 第一次握手:建立連接時,客戶端發(fā)送 syn 包(syn = j)到服務(wù)器蜈漓,
并進(jìn)入 SYN_SENT 狀態(tài)穆桂,等待服務(wù)器確認(rèn);
SYN:同步序列編號(Synchronize Sequence Numbers)融虽。
* 第二次握手:服務(wù)器收到 syn 包享完,必須確認(rèn)客戶的 SYN(ack = j + 1),
同時自己也發(fā)送一個 SYN 包(syn = k)有额,即 SYN + ACK 包般又,
此時服務(wù)器進(jìn)入 SYN_RECV 狀態(tài)彼绷;
* 第三次握手:客戶端收到服務(wù)器的 SYN + ACK 包,
向服務(wù)器發(fā)送確認(rèn)包 ACK (ack = k + 1)茴迁,此包發(fā)送完畢寄悯,
客戶端和服務(wù)器進(jìn)入 ESTABLISHED(TCP 連接成功)狀態(tài),完成三次握手堕义。
握手的目的是什么猜旬?
握手的目的是為了防止已失效的連接請求報文段突然又傳送到了,因而產(chǎn)生錯誤倦卖。比如一個客戶端發(fā)出一個連接請求報文雖然沒有丟失洒擦,但是由于一些原因在在某個網(wǎng)絡(luò)節(jié)點中長時間滯留,以至于在斷開連接后才到達(dá)服務(wù)端糖耸。這本身就是一個已經(jīng)失效的報文秘遏。但是服務(wù)器誤以為是客戶端的又一個新的請求。假設(shè)沒有三次握手那么只要服務(wù)端發(fā)出確認(rèn)鏈接就建立了嘉竟。由于客戶端也沒有給服務(wù)端發(fā)請求邦危,因此也不回復(fù)服務(wù)端的確認(rèn)。但是服務(wù)端確認(rèn)為新的連接開始了舍扰,等待客戶端發(fā)數(shù)據(jù)倦蚪。這樣就容易造成服務(wù)端的資源的浪費。采用三次握手可以防止這種情況發(fā)生边苹。
四次揮手
數(shù)據(jù)傳輸結(jié)束后陵且,通信的雙方都可釋放連接。TCP 連接釋放過程是四報文握手个束。
數(shù)據(jù)傳輸結(jié)束后慕购,通信的雙方都可釋放連接。現(xiàn)在 A 的應(yīng)用進(jìn)程先向其 TCP 發(fā)出連接釋放報文段茬底,并停止再發(fā)送數(shù)據(jù)沪悲,主動關(guān)閉 TCP 連接。A 把連接釋放報文段首部的 FIN = 1阱表,其序號 seq = u殿如,等待 B 的確認(rèn)。
B 發(fā)出確認(rèn)最爬,確認(rèn)號 ack = u + 1涉馁,而這個報文段自己的序號 seq = v。TCP 服務(wù)器進(jìn)程通知高層應(yīng)用進(jìn)程爱致。從 A 到 B 這個方向的連接就釋放了烤送,TCP 連接處于半關(guān)閉狀態(tài)。B 若發(fā)送數(shù)據(jù)糠悯,A 仍要接收帮坚。
若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù)牢裳,其應(yīng)用進(jìn)程就通知 TCP 釋放連接。
A 收到連接釋放報文段后叶沛,必須發(fā)出確認(rèn)。
在確認(rèn)報文段中 ACK = 1忘朝,確認(rèn)號 ack = w + 1灰署,自己的序號 seq = u + 1。
對于一個已經(jīng)建立的連接局嘁,TCP使用改進(jìn)的三次握手來釋放連接
(使用一個帶有 FIN 附加標(biāo)記的報文段)溉箕。TCP 關(guān)閉連接的步驟如下:
* 第一步,當(dāng)主機 A 的應(yīng)用程序通知 TCP 數(shù)據(jù)已經(jīng)發(fā)送完畢時悦昵,
TCP 向主機 B 發(fā)送一個帶有 FIN 附加標(biāo)記的報文段(FIN 表示英文 finish)肴茄。
* 第二步,主機 B 收到這個 FIN 報文段之后但指,并不立即用 FIN 報文段回復(fù)主機 A寡痰,
而是先向主機 A 發(fā)送一個確認(rèn)序號 ACK,同時通知自己相應(yīng)的應(yīng)用程序:
對方要求關(guān)閉連接(先發(fā)送 ACK 的目的是為了防止在這段時間內(nèi)棋凳,對方重傳 FIN 報文段)拦坠。
* 第三步,主機 B 的應(yīng)用程序告訴 TCP:
我要徹底的關(guān)閉連接剩岳,TCP 向主機 A 送一個 FIN 報文段贞滨。
* 第四步,主機 A 收到這個 FIN 報文段后拍棕,
向主機 B 發(fā)送一個 ACK 表示連接徹底釋放晓铆。
為什么 A 必須等待 2MSL 的時間?
為了保證 A 發(fā)送的最后一個 ACK 報文段能夠到達(dá) B绰播。
防止 “已失效的連接請求報文段” 出現(xiàn)在本連接中骄噪。A 在發(fā)送完最后一個 ACK 報文段后,再經(jīng)過時間 2MSL幅垮,就可以使本連接持續(xù)的時間內(nèi)所產(chǎn)生的所有報文段腰池,都從網(wǎng)絡(luò)中消失。這樣就可以使下一個新的連接中不會出現(xiàn)這種舊的連接請求報文段忙芒。
為什么握手三次示弓,揮手四次?
三次握手
因為要保證信道的可靠呵萨,就需要雙方溝通并且達(dá)成一致奏属。而要解決這個問題 3 次是最小值。四次揮手
因為 TCP 連接是全雙工的潮峦,因此每個方向都必須單獨的斷開連接客戶端申請斷開連接囱皿,只是不再發(fā)送數(shù)據(jù)勇婴,還能接收數(shù)據(jù)。需要等待服務(wù)端將數(shù)據(jù)發(fā)送完畢后嘱腥,等待服務(wù)端申請斷開連接耕渴。