TCP流量控制,簡(jiǎn)單來(lái)說(shuō)就是讓 數(shù)據(jù)傳輸 端傳輸?shù)乃俾什灰?,讓?shù)據(jù)接收端來(lái)得及接收,利用滑動(dòng)窗口機(jī)制可以很方便的在 TCP連接上實(shí)現(xiàn)對(duì) 數(shù)據(jù)傳輸 端的流量控制。 TCP的窗口單位是字節(jié),不是報(bào)文段,數(shù)據(jù)傳輸端的發(fā)送窗口不能超過(guò)接收端給出的接收窗口的數(shù)值,流量控制的機(jī)制是控制丟包率,主要目的: 讓數(shù)據(jù)傳輸端了解數(shù)據(jù)接收端當(dāng)前的接收能力,可靈活調(diào)整傳輸速率。 流量控制機(jī)制圖如下圖所示:
滑動(dòng)窗口:
TCP采用大小可變的滑動(dòng)窗口進(jìn)行流量控制,窗口大小的單位是字節(jié)。
數(shù)據(jù)傳輸 窗口在連接建立時(shí)由雙方商定。 但在通信的過(guò)程中,數(shù)據(jù)接收端可根據(jù)自己的資源情況,隨時(shí)動(dòng)態(tài)地調(diào)整對(duì)方的傳輸窗口大小。 滑動(dòng)窗口實(shí)例圖如下圖所示:
滑動(dòng)窗口引進(jìn)原由:
我們可以把窗口理解為緩沖區(qū)(但是有些窗口和緩沖區(qū)又不太一樣)。
如果沒(méi)有這些 “窗口”,那么TCP每發(fā)送一段數(shù)據(jù)后都必須等到數(shù)據(jù)接收端確認(rèn)后才能發(fā)送下一段數(shù)據(jù),這樣做的話TCP傳輸?shù)男蕦?shí)在是太低了。
解決的辦法就是在發(fā)送端等待確認(rèn)的時(shí)候繼續(xù)發(fā)送數(shù)據(jù),假設(shè)發(fā)送到第 X個(gè)數(shù)據(jù)段是收到數(shù)據(jù)接收端的確認(rèn)信息,如果X在可接受的范圍內(nèi)那么這樣做也是可接受的。這就是窗口(緩沖區(qū))引入的緣由。
滑動(dòng)窗口:
A、數(shù)據(jù)接收端窗口 X
接收端緩沖區(qū)大小。接收端將此窗口值放在 TCP 報(bào)文的首部中的窗口字段,傳送給發(fā)送端。
B、擁塞窗口 Y
發(fā)送端緩沖區(qū)大小
C、數(shù)據(jù)傳輸窗口 Z
發(fā)送窗口的上限值 = Min [X, Y]
① 當(dāng) X < Y 時(shí),是接收端的接收能力限制數(shù)據(jù)傳輸窗口的大值。
② 當(dāng) Y < X 時(shí),則是網(wǎng)絡(luò)的擁塞限制數(shù)據(jù)傳輸窗口的大值。
滑動(dòng)窗口實(shí)例介紹:
數(shù)據(jù)傳輸 端已發(fā)送了 400 字節(jié)的數(shù)據(jù),但只收到對(duì)前 200 字節(jié)數(shù)據(jù)的確認(rèn),同時(shí)窗口大小不變。還可發(fā)送 300 字節(jié)。
數(shù)據(jù)傳輸端收到了對(duì)方對(duì)前 400 字節(jié)數(shù)據(jù)的確認(rèn),但對(duì)方通知數(shù)據(jù)傳輸端必須把窗口減小到 400 字節(jié)?,F(xiàn)在數(shù)據(jù)傳輸端最多還可發(fā)送 400 字節(jié)的數(shù)據(jù)。
滑動(dòng)窗口需掌握的知識(shí)點(diǎn):
A、數(shù)據(jù)接收端將自己可以接受的緩沖區(qū)大小放入TCP首部中“窗口大小”字段,通過(guò)ACK來(lái)通知數(shù)據(jù)傳輸端。
B、窗口大小字段越大,說(shuō)明網(wǎng)絡(luò)的吞吐率越高
C、窗口大小指的是無(wú)需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的大值,即就是說(shuō)不需要數(shù)據(jù)接收端的應(yīng)答,可以一次連續(xù)的發(fā)送數(shù)據(jù)。
D、操作系統(tǒng)內(nèi)核為了維護(hù)滑動(dòng)窗口,需要開辟發(fā)送緩沖區(qū),來(lái)記錄當(dāng)前還有哪些數(shù)據(jù)沒(méi)有應(yīng)答,只有確認(rèn)應(yīng)答過(guò)的數(shù)據(jù),才能從緩沖區(qū)刪除。 PS:發(fā)送緩沖區(qū)如果太大,會(huì)有空間開銷。
E、數(shù)據(jù)接收端一旦發(fā)現(xiàn)自己的緩沖區(qū)快滿了,就會(huì)將窗口大小設(shè)置成一個(gè)更小的值通知給數(shù)據(jù)傳輸端,數(shù)據(jù)傳輸端收到這個(gè)值后,就會(huì)減慢自己的發(fā)送速度。
F、如果數(shù)據(jù)接收端發(fā)現(xiàn)自己的緩沖區(qū)滿了,就會(huì)將窗口大小設(shè)置為0,此時(shí) 數(shù)據(jù)傳輸 端不再 傳輸數(shù)據(jù) ,但是需要在定期發(fā)送一個(gè)窗口探測(cè)數(shù)據(jù)段,使數(shù)據(jù)接收端把窗口大小告訴數(shù)據(jù)傳輸端。
PS:在TCP的首部,有一個(gè)16為窗口字段,此字段就是用來(lái)存放窗口大小信息的。
TCP報(bào)文段發(fā)送時(shí)機(jī)的選擇
1、TCP維持一個(gè)變量,它等于大報(bào)文段長(zhǎng)度MSS,只要緩存中存放的數(shù)據(jù)達(dá)到MSS字節(jié)就組裝成一個(gè)TCP報(bào)文段發(fā)送出去。
2、由發(fā)送方的應(yīng)用程序指明要求發(fā)送報(bào)文段,即TCP支持的推送操作。
3、是發(fā)送方的一個(gè)計(jì)時(shí)器期限到了,這時(shí)就把當(dāng)前已有的緩存數(shù)據(jù)裝入報(bào)文段發(fā)送出去。