tcp協議是乙個全雙工的協議,當a與b建立好連線後,可以互相傳送資料,當a作為傳送方時,存在乙個傳送緩衝區,也就是說傳送的資料會先放置在傳送緩衝區處,而作為接收方的b會有乙個接收緩衝區,接收到的資訊會先儲存在接收緩衝處。
傳送視窗,則是傳送緩衝區的一部分。
傳送資料時通常是按位元組傳送,下面來看一張圖:
我們知道,tcp是乙個可靠的協議,當a傳送完一部分資料後,需要接收方回b發乙個確認資料報(ack),這樣,a才能繼續傳送接下來的資料,這也就是圖中顯示的情況,位於緩衝區中的視窗,首先,是已傳送並收到確認的報文,p1 - p2是a已經傳送出去但還未收到b回發確認資料報,此時,a將等待b傳送的ack資料報,p2 - p3為允許傳送但尚未傳送的資料,需要等待之前的資料的到確認這一部分資料才能夠傳送。
假設此時,從p1開始的3個位元組傳送成功(傳送成功表示傳送並且收到ack確認資料報),則視窗將會滑動:
可以看到,第31,32,33個位元組已得到確認,視窗整體向右移動3個位元組,第51,52,53位元組從不允許傳送變為允許傳送。
每次傳送成功後,傳送視窗便會在緩衝區中按順序移動,將新的資料報含至視窗中準備傳送
當a,b建立連線,進行資料傳送時,需要結合實際情況來控制傳送流量,假設b資料處理不過來,或者說緩衝區已滿,a則不能繼續向b傳送資料,這個關於b的緩衝區的資訊,將會包含在ack資料報中來告知a,當b的接收區視窗大小rwnd=0時,a將不再傳送,知道b的接收視窗空閒了,b再給a傳送通知,這樣變控制了流量。
有一種情況:
b的接收視窗滿後,回發給a告知暫停傳送,a處於阻塞等待,當b處理完資料給a傳送資料報時,這個資料報丟失了,那這就會出現死鎖的問題:a在等待b,b也在等待a,於是便存在乙個persist定時器(持續定時器),顧名思義,也就是說a會間隔固定時間後嘗試的傳送乙個資料,探測b是否可以接收資料,若b回發了ack資料報,則又進入了之前的工作狀態。
想象一下,當傳送資料時每次都只傳送乙個或幾個幾字,而tcp的頭就佔據了40個位元組,很明顯這樣的傳送效率是極低的,這就要涉及到nagle演算法了。
nagle演算法:盡可能的多傳送幾個位元組,避免網路因為太多的小包(協議頭的比例非常之大而擁塞),因此,只允許乙個未被確認的ack報文存在於網路。怎麼理解最後一句話呢,也就是說傳送了乙個資料報在沒有接收到ack確認之前,不允許在傳送新的資料報。nagle演算法包括以下特點來提高傳輸的效率:
int on =1;
setsockopt
(fd,sol_tcp,tcp_cork,
&on,
sizeof
(on)
);
TCP 滑動視窗協議
什麼是滑動視窗協議?一圖勝千言,看下面的圖。簡單解釋下,傳送和接受方都會維護乙個資料幀的序列,這個序列被稱作視窗。傳送方的視窗大小由接受方確定,目的在於控制傳送速度,以免接受方的快取不夠大,而導致溢位,同時控制流量也可以避免網路擁塞。下面圖中的4,5,6號資料幀已經被傳送出去,但是未收到關聯的ack...
TCP 滑動視窗協議
本系列文章是博主學習tcp協議以來的個人筆記。博主不能保證本文所述 內容絕對正確,所 以請讀者抱著懷疑的態度閱讀本部落格內的文字。如果讀 者因本部落格內的文字造成損失,本人 無力負責。如果有任何謬誤或者問題,希望讀者不吝賜教。在遍布世界的網際網路線路上進行可靠的資料傳輸談何容易,一來傳輸介質 有差異...
TCP 滑動視窗協議
什麼是滑動視窗協議?一圖勝千言,看下面的圖。簡單解釋下,傳送和接受方都會維護乙個資料幀的序列,這個序列被稱作視窗。傳送方的視窗大小由接受方確定,目的在於控制傳送速度,以免接受方的快取不夠大,而導致溢位,同時控制流量也可以避免網路擁塞。下面圖中的4,5,6號資料幀已經被傳送出去,但是未收到關聯的ack...