TCP協(xié)議詳解
一、TCP協(xié)議
1、TCP 通過(guò)以下方式提供可靠性:
· ◆ 應(yīng)用程序分割為TCP認(rèn)為最合適發(fā)送的數(shù)據(jù)塊。由TCP傳遞給IP的信息單位叫做報(bào)文段。
· ◆ 當(dāng)TCP發(fā)出一個(gè)報(bào)文段后,它啟動(dòng)一個(gè)定時(shí)器,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能記時(shí)收到一個(gè)確認(rèn),它 就重發(fā)這個(gè)報(bào)文段。
· ◆ 當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)。這個(gè)確認(rèn)不是立即發(fā)送,通常延遲幾分之一秒。
· ◆ TCP將保持它首部和數(shù)據(jù)的檢驗(yàn)和。這是一個(gè)端到端的檢驗(yàn)和,目的是檢測(cè)數(shù)據(jù)在傳輸過(guò)程中的任何變化如果收到報(bào)文段的檢驗(yàn)和有差錯(cuò),TCP將丟棄這個(gè)報(bào)文段和不確認(rèn)收到這個(gè)報(bào)文段。
· ◆ 既然TCP報(bào)文段作為IP數(shù)據(jù)報(bào)來(lái)傳輸,而IP數(shù)據(jù)報(bào)的到達(dá)可能失序,因此TCP報(bào)文段的到達(dá)也可能失序。如果必要,TCP將對(duì)收到的數(shù)據(jù)進(jìn)行排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。
· ◆ 既然IP數(shù)據(jù)報(bào)會(huì)發(fā)生重復(fù),TCP連接端必須丟棄重復(fù)的數(shù)據(jù)。
· ◆ TCP還能提供流量控制,TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這將防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出。
另外,TCP對(duì)字節(jié)流的內(nèi)容不作任何解釋。
2、TCP首部:
TCP數(shù)據(jù)被封裝在一個(gè)IP數(shù)據(jù)報(bào)中,格式如下:
IP首部20 | TCP首部20 | TCP首部 |
TCP首部格式如下:
16位源端口號(hào) | 16位目的端口號(hào) | |||||||
32位序號(hào) | ||||||||
32位確認(rèn)序號(hào) | ||||||||
4位首部長(zhǎng)度 | 保留6位 | U | A | P | R | S | F | 16位窗口大小 |
16位檢驗(yàn)和 | 16位緊急指針 | |||||||
選項(xiàng) | ||||||||
數(shù)據(jù) | ||||||||
說(shuō)明:
(1)每個(gè)TCP段都包括源端和目的端的端口號(hào),用于尋找發(fā)送端和接收端的應(yīng)用進(jìn)程。這兩個(gè)值加上IP首部的源端IP地址和目的端IP地址唯一確定一個(gè)TCP連接。
(2)序號(hào)用來(lái)標(biāo)識(shí)從TCP發(fā)送端向接收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的第一個(gè)數(shù)據(jù)字節(jié)。如果將字節(jié)流看作在兩個(gè)應(yīng)用程序間的單向流動(dòng),則TCP用序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)。
(3)當(dāng)建立一個(gè)新連接時(shí),SYN標(biāo)志變1。序號(hào)字段包含由這個(gè)主機(jī)選擇的該連接的初始序號(hào)ISN,該主機(jī)要發(fā)送數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)為這個(gè)ISN加1,因?yàn)?/span>SYN標(biāo)志使用了一個(gè)序號(hào)。
(4)既然每個(gè)被傳輸?shù)淖止?jié)都被計(jì)數(shù),確認(rèn)序號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)。因此,確認(rèn)序號(hào)應(yīng)當(dāng)時(shí)上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加1。只有ACK標(biāo)志為1時(shí)確認(rèn)序號(hào)字段才有效。
(5)發(fā)送ACK無(wú)需任何代價(jià),因?yàn)?/span>32位的確認(rèn)序號(hào)字段和ACK標(biāo)志一樣,總是TCP首部的一部分。因此一旦一個(gè)連接建立起來(lái),這個(gè)字段總是被設(shè)置,ACK標(biāo)志也總是被設(shè)置為1。
(6)TCP為應(yīng)用層提供全雙工的服務(wù)。因此,連接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號(hào)。
(7)TCP可以表述為一個(gè)沒有選擇確認(rèn)或否認(rèn)的華東窗口協(xié)議。因此TCP首部中的確認(rèn)序號(hào)表示發(fā)送方已成功收到字節(jié),但還不包含確認(rèn)序號(hào)所指的字節(jié)。當(dāng)前還無(wú)法對(duì)數(shù)據(jù)流中選定的部分進(jìn)行確認(rèn)。
(8)首部長(zhǎng)度需要設(shè)置,因?yàn)槿芜x字段的長(zhǎng)度是可變的。TCP首部最多60個(gè)字節(jié)。
(9)6個(gè)標(biāo)志位中的多個(gè)可同時(shí)設(shè)置為1
◆ URG-緊急指針有效
◆ ACK-確認(rèn)序號(hào)有效
◆ PSH-接收方應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用層
◆ RST-重建連接
◆ SYN-同步序號(hào)用來(lái)發(fā)起一個(gè)連接
◆ FIN-發(fā)送端完成發(fā)送任務(wù)
(10)TCP的流量控制由連接的每一端通過(guò)聲明的窗口大小來(lái)提供。窗口大小為字節(jié)數(shù),起始于確認(rèn)序號(hào)字段指明的值,這個(gè)值是接收端期望接收的字節(jié)數(shù)。窗口大小是一個(gè)16為的字段,因而窗口大小最大為65535字節(jié)。
(11)檢驗(yàn)和覆蓋整個(gè)TCP報(bào)文端:TCP首部和TCP數(shù)據(jù)。這是一個(gè)強(qiáng)制性的字段,一定是由發(fā)送端計(jì)算和存儲(chǔ),并由接收端進(jìn)行驗(yàn)證。TCP檢驗(yàn)和的計(jì)算和UDP首部檢驗(yàn)和的計(jì)算一樣,也使用偽首部。
(12)緊急指針是一個(gè)正的偏移量,黃蓉序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
(13)最常見的可選字段是最長(zhǎng)報(bào)文大小MMS,每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段中指明這個(gè)選項(xiàng)。它指明本端所能接收的最大長(zhǎng)度的報(bào)文段。
二、TCP連接的建立和終止
1、建立連接協(xié)議
(1) 請(qǐng)求端發(fā)送一個(gè)SYN段指明客戶打算連接的服務(wù)器的端口,隱疾初始序號(hào)(ISN),這個(gè)SYN報(bào)文段為報(bào)文段1。
(2) 服務(wù)器端發(fā)回包含服務(wù)器的初始序號(hào)的SYN報(bào)文段(報(bào)文段2)作為應(yīng)答。同時(shí)將確認(rèn)序號(hào)設(shè)置為客戶的ISN加1以對(duì)客戶的SYN報(bào)文段進(jìn)行確認(rèn)。一個(gè)SYN將占用一個(gè)序號(hào)。
(3) 客戶必須將確認(rèn)序號(hào)設(shè)置為服務(wù)器的ISN加1以對(duì)服務(wù)器的SYN報(bào)文段進(jìn)行確認(rèn)(報(bào)文段3)。
這3個(gè)報(bào)文段完成連接的建立,稱為三次握手。發(fā)送第一個(gè)SYN的一端將執(zhí)行主動(dòng)打開,接收這個(gè)SYN并發(fā)回下一個(gè)SYN的另一端執(zhí)行被動(dòng)打開。
2、連接終止協(xié)議
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè)FIN只意味著這一方向上沒有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
(1) TCP客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報(bào)文段4)。
?。?/span>2) 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。
(3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端(報(bào)文段6)。
?。?/span>4) 客戶段發(fā)回確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)。
3、連接建立的超時(shí)
如果與服務(wù)器無(wú)法建立連接,客戶端就會(huì)三次向服務(wù)器發(fā)送連接請(qǐng)求。在規(guī)定的時(shí)間內(nèi)服務(wù)器未應(yīng)答,則連接失敗。
4、最大報(bào)文段長(zhǎng)度MSS
最大報(bào)文段長(zhǎng)度表示TCP傳往另一端的最大塊數(shù)據(jù)的長(zhǎng)度。當(dāng)一個(gè)連接建立時(shí),連接的雙方都要通告各自的MSS。
一般,如果沒有分段發(fā)生,MSS還是越大越好。報(bào)文段越大允許每個(gè)報(bào)文段傳送的數(shù)據(jù)越多,相對(duì)IP和TCP首部有更高的網(wǎng)絡(luò)利用率。當(dāng)TCP發(fā)送一個(gè)SYN時(shí),它能將MSS值設(shè)置為外出接口的MTU長(zhǎng)度減去IP首部和TCP首部長(zhǎng)度。對(duì)于以太網(wǎng),MSS值可達(dá)1460。
如果目的地址為非本地的,MSS值通常默認(rèn)為536,是否本地主要通過(guò)網(wǎng)絡(luò)號(hào)區(qū)分。MSS讓主機(jī)限制另一端發(fā)送數(shù)據(jù)報(bào)的長(zhǎng)度,加上主機(jī)也能控制它發(fā)送數(shù)據(jù)報(bào)的長(zhǎng)度,這將使以較小MTU連接到一個(gè)網(wǎng)絡(luò)上的主機(jī)避免分段。
5、 TCP的半關(guān)閉
TCP提供了連接的一端在結(jié)束它的發(fā)送后還能接收來(lái)自另一端數(shù)據(jù)的能力,這就是TCP的半關(guān)閉。
客戶端發(fā)送FIN,另一端發(fā)送對(duì)這個(gè)FIN的ACK報(bào)文段。當(dāng)收到半關(guān)閉的一端在完成它的數(shù)據(jù)傳送后,才發(fā)送FIN關(guān)閉這個(gè)方向的連接,客戶端再對(duì)這個(gè)FIN確認(rèn),這個(gè)連接才徹底關(guān)閉。
6、2MSL連接
TIME_WAIT狀態(tài)也稱為2MSL等待狀態(tài)。每個(gè)TCP必須選擇一個(gè)報(bào)文段最大生存時(shí)間(MSL)。它是任何報(bào)文段被丟棄前在網(wǎng)絡(luò)的最長(zhǎng)時(shí)間。
處理原則:當(dāng)TCP執(zhí)行一個(gè)主動(dòng)關(guān)閉,并發(fā)回最后一個(gè)ACK,該連接必須在TIME_WAIT狀態(tài)停留的時(shí)間為2MSL。這樣可以讓TCP再次發(fā)送最后的ACK以避免這個(gè)ACK丟失(另一端超時(shí)并重發(fā)最后的FIN)。這種2MSL等待的另一個(gè)結(jié)果是這個(gè)TCP連接在2MSL等待期間,定義這個(gè)連接的插口不能被使用。
7、平靜時(shí)間
TCP在重啟的MSL秒內(nèi)不能建立任何連接,這就是平靜時(shí)間。
8、FIN_WAIT_2狀態(tài)
在FIN_WAIT_2狀態(tài)我們已經(jīng)發(fā)出了FIN,并且另一端也對(duì)它進(jìn)行了確認(rèn)。只有另一端的進(jìn)程完成了這個(gè)關(guān)閉,我們這端才會(huì)從FIN_WAIT_2狀態(tài)進(jìn)入TIME_WAIT狀態(tài)。這意味著我們這端可能永遠(yuǎn)保持這個(gè)狀態(tài),另一端也將處于CLOSE_WAIT狀態(tài),并一直保持這個(gè)狀態(tài)直到應(yīng)用層決定進(jìn)行關(guān)閉。
9、復(fù)位報(bào)文段
TCP首部的RST位是用于復(fù)位的。一般,無(wú)論合適一個(gè)報(bào)文端發(fā)往相關(guān)的連接出現(xiàn)錯(cuò)誤,TCP都會(huì)發(fā)出一個(gè)復(fù)位報(bào)文段。主要情況:
(1)到不存在的端口的連接請(qǐng)求;
(2)異常終止一個(gè)連接。
10、同時(shí)打開
為了處理同時(shí)打開,對(duì)于同時(shí)打開它僅建立一條連接而不是兩條連接。兩端幾乎在同時(shí)發(fā)送SYN,并進(jìn)入SYN_SENT狀態(tài)。當(dāng)每一端收到SYN時(shí),狀態(tài)變?yōu)?/span>SYN_RCVD,同時(shí)他們都再發(fā)SYN并對(duì)收到的SYN進(jìn)行確認(rèn)。當(dāng)雙方都收到SYN及相應(yīng)的ACK時(shí),狀態(tài)都變?yōu)?/span>ESTABLISHED。一個(gè)同時(shí)打開的連接需要交換4個(gè)報(bào)文段,比正常的三次握手多了一次。
11、 同時(shí)關(guān)閉
當(dāng)應(yīng)用層發(fā)出關(guān)閉命令,兩端均從ESTABLISHED變?yōu)?/span>FIN_WAIT_1。這將導(dǎo)致雙方各發(fā)送一個(gè)FIN,兩個(gè)FIN經(jīng)過(guò)網(wǎng)絡(luò)傳送后分別到達(dá)另一端。收到FIN后,狀態(tài)由FIN_WAIT_1變?yōu)?/span>CLOSING,并發(fā)送最后的ACK。當(dāng)收到最后的ACK,狀態(tài)變?yōu)?/span>TIME_WAIT。同時(shí)關(guān)閉和正常關(guān)閉的段減緩數(shù)目相同。
12、TCP選項(xiàng)
每個(gè)選項(xiàng)的開始是1字節(jié)的kind字段,說(shuō)明選項(xiàng)的類型。
Kind=1:選項(xiàng)表結(jié)束(1字節(jié))
Kind=1:無(wú)操作(1字節(jié))
Kind=2:最大報(bào)文段長(zhǎng)度(4字節(jié))
Kind=3:窗口擴(kuò)大因子(4字節(jié))
Kind=8:時(shí)間戳(10字節(jié))
三、TCP的超時(shí)和重傳
對(duì)于每個(gè)TCP連接,TCP管理4個(gè)不同的定時(shí)器。
?。?/span>1) 重傳定時(shí)器用于當(dāng)希望收到另一端的確認(rèn)。
?。?/span>2) 堅(jiān)持定時(shí)器使窗口大小信息保持不斷流動(dòng),即使另一端關(guān)閉了其接收窗口。
?。?/span>3) ?;疃〞r(shí)器可檢測(cè)到一個(gè)空閑連接的另一端何時(shí)崩潰或重啟。
(4) 2MSL定時(shí)器測(cè)量一個(gè)連接處于TIME_WAIT狀態(tài)的時(shí)間。
1、往返時(shí)間測(cè)量
TCP超時(shí)和重傳重最重要的就是對(duì)一個(gè)給定連接的往返時(shí)間(RTT)的測(cè)量。由于路由器和網(wǎng)絡(luò)流量均會(huì)變化,因此TCP應(yīng)該跟蹤這些變化并相應(yīng)地改變超時(shí)時(shí)間。首先TCP必須測(cè)量在發(fā)送一個(gè)帶有特別序號(hào)地字節(jié)和接收到包含該字節(jié)地確認(rèn)之間的RTT。
2、擁塞避免算法
該算法假定由于分組收到損壞引起的丟失是非常少的,因此分組丟失就意味著在源主機(jī)和目的主機(jī)之間的某處網(wǎng)絡(luò)上發(fā)生了阻塞。有兩種分組丟失的指示:發(fā)生超時(shí)和收到重復(fù)的確認(rèn)。擁塞避免算法需要對(duì)每個(gè)連接維持兩個(gè)變量:一個(gè)擁塞窗口cwnd和一個(gè)慢啟動(dòng)門限ssthresh。
(1) 對(duì)一個(gè)給定的連接,初始化cwnd為1個(gè)報(bào)文段,ssthresh為65535個(gè)字節(jié)。
(2) TCP輸出例程的輸出不能超過(guò)cwnd和接收方通告窗口的大小。擁塞避免是發(fā)送方使用的流量控制。前者是發(fā)送方感受到的網(wǎng)絡(luò)擁塞的估計(jì),而后者則與接收方在該連接上的可用緩存大小有關(guān)。
(3) 當(dāng)擁塞發(fā)生時(shí),ssthresh被設(shè)置為當(dāng)前窗口大小的一般(cwnd和接收方通告窗口大小的最小值,但最小為2個(gè)報(bào)文段)。此外,如果是超時(shí)引起了擁塞,則cwnd被設(shè)置為1個(gè)報(bào)文段。
(4) 當(dāng)新的數(shù)據(jù)被對(duì)方確認(rèn)時(shí),就增加cwnd,但增加的方法依賴與是否正在進(jìn)行慢啟動(dòng)或擁塞避免。如果cwnd小于或等于ssthresh,則正在進(jìn)行慢啟動(dòng),否則正在進(jìn)行擁塞避免。
3、快速重傳和快速恢復(fù)算法
如果我們一連串收到3個(gè)或以上的重復(fù)ACK,就非??赡苁且粋€(gè)報(bào)文段丟失了。于是我們就重傳丟失的數(shù)據(jù)報(bào)文段,而無(wú)需等待超時(shí)定時(shí)器溢出。
(1) 當(dāng)收到第3個(gè)重復(fù)的ACK時(shí),將ssthresh設(shè)置為當(dāng)前擁塞窗口cwnd的一半,重傳丟失的報(bào)文段,設(shè)置cwnd為ssthresh加上3倍的報(bào)文段大小。
?。?/span>2) 每次收到另一個(gè)重復(fù)的ACK時(shí),cwnd增加1個(gè)報(bào)文段大小并發(fā)送一個(gè)1個(gè)分組,如果允許的話。
?。?/span>3) 當(dāng)下一個(gè)確認(rèn)新數(shù)據(jù)的ACK到達(dá)時(shí),設(shè)置cwnd為ssthresh,這個(gè)ACK應(yīng)該時(shí)在進(jìn)行重傳后的一個(gè)往返時(shí)間內(nèi)對(duì)步驟1重重傳的確認(rèn)。另外,這個(gè)ACK也應(yīng)該是對(duì)丟失的分組和收到的第一個(gè)重復(fù)的ACK之間的所有中間報(bào)文段的確認(rèn)。
4、 ICMP差錯(cuò)
TCP如何處理一個(gè)給定的連接返回的ICMP差錯(cuò)。TCP能夠遇到的最常見的ICMP差錯(cuò)就是源站抑制、主機(jī)不可達(dá)和網(wǎng)絡(luò)不可達(dá)。
?。?/span>1) 一個(gè)接收到的源站抑制引起擁塞窗口cwnd被置為1個(gè)報(bào)文段大小來(lái)發(fā)起慢啟動(dòng),但是慢啟動(dòng)門限ssthresh沒有變化,所以窗口將打開直到它開放了所有的通路或者發(fā)生了擁塞。
?。?/span>2) 一個(gè)接收到的主機(jī)不可達(dá)或網(wǎng)絡(luò)不可達(dá)實(shí)際都被忽略,因?yàn)檫@兩個(gè)差錯(cuò)都被認(rèn)為是短暫現(xiàn)象。TCP試圖發(fā)送引起該差錯(cuò)的數(shù)據(jù),盡管最終有可能會(huì)超時(shí)。
5、重新分組:
當(dāng)TCP超時(shí)并重傳時(shí),它并不一定要重傳同樣的報(bào)文段,相反,TCP允許進(jìn)行重新分組而發(fā)送一個(gè)較大的報(bào)文段。這是允許的,因?yàn)?/span>TCP是使用字節(jié)序號(hào)而不是報(bào)文段序號(hào)來(lái)進(jìn)行識(shí)別它所要發(fā)送的數(shù)據(jù)和進(jìn)行確認(rèn)。
四、TCP的堅(jiān)持定時(shí)器
ACK的傳輸并不可靠,也就是說(shuō),TCP不對(duì)ACK報(bào)文段進(jìn)行確認(rèn),TCP只確認(rèn)那些包含數(shù)據(jù)的ACK報(bào)文段。為了防止因?yàn)?/span>ACK報(bào)文段丟失而雙方進(jìn)行等待的問題,發(fā)送方用一個(gè)堅(jiān)持定時(shí)器來(lái)周期性地向接收方查詢。這些從發(fā)送方發(fā)出地報(bào)文段稱為窗口探查。
五、TCP的保活定時(shí)器
如果一個(gè)給定的連接在2小時(shí)內(nèi)沒有任何動(dòng)作,那么服務(wù)器就向客戶發(fā)送一個(gè)探查報(bào)文段??蛻糁鳈C(jī)必須處于以下4個(gè)狀態(tài)之一。
(1) 客戶主機(jī)依然正常運(yùn)行,并從服務(wù)器可達(dá)??蛻舻?/span>TCP響應(yīng)正常,而服務(wù)器也知道對(duì)方的正常工作的。服務(wù)器在2小時(shí)內(nèi)將?;疃〞r(shí)器復(fù)位。
(2) 客戶主機(jī)已經(jīng)崩潰,并且關(guān)閉或者正在重新啟動(dòng)。在任何一種情況下,客戶的TCP都沒有響應(yīng)。服務(wù)器將不能收到對(duì)探查的響應(yīng),并在75秒后超時(shí)??偣舶l(fā)送10個(gè)探查,間隔75秒。
(3) 客戶主機(jī)崩潰并已經(jīng)重新啟動(dòng)。這是服務(wù)器將收到一個(gè)對(duì)其?;钐讲榈捻憫?yīng),但這個(gè)響應(yīng)是一個(gè)復(fù)位,使得服務(wù)器終止這個(gè)連接。
(4) 客戶主機(jī)正常運(yùn)行,但是從服務(wù)器不可達(dá)。
六、TCP的一些性能
1、 路徑MTU發(fā)現(xiàn):
TCP的路徑MTU發(fā)現(xiàn)按如下方式進(jìn)行:在連接建立時(shí),TCP使用輸出接口或?qū)Χ温暶鞯?/span>MSS中的最下MTU作為其實(shí)的報(bào)文段大小。路徑MTU發(fā)現(xiàn)不允許TCP超過(guò)對(duì)端聲明的MSS。如果對(duì)端沒有指定一個(gè)MSS,則默認(rèn)為536。
一旦選定了起始的報(bào)文段大小,在該連接上的所有被TCP發(fā)送的IP數(shù)據(jù)報(bào)都將被設(shè)置DF位。如果中間路由器需要對(duì)一個(gè)設(shè)置了DF標(biāo)志的數(shù)據(jù)報(bào)進(jìn)行分片,它就丟棄這個(gè)數(shù)據(jù)報(bào),并產(chǎn)生一個(gè)ICMP的“不能分片”差錯(cuò)。
如果收到這個(gè)ICMP差錯(cuò),TCP就減少段大小并進(jìn)行重傳。如果路由器產(chǎn)生的是一個(gè)較新的該類ICMP差錯(cuò),則報(bào)文段大小被設(shè)置位下一跳的MTU減去IP和TCP的首部長(zhǎng)度。如果是一個(gè)較舊的該類ICMP差錯(cuò),則必須嘗試下一個(gè)可能的最小MTU。
2、 長(zhǎng)肥管道
一個(gè)連接的容量=帶寬X時(shí)延(RTT)。具有大的帶寬時(shí)延乘積的網(wǎng)絡(luò)稱為長(zhǎng)肥網(wǎng)絡(luò)(LFN)。一個(gè)運(yùn)行在LFN的TCP連接稱為長(zhǎng)肥管道。管道可以被水平拉長(zhǎng)(一個(gè)長(zhǎng)的RTT),或被垂直拉高(較高的帶寬),或兩個(gè)方向拉伸。
3、窗口擴(kuò)大選項(xiàng):
窗口擴(kuò)大選項(xiàng)使TCP的窗口定義從16位增加到32位,這并不是通過(guò)修改TCP首部來(lái)實(shí)現(xiàn)的,TCP首部仍然使用16位,而是通過(guò)定義一個(gè)選項(xiàng)實(shí)現(xiàn)對(duì)16位的擴(kuò)大操作來(lái)完成的。
4、時(shí)間戳選項(xiàng):
時(shí)間戳選項(xiàng)使發(fā)送方在每個(gè)報(bào)文段中放置一個(gè)時(shí)間戳值。接收方在確認(rèn)中返回這個(gè)數(shù)值,從而允許發(fā)送方為每一個(gè)收到的ACK計(jì)算RTT。
聯(lián)系客服