全稱
傳輸控制協(xié)議扛稽,Transmission Control Protocol
特點(diǎn)
- T C P提供一種面向連接的、可靠的字節(jié)流服務(wù)
- 面向連接意味著兩個(gè)使用T C P的應(yīng)用(通常是一個(gè)客戶和一個(gè)服務(wù)器悍汛,C/S)在彼此交換數(shù)據(jù)之前必須先建立一個(gè)T C P連接
- 一個(gè)T C P連接中捞魁,僅有兩方進(jìn)行彼此通信
可靠性(檢錯(cuò)、應(yīng)答確認(rèn)离咐、數(shù)據(jù)錯(cuò)誤處理)
- 應(yīng)用數(shù)據(jù)被分割成T C P認(rèn)為最適合發(fā)送的數(shù)據(jù)塊
- 當(dāng)T C P發(fā)出一個(gè)段后谱俭,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段宵蛀。如果不能及時(shí)收到一個(gè)確認(rèn)昆著,將重發(fā)這個(gè)報(bào)文段
- 當(dāng)T C P收到發(fā)自T C P連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)术陶。這個(gè)確認(rèn)不是立即發(fā)送凑懂,通常將推遲幾分之一秒
- T C P將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和梧宫,目的是檢測(cè)數(shù)據(jù)在傳輸過(guò)程中的任何變化接谨。如果收到段的檢驗(yàn)和有差錯(cuò), T C P將丟棄這個(gè)報(bào)文段和不確認(rèn)收到此報(bào)文段(希望發(fā)端超時(shí)并重發(fā))
- 如果必要塘匣, T C P將對(duì)收到的數(shù)據(jù)進(jìn)行重新排序脓豪,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層(IP層數(shù)據(jù)數(shù)據(jù)失序的影響)
- T C P的接收端必須丟棄重復(fù)的數(shù)據(jù)(IP層數(shù)據(jù)重復(fù)的影響)
- T C P還能提供流量控制。T C P連接的每一方都有固定大小的緩沖空間忌卤,C P的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)扫夜。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出
字節(jié)流服務(wù)( byte stream service)
兩個(gè)應(yīng)用程序通過(guò)T C P連接交換8 bit字節(jié)構(gòu)成的字節(jié)流。T C P不在字節(jié)流中插入記錄標(biāo)識(shí)符
TCP結(jié)構(gòu)
唯一的TCP連接历谍,每個(gè)T C P段都包含源端和目的端的端口號(hào),用于尋找發(fā)端和收端應(yīng)用進(jìn)程辣垒。這兩個(gè)值加上I P首部中的源端I P地址和目的端I P地址唯一確定一個(gè)T C P連接望侈。(有時(shí),一個(gè)I P地址和一個(gè)端口號(hào)也稱為一個(gè)插口( s o c k e t))
序號(hào)用來(lái)標(biāo)識(shí)從T C P發(fā)端向T C P收端發(fā)送的數(shù)據(jù)字節(jié)流勋桶,它表示在這個(gè)報(bào)文段中的的第一個(gè)數(shù)據(jù)字節(jié)(序號(hào)是32 bit的無(wú)符號(hào)數(shù)脱衙,序號(hào)到達(dá)23 2-1后又從0開始)
U R G 緊急指針( u rgent pointer)有效(見(jiàn)2 0 . 8節(jié))。
A C K 確認(rèn)序號(hào)有效例驹。
P S H 接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層捐韩。
R S T 重建連接。
S Y N 同步序號(hào)用來(lái)發(fā)起一個(gè)連接鹃锈。這個(gè)標(biāo)志和下一個(gè)標(biāo)志將在第1 8章介紹荤胁。
F I N 發(fā)端完成發(fā)送任務(wù)。
T C P的流量控制由連接的每一端通過(guò)聲明的窗口大小來(lái)提供屎债。窗口大小為字節(jié)數(shù)仅政,起始于確認(rèn)序號(hào)字段指明的值垢油,這個(gè)值是接收端正期望接收的字節(jié)。窗口大小是一個(gè)16 bit字段圆丹,因而窗口大小最大為6 5 5 3 5字節(jié)
檢驗(yàn)和覆蓋了整個(gè)的T C P報(bào)文段: T C P首部和T C P數(shù)據(jù)滩愁。這是一個(gè)強(qiáng)制性的字段,一定是由發(fā)端計(jì)算和存儲(chǔ)辫封,并由收端進(jìn)行驗(yàn)證
TCP連接的建立與終止
- 傳說(shuō)中的三次握手(建立)
請(qǐng)求端(通常稱為客戶)發(fā)送一個(gè)S Y N段指明客戶打算連接的服務(wù)器的端口硝枉,以及初始序號(hào)(I S N,在這個(gè)例子中為1 4 1 5 5 3 1 5 2 1)倦微。這個(gè)S Y N段為報(bào)文段1妻味。
服務(wù)器發(fā)回包含服務(wù)器的初始序號(hào)的S Y N報(bào)文段(報(bào)文段2)作為應(yīng)答。同時(shí)璃诀,將確認(rèn)序號(hào)設(shè)置為客戶的I S N加1以對(duì)客戶的S Y N報(bào)文段進(jìn)行確認(rèn)弧可。一個(gè)S Y N將占用一個(gè)序號(hào)蔑匣。
客戶必須將確認(rèn)序號(hào)設(shè)置為服務(wù)器的I S N加1以對(duì)服務(wù)器的S Y N報(bào)文段進(jìn)行確認(rèn)(報(bào)文段3)劣欢。
- 傳說(shuō)中的四次握手(終止)
?為什么多了一次裁良,不對(duì)稱凿将?
原因是,由T C P的半關(guān)閉(h a l f - c l o s e)造成的价脾,本來(lái)是全雙工通信(兩邊都能發(fā)送和接收)牧抵,而進(jìn)行FIN發(fā)送(接收到這個(gè)表示沒(méi)有數(shù)據(jù)了)
半關(guān)閉:T C P提供了連接的一端在結(jié)束它的發(fā)送后還能接收來(lái)自另一端數(shù)據(jù)的能力
TCP連接超時(shí)
所謂超時(shí),得有個(gè)參考時(shí)間吧侨把,當(dāng)然也得有個(gè)計(jì)時(shí)器件犀变!
一般新連接最長(zhǎng)請(qǐng)求時(shí)長(zhǎng)是75秒
TCP半關(guān)閉
作用就是,"我已經(jīng)完成了數(shù)據(jù)傳送秋柄,因此發(fā)送一個(gè)文件結(jié)束( F I N)給另一端获枝,但我還想接收另一端發(fā)來(lái)的數(shù)據(jù),直到它給我發(fā)來(lái)文件結(jié)束(F I N)"
握手的狀態(tài)來(lái)自那里骇笔?
TCP數(shù)據(jù)流
組成:塊數(shù)據(jù)(用戶數(shù)據(jù)) + 交互數(shù)據(jù)
交互數(shù)據(jù)(發(fā)送一個(gè)字符為例)
- 交互數(shù)據(jù)總是以小于最大報(bào)文段長(zhǎng)度的分組發(fā)送
- 經(jīng)受的時(shí)延確認(rèn)
- 機(jī)理:通常T C P在接收到數(shù)據(jù)時(shí)并不立即發(fā)送A C K省店;相反,它推遲發(fā)送笨触,以便將A C K與需要沿該方向發(fā)送的數(shù)據(jù)一起發(fā)送(有時(shí)稱這種現(xiàn)象為數(shù)據(jù)捎帶A C K)懦傍。絕大多數(shù)實(shí)現(xiàn)采用的時(shí)延為200 ms,也就是說(shuō)芦劣,T C P將以最大200 ms 的時(shí)延等待是否有數(shù)據(jù)一起發(fā)送粗俱。
-
目的:減少報(bào)文段的數(shù)目
經(jīng)受時(shí)延
- 用于這個(gè)處理的算法:N a g l e算法(廣域網(wǎng)環(huán)境下)
- 要求一個(gè)T C P連接上最多只能有一個(gè)未被確認(rèn)的未完成的小分組,在該分組的確認(rèn)到達(dá)之前不能發(fā)送其他的小分組虚吟。相反寸认, T C P收集這些少量的分組娱俺,并在確認(rèn)到來(lái)時(shí)以一個(gè)分組的方式發(fā)出去。
- 該算法的優(yōu)越之處在于它是自適應(yīng)的:確認(rèn)到達(dá)得越快废麻,數(shù)據(jù)也就發(fā)
送得越快
塊數(shù)據(jù)
- 使用的控制協(xié)議:滑動(dòng)窗口協(xié)議的另一種形式的流量控制方法荠卷。
- 允許發(fā)送方在停止并等待確認(rèn)前可以連續(xù)發(fā)送多個(gè)分組。由于發(fā)送方不必每發(fā)一個(gè)分組就停下來(lái)等待確認(rèn)烛愧,因此該協(xié)議可以加速數(shù)據(jù)的傳輸
- 窗口的變化(協(xié)議)
稱窗口左邊沿向右邊沿靠近為窗口合攏油宜。這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和確認(rèn)時(shí)。
當(dāng)窗口右邊沿向右移動(dòng)時(shí)將允許發(fā)送更多的數(shù)據(jù)怜姿,我們稱之為窗口張開慎冤。這種現(xiàn)象發(fā)生在另一端的接收進(jìn)程讀取已經(jīng)確認(rèn)的數(shù)據(jù)并釋放了T C P的接收緩存時(shí)。
當(dāng)右邊沿向左移動(dòng)時(shí)沧卢,我們稱之為窗口收縮蚁堤。Host Requirements RFC強(qiáng)烈建議不要使用這種方式。但T C P必須能夠在某一端產(chǎn)生這種情況時(shí)進(jìn)行處理但狭。
變化的小例
- 發(fā)送方不必發(fā)送一個(gè)全窗口大小的數(shù)據(jù)
- 來(lái)自接收方的一個(gè)報(bào)文段確認(rèn)數(shù)據(jù)并把窗口向右邊滑動(dòng)披诗。這是因?yàn)榇翱诘拇笮∈窍鄬?duì)于確認(rèn)序號(hào)
- 正如從報(bào)文段7到報(bào)文段8中變化的那樣,窗口的大小可以減小立磁,但是窗口的右邊沿卻不能夠向左移動(dòng)
- 接收方在發(fā)送一個(gè)A C K前不必等待窗口被填滿
......