TCP擁塞機(jī)制
明確作用
TCP的擁塞機(jī)制解決的是網(wǎng)絡(luò)延時(shí)突然增加,觸發(fā)大量的數(shù)據(jù)重傳涡上,導(dǎo)致網(wǎng)絡(luò)負(fù)擔(dān)加重問(wèn)題
如何實(shí)現(xiàn)
擁塞窗口(cwnd)
TCP的擁塞控制主要依賴于一個(gè) 擁塞窗口(cwnd) 來(lái)控制
窗口值的大小代表著能夠發(fā)送出去的但還沒(méi)有收到ACK(Acknowledgement確認(rèn)字符)的最大數(shù)據(jù)報(bào)文段趾断,顯然窗口越大那么數(shù)據(jù)發(fā)送的速度也就越快,但是也越可能使得網(wǎng)絡(luò)出現(xiàn)擁塞
四個(gè)核心算法
1吩愧、慢啟動(dòng)
當(dāng)新建連接時(shí)芋酌,cwnd 初始化為1個(gè)最大 報(bào)文段(MSS) 大小,發(fā)送端開(kāi)始按照擁塞窗口大小發(fā)送數(shù)據(jù)雁佳,每當(dāng)有一個(gè)報(bào)文段被確認(rèn)脐帝,cwnd 就增加1個(gè)MSS大小。這樣 cwnd 的值就隨著網(wǎng)絡(luò)往返時(shí)間(Round Trip Time,RTT)呈指數(shù)級(jí)增長(zhǎng)糖权。
開(kāi)始 ---> cwnd = 1
經(jīng)過(guò)1個(gè)RTT后 ---> cwnd = 2*1 = 2
經(jīng)過(guò)2個(gè)RTT后 ---> cwnd = 2*2= 4
經(jīng)過(guò)3個(gè)RTT后 ---> cwnd = 4*2 = 8
2堵腹、擁塞避免
TCP是如何避免網(wǎng)絡(luò)擁塞的呢?
當(dāng) 擁塞窗口cwnd 達(dá)到一個(gè)閾值(慢啟動(dòng)門(mén)限(ssthresh))時(shí)星澳,窗口大小不再呈指數(shù)上升疚顷,而是以線性上升。
此時(shí)當(dāng)窗口中所有的報(bào)文段都被確認(rèn)時(shí)募判,cwnd的大小加1荡含,cwnd的值就隨著RTT(往返時(shí)延) 開(kāi)始線性增加咒唆,這樣就可以避免增長(zhǎng)過(guò)快導(dǎo)致網(wǎng)絡(luò)擁塞。并由此慢慢地增加調(diào)整到網(wǎng)絡(luò)的最佳值
TCP認(rèn)為網(wǎng)絡(luò)擁塞的主要依據(jù)是它重傳了一個(gè)報(bào)文段
3释液、快速重傳
當(dāng)發(fā)送方收到3個(gè)duplicate ACK(冗余ACK)時(shí)就開(kāi)啟重傳全释,而不用等到 RTO(重傳定時(shí)器) 超時(shí),具體重傳操作如下:
- 把 ssthresh 設(shè)置為 cwnd 的一半
- 把 cwnd 再設(shè)置為 ssthresh 的值
- 重新進(jìn)入擁塞避免階段
實(shí)際上误债,當(dāng) 重傳定時(shí)器(RTO) 超時(shí)浸船,且還沒(méi)有得到數(shù)據(jù)確認(rèn),TCP就會(huì)對(duì)該報(bào)文段進(jìn)行重傳寝蹈,具體重傳操作如下:
- 把 ssthresh 降低為 cwnd 值的一半
- 把 cwnd 重新設(shè)置為1
- 重新進(jìn)入慢啟動(dòng)過(guò)程
4李命、快速恢復(fù)
當(dāng)發(fā)送方至少收到了3個(gè)Duplicated Acks,TCP認(rèn)為網(wǎng)絡(luò)也不那么糟糕箫老,可以快速恢復(fù)封字。
- 首先,TCP會(huì)把擁塞窗口的大小設(shè)置為 慢啟動(dòng)門(mén)限閥值 + 3個(gè)報(bào)文段大小耍鬓。即 cwnd = sshthresh + 3 * MSS(3的意思是確認(rèn)有3個(gè)冗余數(shù)據(jù)包被收到)
- 如果再收到 duplicated Acks阔籽,那么 cwnd = cwnd +1
- 如果收到了新的Ack,那么牲蜀,cwnd = sshthresh
- 進(jìn)入了擁塞避免的算法
以上就是TCP擁塞機(jī)制整體核心內(nèi)容
TCP如何保證包的順序傳輸
發(fā)送主機(jī)每次發(fā)送數(shù)據(jù)時(shí)笆制,TCP就給每個(gè)數(shù)據(jù)包分配一個(gè)序列號(hào)并且在一個(gè)特定的時(shí)間內(nèi)等待接收主機(jī)對(duì)分配的這個(gè)序列號(hào)進(jìn)行確認(rèn),
如果發(fā)送主機(jī)在一個(gè)特定時(shí)間內(nèi)沒(méi)有收到接收主機(jī)的確認(rèn)涣达,則發(fā)送主機(jī)會(huì)重傳此數(shù)據(jù)包在辆。
接收主機(jī)利用序列號(hào)對(duì)接收的數(shù)據(jù)進(jìn)行確認(rèn),以便檢測(cè)對(duì)方發(fā)送的數(shù)據(jù)是否有丟失或者亂序等度苔,接收主機(jī)一旦收到已經(jīng)順序化的數(shù)據(jù)匆篓,它就將這些數(shù)據(jù)按正確的順序重組成數(shù)據(jù)流并傳遞到高層進(jìn)行處理。
核心算法
- 為了保證數(shù)據(jù)包的可靠傳遞林螃,發(fā)送方必須把已發(fā)送的數(shù)據(jù)包保留在緩沖區(qū)
- 同時(shí)為每個(gè)已發(fā)送的數(shù)據(jù)包啟動(dòng)一個(gè)超時(shí)定時(shí)器(重傳定時(shí)器RTO)
- 如在定時(shí)器超時(shí)之前收到了對(duì)方發(fā)來(lái)的應(yīng)答信息(可能是對(duì)本包的應(yīng)答奕删,也可以是對(duì)本包后續(xù)包的應(yīng)答)俺泣,則釋放該數(shù)據(jù)包占用的緩沖區(qū)
- 否則疗认,重傳該數(shù)據(jù)包,直到收到應(yīng)答或重傳次數(shù)超過(guò)規(guī)定的最大次數(shù)為止伏钠。
- 接收方收到數(shù)據(jù)包后横漏,先進(jìn)行CRC校驗(yàn),如果正確則把數(shù)據(jù)交給上層協(xié)議熟掂,然后給發(fā)送方發(fā)送一個(gè)累計(jì)應(yīng)答包缎浇,表明該數(shù)據(jù)已收到,如果接收方正好也有數(shù)據(jù)要發(fā)給發(fā)送方赴肚,應(yīng)答包也可放在數(shù)據(jù)包中捎帶過(guò)去素跺。
上面就是今天要跟大家分享的內(nèi)容二蓝,有什么問(wèn)題歡迎大家在后臺(tái)給大叔留言,關(guān)注大叔說(shuō)碼指厌,我們下期見(jiàn)~