原文轉自:http://blog.csdn.net/sicofield/article/details/9708311算法
爲了提升信道的利用率TCP協議不使用中止等待協議,而是使用連續ARQ協議,意思就是能夠連續發出若干個分組而後等待確認,而不是發送一個分組就中止並等待該分組的確認。緩存
TCP的兩端都有發送/接收緩存和發送/接收窗口。TCP的緩存是一個循環隊列,其中發送窗口能夠用3個指針表示。而發送窗口的大小受TCP數據報中窗口大小的影響,TCP數據報中的窗口大小是接收端通知發送端其還能夠接收多少數據,因此發送窗口根據接收的的窗口大小的值動態變化。網絡
如下的幾張圖片就幫助理解一下滑動窗口的機制:數據結構
注意上圖中的3個指針P一、P二、P3!此時接收窗口中接收的數據多是失序的,可是也先存儲在接收緩存之中。發送確認號的時候依然發送31,表示B指望接收的下一個數據報的標示符是31。.net
當B收到31後連同以前接收到的數據報,發送確認號34,此時A的滑動窗口能夠向前移動了。指針
若是發送窗口中的數據報都屬於已發送但未被確認的話,那麼A就不能再繼續發送數據,而須要進行等待。blog
所謂流量控制就是讓發送發送速率不要過快,讓接收方來得及接收。利用滑動窗口機制就能夠實施流量控制。隊列
原理這就是運用TCP報文段中的窗口大小字段來控制,發送方的發送窗口不能夠大於接收方發回的窗口大小。圖片
考慮一種特殊的狀況,就是接收方若沒有緩存足夠使用,就會發送零窗口大小的報文,此時發送放將發送窗口設置爲0,中止發送數據。以後接收方有足夠的緩存,發送了非零窗口大小的報文,可是這個報文在中途丟失的,那麼發送方的發送窗口就一直爲零致使死鎖。get
解決這個問題,TCP爲每個鏈接設置一個持續計時器(persistence timer)。只要TCP的一方收到對方的零窗口通知,就啓動該計時器,週期性的發送一個零窗口探測報文段。對方就在確認這個報文的時候給出如今的窗口大小(注意:TCP規定,即便設置爲零窗口,也必須接收如下幾種報文段:零窗口探測報文段、確認報文段和攜帶緊急數據的報文段)。
TCP的數據傳輸分爲交互數據流和成塊數據流,交互數據流通常是一些交互式應用程序的命令,因此這些數據很小,而考慮到TCP報頭和IP報頭的總和就有40字節,若是數據量很小的話,那麼網絡的利用效率就較低。
數據傳輸使用Nagle算法,Nagle算法很簡單,就是規定一個TCP鏈接最多隻能有一個未被確認的未完成的小分組。在該分組的確認到達以前不能發送其餘的小分組。
可是也要考慮另外一個問題,叫作糊塗窗口綜合症。當接收方的緩存已滿的時候,交互應用程序一次只從緩存中讀取一個字節(這時候緩存中騰出一個字節),而後向發送方發送確認信息,此時發送方再發送一個字節(收到的窗口大小爲1),這樣網絡的效率很低。
素以要解決這個問題,可讓接收方等待一段時間,使得接收緩存已有最夠的空間容納一個最長報文段,或者等到接收緩存已有一半的空間。只要這兩種狀況出現一種,就發送確認報文,同時發送方能夠把數據積累成大的報文段發送。