關於TCP的流量控制的一些小知識

所謂流量控制,就是讓發送方的發送速率不要太快,讓接收方來得及接收。
與流量控制有關的幾個小知識:
堅持定時器:每次給對方發送ack的時候,會同時發送一個接收窗口的大小值,告訴對方我還可以接收多少數據,單位爲字節。如果接收窗口的大小爲0,對方就不發送數據了,如果在接收窗口變爲0之後的某一個時刻,我又有窗口可以接收你的數據了,就給對方發送一個通知報文,報文裏面帶着接收窗口的大小值,而這個告訴對方可以發送數據的報文丟失了,客戶端就在一直等待帶有非0窗口值的報文,而我覺得我已經告訴你我可以接收報文了,就一直等待對方的報文,就會發生死鎖。這時候就需要一個堅持定時器,收到窗口值爲0的時候開始計時,若計時器設定的時間到了,還沒有收到可以發送數據的非0窗口的報文,就發起探測報文,去問問你的接收窗口是不是還是0啊,如果收到迴應,窗口值依然爲0,則繼續等待,否則,死鎖的僵局就可以打破了。
Nagle算法:如果想要發送一個內容長度爲1字節的報文,就要加上20字節的TCP首部,再加上20字節的IP首部,這樣爲了發一個內容爲1字節的報文,就要在網絡上傳輸41字節的報文。如果算上響應報文,又需要40字節的響應報文,總計爲了發一個內容爲1字節長度的報文,需要在網絡上傳輸81字節的報文。爲了避免這種對網絡帶寬的極度浪費,就可以使用Nagle算法:如果應用進程逐個字節的將報文送到發送緩衝區,就先將第一個字節的報文發送出去,其他剩餘的字節在發送緩衝區內緩存,當第一個字節的響應到了,再將發送緩衝區內已有的報文組裝成一個報文發送出去,如果發送緩衝區內到達的數據已經超過了發送窗口的一半,就不需要等待,直接發送,這樣做,可以有效的提高網絡的吞吐量。
糊塗窗口綜合症:如果發送窗口有一個字節的剩餘,就將這一個字節的窗口大小發送給對方,對方發送一個字節的數據,隨後又有一個字節的剩餘,就又給對方說,我這有一個字節的空間,你發過來一個字節的數據吧,對方就又發過來一個字節,這樣一個字節一個字節的發送數據,好繁瑣啊,網絡的效率也太低了。要像解決這個糊塗的問題,可以讓接收方等待一段固定時間或者等到接受緩衝區已經存了一半大小的空閒空間的時候才告訴對方我的窗口大小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章