簡(jiǎn)介
我們都知道 TCP 有建立連接時(shí)的三次握手和斷開連接時(shí)的四次揮手钩述,如上圖所示吊趾。這個(gè)過(guò)程具體怎么樣就不多說(shuō)了宛裕。
今天主要想討論一下,為什么 TCP 是三次握手论泛,四次揮手揩尸。
下面說(shuō)說(shuō)個(gè)人對(duì)這個(gè)問題的理解和總結(jié)。
三次握手
初始化 Seq
首先屁奏,TCP 的定位是全雙工的岩榆、支持半關(guān)閉的、可靠的傳輸協(xié)議。但是勇边,我們知道犹撒,網(wǎng)絡(luò)信道是不可靠的,隨時(shí)都有可能丟包粒褒、錯(cuò)包识颊、亂序。TCP 怎么在不可靠的網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的傳輸協(xié)議呢奕坟?
對(duì)于丟包祥款,TCP 的解決方案很簡(jiǎn)單,就是超時(shí)重傳执赡。
對(duì)于錯(cuò)包镰踏,TCP 通過(guò)檢查出錯(cuò)誤后直接丟棄(丟包)。
所以問題來(lái)了沙合,TCP 怎么知道哪些包需要重傳呢?TCP 又是怎么解決包亂序到達(dá)的問題呢跌帐?
這兩個(gè)問題都是通過(guò) seq 來(lái)實(shí)現(xiàn)的首懈,三次握手的過(guò)程就是雙方協(xié)商好初始的 seq。
解決亂序:通過(guò) seq 確定順序谨敛。
確定重傳: 接收方在 ACK 里帶上 seq 告訴發(fā)送方收到了哪些數(shù)據(jù)包究履。發(fā)送方超時(shí)就重發(fā)沒收到 ACK 的包。
通信雙方協(xié)商好一個(gè)初始 seq脸狸,至少需要一次 SYN 和 一次 ACK最仑。
由于 TCP 是全雙工的,所以 TCP 要協(xié)商兩個(gè)初始 seq炊甲,所以雙方各需要一次 SYN 和一次 ACK泥彤。
簡(jiǎn)單優(yōu)化,可以將中間的 ACK + SYN 合并卿啡。所以就變成了 TCP 建立連接的三次握手吟吝。
確認(rèn)全雙工信道
另外還有一點(diǎn)就是,由于網(wǎng)絡(luò)信道是不可靠的颈娜,通過(guò)三次握手剑逃,可以最低限度地確定雙方的信息是雙向可用的(全雙工)。
假設(shè)是 A 向 B 發(fā)起請(qǐng)求官辽。
第二次握手成功表明 A => B 沒問題蛹磺。
第三次握手成功表明 B => A 沒問題。
四次揮手
理解了三次握手同仆,四次揮手就不難理解了萤捆。上面講到,三次握手其實(shí)是由“四次握手”合并二、三次握手優(yōu)化而來(lái)的鳖轰。那為什么第二次揮手和第三次揮手不能像握手協(xié)議中進(jìn)行合并呢清酥?
原因是: TCP 要支持半關(guān)閉連接。
一開始建立的連接是全雙工的蕴侣,A <=> B 雙方都可以讀寫焰轻。支持半關(guān)閉意味著,TCP 支持 A 和 B 雙方獨(dú)立關(guān)閉通道昆雀。因此會(huì)有兩次獨(dú)立的關(guān)閉寫通道的請(qǐng)求辱志。一次關(guān)閉請(qǐng)求(FIN),對(duì)應(yīng)一個(gè) ACK狞膘。所以就有了四次揮手揩懒。
小結(jié)
TCP 需要三次握手的原因:
- 初始化雙方 seq。
- 確認(rèn)雙方信道可以實(shí)現(xiàn)最低限度的全雙工挽封。
TCP 需要四次揮手的原因:
- TCP 要支持半關(guān)閉連接已球。