TCP 連接建立
通過三次握手
服務(wù)器 執(zhí)行 LISTEN 和 ACCEPT 原語
然后等待入境連接請求
客戶端 執(zhí)行CONNECT原語 同時希望連接的IP地址與端口 愿意接受的最大TCP段長
以及一些可選的用戶數(shù)據(jù)等參數(shù)
CONNECT原語發(fā)送一個SYN標(biāo)志位置為on和ACK標(biāo)志位置為off的TCP段
然后等待服務(wù)器響應(yīng)
TCP連接釋放
為了釋放一個TCP連接 任意一方都可以發(fā)送一個設(shè)置了FIN標(biāo)志位的TCP段
表示沒有數(shù)據(jù)需要發(fā)送了
當(dāng)FIN段被另一個方向確認(rèn)后 這個方向上的連接就被關(guān)閉 不再發(fā)送任何數(shù)據(jù) 當(dāng)然 另一個方向上或許還在繼續(xù)著無線的數(shù)據(jù)流
當(dāng)兩個方向都關(guān)閉后 連接才算被徹底釋放
TCP 連接管理模型
建立連接和釋放連接所需要的步驟都可以用一個有限狀態(tài)機來表示
CLOSE 沒有活躍的連接或者掛起
LISTEN 服務(wù)器等待入境呼叫
SYN RCVD 到達(dá)一個連接請求; 等待ACK
SYN SEND 應(yīng)用以及啟動了打開一個連接
ESTABLISHEND 正常的數(shù)據(jù)傳送狀態(tài)
FIN WAIT1 應(yīng)用沒有數(shù)據(jù)要發(fā)送
FIN WAIT2 另一端同意釋放連接
TIME WAIT 等待所有數(shù)據(jù)包壽終正寢
CLOSEING 兩段同時試圖關(guān)閉連接
CLOSE WAIT 另一端已經(jīng)發(fā)起關(guān)閉連接
LAST ACK 等待所有數(shù)據(jù)包壽終正寢
TCP滑動窗口
假設(shè)接收端有2K的緩沖區(qū) 發(fā)送端發(fā)送了1K的數(shù)據(jù) 并且該數(shù)據(jù)段被成功接受 那么接收端將確認(rèn)該數(shù)據(jù)段
然而 由于接收端只剩下1K的緩沖區(qū)(在應(yīng)用程序從緩沖區(qū)中取走數(shù)據(jù)之前)
它將宣告下一個期望字節(jié)開始窗口為1K(TCP段頭中包含序號和確認(rèn)號 確認(rèn)號指定下一個期望的字節(jié))
現(xiàn)在發(fā)送端發(fā)送了另一個1K的數(shù)據(jù)段 該段被確認(rèn)了 但是接收端宣告的窗口大小變?yōu)?
因此 發(fā)送端不得不停止發(fā)送 等待接受主機上的應(yīng)用進(jìn)程從緩沖區(qū)中取走一些數(shù)據(jù) 以便接收端重新宣告寫一個期望的字節(jié)和窗口大小
這種數(shù)據(jù)包稱為窗口探測 TCP標(biāo)準(zhǔn)明確提供該選項 以防止窗口更新數(shù)據(jù)包丟失后發(fā)生死鎖
TCP可以緩沖數(shù)據(jù)來提高傳輸性能
當(dāng)直到自己有4K的窗口可用時 當(dāng)接受到2K的數(shù)據(jù)時 可以延遲發(fā)送 等到另一個2K的數(shù)據(jù)到來時
發(fā)送一個包含4KB有效載荷的段
Nagle 算法
第一次發(fā)送數(shù)據(jù)包之后將其余后面的字節(jié)緩沖起來 等到發(fā)送出去的字節(jié)包被確認(rèn)
再將緩沖的字節(jié)包發(fā)送出去 再緩沖接受到的數(shù)據(jù)包
這樣可以大大降低數(shù)據(jù)包發(fā)送所需要的帶寬
因為TCP需要發(fā)送大量的IP數(shù)據(jù)報和TCP頭 而數(shù)據(jù)可能只有一點點
低能窗口綜合癥
Clark
當(dāng)接受端的TCP緩沖區(qū)滿時 發(fā)送方也知道
當(dāng)接收端的TCP緩沖區(qū)擁有了一個字節(jié)的空間時 接收端便會發(fā)送一個窗口更新的字段來告訴發(fā)送端發(fā)送一個字節(jié)的
TCP端 發(fā)送方再次發(fā)送一個字節(jié)來 接收方緩沖區(qū)便又滿了
這將導(dǎo)致效率低下
Clark的解決方案是禁止發(fā)送一個字節(jié)的窗口更新段 并且強制接收端必須等待到擁有了一定數(shù)量
的可用空間后再通告給對方