?TCP 的特點:
-
面向連接的傳輸服務(wù)
-
支持字節(jié)流傳輸:
?應(yīng)用程序與 TCP 每次交互的數(shù)據(jù)長度可能都不相同,但 TCP 將應(yīng)用程序提交的數(shù)據(jù)看作時一連串的、無結(jié)構(gòu)的字節(jié)流,同時在發(fā)送方與接收方都維護一個緩存。發(fā)送方將幾個寫操作合并成一個報文段,提交給IP協(xié)議封裝成IP分組后發(fā)送。接收方將接受的字節(jié)存儲在接收緩存中,由應(yīng)用程序的讀操作取出。 -
支持全雙工服務(wù):
?通信雙方的應(yīng)用程序在任何時候都可以發(fā)送數(shù)據(jù)。通信雙方都有發(fā)送緩沖區(qū)與接收緩沖區(qū),應(yīng)用程序?qū)⒁l(fā)送的數(shù)據(jù)字節(jié)提交給發(fā)送緩沖區(qū),并在合適的時候從接收緩沖區(qū)讀取數(shù)據(jù),至于實際的發(fā)送接收過程則由 TCP 協(xié)議控制。 -
支持同時建立多個并發(fā)連接:
?TCP 支持同時建立多個連接,即在一臺主機的多個端口可以建立多個 TCP 連接。(同一個端口上的 TCP 連接可以被表示為多個全連接的五元組) -
可靠傳輸:
?TCP 能夠?qū)Πl(fā)送與接收的自己進行跟蹤、確認與重傳。
一、TCP報文格式
1.報頭格式
- 發(fā)送序號:指出報文段中的數(shù)據(jù)在發(fā)送方字節(jié)流中的位置。
?TCP 為發(fā)送字節(jié)流中每個字節(jié)按順序編號,連接建立時,通信雙方都隨機產(chǎn)生一個初始序號(ISN),且雙方的序號是不同的
- 確認序號:指出接收方希望下一次接收的字節(jié)序號。
?確認序號表示接收方已正確接收了序號 N 及之前的字節(jié),要求發(fā)送方發(fā)送序號為 N+1 的字節(jié)的報文段。
-
報頭長度:4位,以 字節(jié) 為單位記錄TCP報頭的長度。由于 TCP 報頭的長度為 20~60 字節(jié),故該字段的值為5~15。
-
保留字段:留作今后使用
-
控制字段:控制字段定義了6種不同的控制位
標志 | 說明 |
---|---|
SYN | |
ACK | 只有當(dāng)ACK=1時,確認序號字段才有意義 |
FIN | 終止連接。FIN=1時,表明請求釋放連接 |
RST | 復(fù)位字段。要求立即關(guān)閉連接 |
URG | 此報文為緊急數(shù)據(jù),應(yīng)優(yōu)先發(fā)送,需配合緊急指針使用 |
PSH | 將數(shù)據(jù)向前推,當(dāng) PSH=1 時,請求接收方 TCP 盡快將該報文推給應(yīng)用程序 |
-
窗口字段:以 字節(jié) 為單位,表示要求對方必須維持的窗口大小
-
緊急指針:只有當(dāng)緊急標志=1時才有效,其值表示本報文段中的緊急數(shù)據(jù)的最后一個字節(jié)的編號
-
選項:TCP 報頭可以有長達 40 字節(jié)的選項字段
-
校驗和:TCP 校驗和的計算過程與 UDP 相同。但在 UDP 中校驗和為可選,而在 TCP 中是必需的。TCP 校驗和同樣需要偽報頭,不同的是協(xié)議字段的值為 6
TCP報文頭的長度為 20~60 字節(jié)(具體的長度取決于選項字段)。
2.TCP最大段長度 MSS
?TCP 協(xié)議對報文數(shù)據(jù)的最大長度的限定稱為最大段長度(MSS)。MSS 是指報文中數(shù)據(jù)的最大字節(jié)數(shù)限定,不包含報頭長度,且 TCP 最終發(fā)送的報文數(shù)據(jù)長度由 窗口大小 與 MSS共同決定。
?MSS的選取一般會綜合考慮:① 協(xié)議開銷? ② 發(fā)送與接收方緩沖區(qū)的限制
二、TCP連接建立與釋放
1.連接建立:三次握手
- 最初 CLIENT 處于CLOSE狀態(tài),當(dāng)有數(shù)據(jù)要發(fā)送時,會進入SYN-SEND狀態(tài),然后向出于LISTEN狀態(tài)的 SERVER 發(fā)送第一個“SYN”報文(SYN=1),該報文包括源端口與目的端口,以及一些連接參數(shù);
- SERVER 收到“SYN”報文后,若同意建立連接,則向客戶端發(fā)送“SYN+ACK”報文(SYN=1,ACK=1),該報文表示對第一個“SYN”報文的確認,同時給出了服務(wù)端的 初始序列號 與 通知窗口大小,客戶端會根據(jù)響應(yīng)時間估算出初始
R
T
T
RTT
RTT。SERVER 進入SYN-RECD狀態(tài);
- CLIENT 收到“SYN+ACK”報文后,發(fā)送第三個“ACK”報文,表示對“SYN+ACK”報文的確認,同時給出了客戶端的初始序列號,服務(wù)端會根據(jù)響應(yīng)時間估算出
R
T
T
RTT
RTT。同時 CLIENT 進入ESTABLISHED狀態(tài);
- SERVER 收到“ACK”報文后,也進入ESTABLISHED狀態(tài);
三次握手指有三個報文被發(fā)送:SYN、SYN+ACK、ACK
期間 CLIENT(連接發(fā)起者)的狀態(tài):CLOSED -> SYN-SEND -> ESTABLISHED
期間 SERVER(連接接收方)的狀態(tài):LISTEN -> SYN-RECD -> ESTABLISHED
2.報文傳輸
?連接建立后,CLIENT 與 SERVER 就可以使用連接進行全雙工的字節(jié)流傳輸。(這里使用C/S模式為了便于區(qū)分)
3.連接釋放:四次揮手
?客戶端(連接發(fā)起者)與服務(wù)端(連接接收者)都可以發(fā)起TCP連接的釋放。
-
CLIENT 進入FIN+WAIT-1(釋放等待1)狀態(tài),并向 SERVER 發(fā)送第一個“FIN”(FIN=1)報文。
-
SERVER 收到“FIN”報文后,向 CLIENT 發(fā)回“ACK”報文,表示對第一個“FIN”請求報文的確認,并進入CLOSE-WAIT狀態(tài)
TCP通知高層應(yīng)用程序 CLIENT 請求釋放連接,此時 CLIENT 不會再向 SERVER 發(fā)送數(shù)據(jù),CLIENT 到 SERVER 的連接斷開;但 SERVER 到 CLIENT 的TCP連接還沒有斷開,若 SERVER 愿意,還可以繼續(xù)發(fā)送數(shù)據(jù)直至完畢,這種連接狀態(tài)稱為“半關(guān)閉狀態(tài)”
-
CLIENT 收到“ACK”報文后,進入FIN+WAIT-2狀態(tài)
-
當(dāng) SERVER 的高層應(yīng)用無數(shù)據(jù)要寫入時,會通知 TCP 釋放連接,此時 SERVER 向 CLIENT 發(fā)送“FIN”報文,并進入LAST-ACK狀態(tài)
-
CLIENT 收到“FIN”報文后,向 SERVER 發(fā)送“ACK”報文,表示對“FIN”報文的確認。此時 CLIENT 進入TIME-WAIT狀態(tài),并等待至少2個最長報文壽命(MSL)時間后,才真正進入CLOSE狀態(tài)
設(shè)置延時等待機制(時間等待定時器)的原因:
-
確保連接能被可靠地關(guān)閉(若“FIN”報文或主動關(guān)閉端的“ACK”丟失,則被動關(guān)閉端會一直發(fā)送“FIN”報文,主動關(guān)閉端需要保持在某種狀態(tài)一定時間,以對這種情況進行處理。若主動關(guān)閉端已經(jīng)不存在,則主動關(guān)閉端的 TCP 協(xié)議棧會向?qū)Χ税l(fā)送一個 RST 報文作為響應(yīng)。1 個 MSL 時間留給最后的 ACK 確認報文到達被動關(guān)閉端節(jié)點,另一個 MSL 留給重傳的 FIN 報文);
-
保證網(wǎng)絡(luò)中冗余的 TCP 報文能夠有足夠長的時間失效并被丟棄,使得新的化身能夠被安全地建立(若 CLIENT 與 SERVER 在連接關(guān)閉后重新建立原連接的化身,即具有相同的地址與端口號,而若不等待網(wǎng)絡(luò)中遲來的報文過期,則新的化身可能收到這些報文。而 TCP 的最大生存周期是 MSL,堅持 2*MSL 的時間能夠使得兩個傳輸方向上遲來的報文都已失效)
-
-
SERVER 收到“ACK”報文后,進入LISTEN狀態(tài)
四次揮手指有四個報文被發(fā)送:FIN、ACK、FIN、ACK,其中每個ACK報文都是對上一個FIN報文的確認。
期間 CLIENT(連接發(fā)起者)的狀態(tài):ESTABLISHED -> FIN-WAIT-1(發(fā)送FIN后) -> FIN-WAIT-2(接收ACK報文后) -> TIME-WAIT(收到FIN后,延時關(guān)閉) -> CLOSE
期間 SERVER(連接接收方)的狀態(tài):ESTABLISHED -> CLOSE-WAIT(收到FIN后) -> LAST-ACK(發(fā)送FIN后) -> LISTEN(收到ACK后)
4.保持定時器與時間等待定時器
?TCP 設(shè)置了四個定時器:重傳定時器、堅持定時器、保持定時器、時間等待定時器,其中與 TCP 連接狀態(tài)有關(guān)的為:
-
保持定時器:又稱激活定時器,用以防止 TCP 連接處于長時間空閑狀態(tài)。超時設(shè)置通常為 2 小時,每當(dāng)服務(wù)器端收到客戶端的信息時,就將定時器復(fù)位;而若超過 2 小時沒有收到客戶端的信息,則將發(fā)送探測報文,若發(fā)送了 10 個探測報文(每個相隔75秒)還沒有響應(yīng),則關(guān)閉連接。
-
時間等待定時器:在連接終止時使用。當(dāng)客戶端向服務(wù)端發(fā)送最后一次報文確認時,會等待 2*MSL(報文壽命)后再關(guān)閉連接
三、TCP差錯重傳
?TCP 差錯控制機制的實現(xiàn):檢測、確認、重傳實現(xiàn)。
1.字節(jié)流狀態(tài)分類與滑動窗口(發(fā)送)
① 滑動窗口
?TCP 用以字節(jié)為單位的滑動窗口協(xié)議來控制字節(jié)流的發(fā)送、接收、確認與重傳:
兩個緩存與兩個窗口
-
發(fā)送方 TCP 維護一個發(fā)送緩存,用來存儲應(yīng)用程序準備發(fā)送的數(shù)據(jù),同時對發(fā)送緩存設(shè)置一個發(fā)送窗口,只要這個窗口值不為 0,就可以發(fā)送報文段;
-
接收方 TCP 維護一個接收緩存,用來存儲接收到的字節(jié)流,等待應(yīng)用程序的讀取,同時設(shè)置一個接收窗口,窗口等于接收緩沖可以接收的字節(jié)流大小;
-
接收方通過 TCP 報頭通知發(fā)送方已經(jīng)正確接收的字節(jié)號與發(fā)送方還能繼續(xù)發(fā)送的字節(jié)數(shù);
-
接收窗口的大小卻決于接收緩存剩余空間的大小、應(yīng)用程序讀取字節(jié)流的速度;而發(fā)送窗口的大小取決于接收窗口。
以段為單位確認
?雖然 TCP 面向字節(jié)流,但卻不可能對每個字節(jié)都進行確認。而是將數(shù)據(jù)打包成段,封裝成報文,通過報頭的“序號”來標識發(fā)送的字節(jié),用“確認序號”來表示哪些字節(jié)已被正確接收。
② 字節(jié)流狀態(tài)
?為達到利用滑動窗口協(xié)議控制差錯,TCP 引入了“傳輸?shù)淖止?jié)流狀態(tài)”的概念:
-
第1類:已發(fā)送且被確認的字節(jié);
-
第2類:已發(fā)送但沒有被確認的字節(jié);
-
第3類:尚未發(fā)送但接收方 已準備號接收的字節(jié);
-
第4類:尚未放松且接收方?jīng)]有做好準備的字節(jié)。
③ 發(fā)送窗口與可用窗口
?發(fā)送方能夠發(fā)送字節(jié)流的大小取決于發(fā)送窗口的大小。
- 可用窗口:第 3 類字節(jié)數(shù),表示隨時可以發(fā)送的字節(jié)數(shù)
- 發(fā)送窗口:第 2 類字節(jié)數(shù) + 第3類字節(jié)數(shù),表示已發(fā)送但未被確認及隨時可以發(fā)送的字節(jié)數(shù)
④ 發(fā)送可用窗口后的字節(jié)狀態(tài)與窗口變化
?發(fā)送方可立即發(fā)送可用窗口的字節(jié),則第3類字節(jié)就會變?yōu)榈?2 類字節(jié),等待確認。
⑤ 確認并滑動發(fā)送窗口
?接收方發(fā)送確認報文報文,確認序號為 20~25 的字節(jié)(確認序號為26),若保持發(fā)送窗口不變,則窗口向左劃,并將進入窗口的第 4 類字節(jié)變?yōu)榈?3 類字節(jié)。
2.選擇重發(fā)策略
?若傳輸過程中丟失了報文段,就會造成字節(jié)流序號不連續(xù),而發(fā)送方對字節(jié)流序號不連續(xù)的處理方式有兩種:
① 回退
?若采用回退的方式處理接收的字節(jié)流序號不連續(xù),則需要再丟失中間報文段時,不管之后的報文段是否被正確接收,都會從該中間報文段的第1個字節(jié)序號開始,重發(fā)所有的報文段,這種方式是很低效的。
② 選擇重發(fā)
?選擇重發(fā) SACK,當(dāng)接收方收到與前面接收的字節(jié)流序號不連續(xù)的字節(jié)時,若這些字節(jié)的序號都在接收窗口之內(nèi),則首先接收這些字節(jié),然后將丟失的字節(jié)流序號通知發(fā)送方。發(fā)送方只需重發(fā)丟失的報文段即可,而無需重發(fā)已經(jīng)接收的報文段。
3.重傳定時器
?用來處理報文確認與等待重傳的時間。當(dāng)發(fā)送方 TCP 發(fā)送一個報文時,會將它的副本放入重傳隊列,同時啟動一個重傳定時器。
?若在重傳計時器歸0前收到確認,表示該報文傳輸成功;若在計算器歸0前未收到確認,則報文傳輸失敗,準備重傳報文。
計算重傳時間
?每個 TCP 都要維持一*
R
T
T
RTT
RTT 變量,即估算的往返時延,自適應(yīng)重傳定時是基于這個
R
T
T
RTT
RTT 進行的。
-
重傳時間的計算公式為: T i m e o u t = β ? R T T Timeout=\beta * RTT Timeout=β?RTT,其中 β β β為大于1的常量加權(quán)因子, R T T RTT RTT 為估算的往返時間;
-
而RTT的計算公式為: R T T = α ? 舊 R T T + ( 1 ? α ) ? 最新 R T T 測量值 RTT=\alpha * 舊RTT+(1-\alpha) *最新RTT測量值 RTT=α?舊RTT+(1?α)?最新RTT測量值,其中 α \alpha α決定了 R T T RTT RTT 對時延變化的反應(yīng)程度
四、流量控制
?流量控制的目的控制發(fā)送方的發(fā)送速率,使之不超過接收方的接收速率,防止因接收速率過低而出現(xiàn)報文丟失。TCP 可利用滑動窗口協(xié)議實現(xiàn)收發(fā)雙方的流量控制。
1.滑動窗口實現(xiàn)流量控制的過程
-
若接收方應(yīng)用層從緩存中讀取字節(jié)的速度大于或等于字節(jié)達到的速度,那么接收方會在確認報文中發(fā)出非零窗口通告(即窗口字段為 0 的 TCP 確認報文);
-
若發(fā)送方發(fā)送的速率較快,導(dǎo)致接收緩存溢出,則接收方會發(fā)出零窗口通告(即窗口字段非0的TCP確認字段);
-
當(dāng)發(fā)送方接收到零窗口通告時,停止發(fā)送,直到收到下一個非零窗口通告為止;
-
接收方發(fā)送的“窗口”通告即根據(jù)自己的接收能力給出一個合適的接收窗口,并將其寫入到TCP的報頭當(dāng)中,通知發(fā)送方。流量控制過程中,接收窗口又稱通知窗口。
-
當(dāng)接收方緩存區(qū)因應(yīng)用層的讀取由滿變?yōu)槲礉M,則接收方會發(fā)送一個額外的確認,告知發(fā)送窗口的大小,因而不用擔(dān)心接收緩存空出來時發(fā)送方仍不發(fā)送數(shù)據(jù)。
通過通知窗口可以有效保證接收緩存不會溢出。
2.堅持定時器
?若下一個“非零窗口”通告丟失,為了防止發(fā)送方無休止的等待,協(xié)議引入了一個堅持定時器。
?當(dāng)發(fā)送方收到一個零窗口通告時,就啟動一個堅持定時器,當(dāng)堅持定時器到時而未收到接收方的確認時,就會發(fā)送一個特殊的探測報文。這個報文只有一個字節(jié),包含一個序號,但這個序號不需要確認,且接收方計算其他數(shù)據(jù)的確認時,該序號也會被忽略。該報文的作用是:提示接收方確認已丟失,請重傳。
3.傳輸效率
?應(yīng)用進程將數(shù)據(jù)傳送到 TCP 的發(fā)送緩存后,由 TCP 協(xié)議來負責(zé)整個傳輸過程。以下算法用以解決應(yīng)用進程傳輸數(shù)據(jù)到發(fā)送緩存與從發(fā)送緩沖發(fā)送數(shù)據(jù)至接收方的時間差問題:
① Nagle算法
-
發(fā)送方第一次只發(fā)送1字節(jié),其他字節(jié)放入緩沖區(qū);當(dāng)?shù)谝粋€報文應(yīng)答確認時,再把緩沖區(qū)中的數(shù)據(jù)放在第二個報文段中發(fā)送,這樣一邊等待確認,一邊緩存數(shù)據(jù),能夠有效提高傳輸速率;
-
當(dāng)緩存的數(shù)據(jù)字節(jié)數(shù)達到發(fā)送窗口的1/2或接近最大報文長度(MSS)時,立即將它們作為一個報文段發(fā)送。
Nagle算法解決數(shù)據(jù)每次以1字節(jié)進入傳輸層,相當(dāng)于將 TCP 弱化為一個停止等待協(xié)議:
直接發(fā)送數(shù)據(jù)的情況:
- 發(fā)送緩沖區(qū)的數(shù)據(jù)大到MSS時
- 發(fā)送緩沖區(qū)的數(shù)據(jù)達到發(fā)送窗口的一半時
- 發(fā)送方不在等待 ACK 確認(新的發(fā)送階段)
② Clark算法
?Clark算法用于解決 “糊涂窗口綜合征”:接收端應(yīng)用進程處理接收緩沖區(qū)數(shù)據(jù)很慢(每次1B),使得通知窗口過小,造成傳輸效率過低:
五、擁塞控制
?TCP 的擁塞控制方法分為:慢開始、擁塞避免、快重傳與快恢復(fù)。
1.基本概念
?擁塞控制用于防止過多的報文進入網(wǎng)絡(luò)而造成路由器與鏈路過載。網(wǎng)絡(luò)出現(xiàn)擁塞的條件是:
∑
對網(wǎng)絡(luò)資源的需求>網(wǎng)絡(luò)可用資源
\sum對網(wǎng)絡(luò)資源的需求 > 網(wǎng)絡(luò)可用資源
∑對網(wǎng)絡(luò)資源的需求>網(wǎng)絡(luò)可用資源
?其中:
-
負載:單位時間內(nèi)進入網(wǎng)絡(luò)的報文數(shù)
-
吞吐量:單位時間內(nèi)通過網(wǎng)絡(luò)輸出的報文數(shù)
?由圖可知:
-
無擁塞控制:在達到飽和點之后,吞吐量會隨著網(wǎng)絡(luò)負載的增加而減少
-
理想的擁塞控制:在網(wǎng)絡(luò)負載達到飽和點之前,網(wǎng)絡(luò)吞吐一直保持線性增長;達到飽和點之后吞吐量保持不變;
-
實際的擁塞控制:在網(wǎng)絡(luò)負載增長的初期,由于要在擁塞控制過程中消耗一定資源,因此其吞吐量小于無擁塞控制狀態(tài);但它可以在負載持續(xù)增長的過程中,通過限制進入網(wǎng)絡(luò)的報文或丟棄部分報文,使得整個系統(tǒng)的吞吐量逐漸增加,而不出現(xiàn)下降。
2.擁塞窗口
?TCP 滑動窗口是實現(xiàn)擁塞控制最基本的手段(也是流量控制的基本手段)。發(fā)送方發(fā)送數(shù)據(jù)時,即要考慮接收方接收能力,又要使網(wǎng)絡(luò)不要發(fā)生擁塞:
發(fā)送窗口
=
M
i
n
(
通知窗口,擁塞窗口
)
發(fā)送窗口 = Min(通知窗口,擁塞窗口)
發(fā)送窗口=Min(通知窗口,擁塞窗口)
?其中:
-
通知窗口:是由接收方根據(jù)自己的接受能力判斷的窗口值,它來自接收方的流量控制。接收方將通知窗口值放在TCP報頭中,傳送給發(fā)送端。
-
擁塞窗口:發(fā)送方根據(jù)網(wǎng)絡(luò)擁塞情況得出的窗口值,它來自發(fā)送方的流量控制。發(fā)送方在確定擁塞窗口大小時,可以使用慢開始與擁塞避免算法。
3.慢開始與擁塞避免
?在一個 TCP 連接中,發(fā)送方維持一個擁塞窗口的狀態(tài)參數(shù)。擁塞窗口的大小根據(jù)網(wǎng)絡(luò)情況動態(tài)調(diào)整。只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞,發(fā)送方就逐漸增大擁塞窗口;當(dāng)出現(xiàn)擁塞時,擁塞窗口就立即減少。
?慢開始與擁塞避免算法中,網(wǎng)絡(luò)是否出現(xiàn)擁塞是根據(jù)路由器是否丟棄分組來確定的。(這里假設(shè)分組丟失不是由于物理層傳輸差錯造成,而是由于分組傳輸?shù)目偭枯^大,造成路由器負載過重而導(dǎo)致的。)
① 慢開始算法
?當(dāng)發(fā)送方開始發(fā)送數(shù)據(jù)時,采用試探性的方法,由小到大逐步增大擁塞窗口:
將從發(fā)送方發(fā)送報文到接收方,接收方在規(guī)定時間內(nèi)返回確認報文作為一個往返。
-
發(fā)送方建立 TCP 連接時,將“慢開始”的初始值設(shè)置為1(最大報文長度,MSS)
-
第一個往返中,將擁塞窗口設(shè)置為 2,然后向發(fā)送方發(fā)送兩個最大報文長度的字節(jié)。(即兩個報文)
-
若接收方每次都能在定時器允許的往返時間 內(nèi)返回確認,表示網(wǎng)絡(luò)沒有出現(xiàn)擁塞,發(fā)送方的擁塞窗口按二進制指數(shù)方式增長;
-
若沒有在規(guī)定時間內(nèi)收到確認,則表示網(wǎng)絡(luò)出現(xiàn)擁塞,將 SST 值設(shè)為出現(xiàn)擁塞的 cwnd 值的一半,并將 cwnd 設(shè)置為1,進入下一輪的慢開始過程。
這里需注意:
- 雖然擁塞窗口控制的是發(fā)送數(shù)據(jù)的字節(jié)數(shù),但由于每次窗口的遞增都是以 MSS 為單位,且 MSS 為一個TCP報文的最大長度,故可以將擁塞控制理解為控制報文發(fā)送的數(shù)量。
?- 每次發(fā)送的往返時間(RTT)是不同的:
?若在某次往返過程中擁塞窗口值為N,則發(fā)送方只有在連續(xù)發(fā)送的N個報文都收到確認之后,才能判定網(wǎng)絡(luò)沒有出現(xiàn)擁塞。因此在擁塞控制過程中每一個往返過程的往返時間是從連續(xù)發(fā)送浮動個報文段到接收所有報文段的確認所需要的時間。往返時間的長短取決于連續(xù)發(fā)送報文段的多少。
?- 慢開始閾值(SST):為避免擁塞窗口增長過快引起的網(wǎng)絡(luò)擁塞所定義的參數(shù),對于擁塞窗口與慢開始閾值間的關(guān)系可以有:
- 當(dāng) cwnd < SST 時,使用慢開始算法
- 當(dāng) cwnd > SST 時,停止使用慢開始,轉(zhuǎn)而使用擁塞避免算法
- 當(dāng) cwnd = SST 時,既可以使用慢開始,也可以使用擁塞避免
在慢開始階段,若出現(xiàn)擁塞,則發(fā)送方可以將慢開始的閾值SST設(shè)置為出現(xiàn)擁塞的cwnd值的一半。
?
- 實際上在慢開始中,發(fā)送方的擁塞窗口并不是指數(shù)增加的,而是每當(dāng)發(fā)送方收到一個報文段的確認,擁塞窗口就增加一個 MSS 大?。坏诶硐肭闆r下,每個報文的確認都無延時,相當(dāng)于每個 RTT 后將擁塞窗口乘 2:
② 擁塞避免算法
?當(dāng) cwnd>SST 時,停止慢開始過程,轉(zhuǎn)而進入擁塞避免。
?該算法采用每增加一個往返時間就將擁塞窗口值加1個MSS。即在擁塞避免算法階段,擁塞窗口呈線性增加的規(guī)律緩慢增長。
?且與慢開始一樣,只要發(fā)現(xiàn)接收方?jīng)]有按時返回確認就認為出現(xiàn)網(wǎng)絡(luò)擁塞,將 SST 設(shè)為發(fā)生擁塞時 cwdn 的一半,將當(dāng)前 cwnd 設(shè)為1,重新進入下一輪慢開始過程。
?下面是一個使用慢開始與擁塞避免進行擁塞控制的過程:
4.快重傳與快恢復(fù)
?在 慢開始 與 擁塞避免 的基礎(chǔ)上,還提出了 快重傳 與 快恢復(fù)。
① 快重傳
?在發(fā)送了 N 個報文后,若缺少了少數(shù)報文的返回確認,則接收方應(yīng)盡快連續(xù)發(fā)送三次缺失報文之前報文的重復(fù)確認,要求盡快盡快重傳未被確認的報文。即不能因為某些報文確認的缺失就判斷網(wǎng)絡(luò)出現(xiàn)擁塞:
② 快恢復(fù)
?快恢復(fù)與快重傳配合,它規(guī)定:
-
當(dāng)發(fā)送方收到第 1 個“重復(fù)確認”時,立即將 cwnd 設(shè)置為最大擁塞窗口值的 1/2,并執(zhí)行擁塞避免算法,擁塞窗口按線性方式增長;
-
當(dāng)發(fā)送方收到第 2 個“重復(fù)確認”時,立即減少 cwnd 的值,執(zhí)行擁塞避免算法,擁塞窗口按線性方式增長;
-
當(dāng)發(fā)送方收到第 3 個“重復(fù)確認”時,立即減少 cwnd 的值,執(zhí)行擁塞避免算法,擁塞窗口按線性方式增長;
六、復(fù)位報文
?RST 指復(fù)位字段,當(dāng) TCP 發(fā)生錯誤時發(fā)送的一個復(fù)位報文,要求立即關(guān)閉 TCP 連接,產(chǎn)生 RST 分節(jié)的三種情況是:
-
接受到目的為某端口的 SYN 分組,但該端口上并沒有正在監(jiān)聽的服務(wù)器;
-
TCP 接收到一個不存在的連接上的分組;文章來源:http://www.zghlxwxcb.cn/news/detail-524413.html
-
TCP 想取消一個已有連接。文章來源地址http://www.zghlxwxcb.cn/news/detail-524413.html
到了這里,關(guān)于傳輸控制協(xié)議 TCP的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!