一個TCP連接能傳輸的最大數據量是不是2的32次方,就是4GB?
如題。
因為TCP報文按照位元組編號,發送序號只有32位,所以一方能夠發送的數據最多只有2^32個位元組,就是4GB大小?對不。如果考慮時間戳的作用,是不是一個TCP的連接傳輸的數據量就不受限制?
不是。(2^32-1)+1=0,此時0序號是正確的,畢竟都到那個時候了,2^32之前的數據剛傳到是不大可能的,在路由中跳那麼久的包絕大多數都被丟棄了。
那麼問題來了,真的存在那麼噁心的網路環境,轉發極慢,前一個0在後一個0該到達時到了怎麼辦?
那就是傳輸錯誤。不過,在如此噁心的網路環境下,4G之前基本已經產生錯誤甚至連接斷了吧?在這種網路下不使用下載軟體,直接另存為的人,心真是大。那麼第二個問題來了,如果真的在某種環境下,前一個0在其他地方遊盪的時間內,已經成功並且無錯傳輸了4G數據,並且本地io已成功緩存了呢?
那麼,既然你確定要干如下事情1.購買超高速超高可靠的網路設備和IO設備2.這樣的網路環境居然有一條可達路由的延遲能超過傳4G的時間,並且事先不做工作。3.這樣的設備僅僅用於同一時間只有一個網路連接和業務4.這樣的業務下依舊使用某種最小不可分割塊大小大於4G的數據組織方式5.直接使用tcp一次性傳輸4G不加任何封裝和處理6.收到後不校驗。那麼,你贏了,確實最大傳4G。網路問題是個工程問題,不是一個科學問題。所有網路問題都要基於現實情況。序號用來標識從TCP發端向TCP收端發送的數據位元組流,它表示在這個報文段中的的第一個數據位元組。如果將位元組流看作在兩個應用程序間的單向流動,則TCP用序號對每個位元組進行計數。序號是32 bit的無符號數,序號到達2^32-1後又從0開始。
《TCP/IP詳解》卷1 - 172頁
ps:我自己寫的基於TCP的網路庫,已經在伺服器上跑了幾個月的穩定性測試,具體內容是以每包4kb大小在一個TCP連接上來回傳輸測試數據,已經累計傳輸了幾百GB數據。TCP是非常穩定並且可靠的。tcp的sequence number主要是為了解決數據包排序的問題,sequence number的連續性可以保證tcp能把收到亂序的報文重新排列成原來的順序
seq達到4G上限後重新開始計數,只要tcp知道後續這個小seq的包是排在4G這個後面的就ok不是,序列號可以迴繞的
TCP序號和能傳輸多大數據有什麼關係?10個人只能搬10桶水?
TCP序號與TCP payload大小有什麼關係!
首先你要明白這個序號是幹嘛用的...如果我沒有記錯的話,這個序號是排序和重傳的時候使用. 那麼對於已經被正常處理掉的數據,這個序號就沒有意義了. 所以,這個序號真正生效的位置是傳輸和處理過程中的數據. 換句話說,這個序號的目的是唯一標識傳輸和處理時延下"待確認"的數據.
想像一個傳送帶,這個傳送帶上能放7件貨,
那我使用3位,就可以把上面的貨標記成6,5,4,3,2,1,0對方收到了一件,我再放一件上去,現在的序號就是7,6,5,4,3,2,1;對方收到了,我再放一件上去,就可以繼續標記成0,7,6,5,4,3,2.那你說之前0已經用過了!!!
who care?我只要能唯一標識傳送帶上的貨物就可以了,之前的數據已經被接收方正確接收了,之後的關我毛事.所以說,這玩意兒用到最大之後會繼續從最小標記開始使用.
但是有可能出現一種情況,假設我只使用3位,
比如我經過長年堅持不懈的鍛煉,手速比較快,我可以一次放10個貨物到傳送帶上,
如果使用3位標記就會出現0,1,2,3,4,5,6,7,0,1,那麼處於傳送過程中或者說未被確認的數據中,就會出現序號衝突,假設,這時候有個0號數據丟失了,請求重傳的時候,說我要0,發送方懵逼了,我已經發了N個0號了,你要哪個?於是,雙方懵逼.
所以就要使用一個足夠大,大到超過任何傳輸和處理時延下"待確認"的數據量的序號. 那一年,選擇了32位.
看到 @車小胖大神關注了這個問題,有點心虛,不知道回答的有沒有錯誤. 畢竟我不做大哥...哦...不對,畢竟我不幹網路好多年,學的東西基本都還回去了. 如有錯誤,煩請指正.準確的說,錯。
因為一般序號並不是從0開始計算的。
如果,僅限如果,序號從0開始計。到達接收序號上限後再收新的包會觸發rst包的發送,連接結束,所以正常最大應該只能傳4g。推薦閱讀:
※epoll非阻塞伺服器,在20k並發測試結束產生大量establish狀態假連接,可能原因?
※Linux下Socket開發簡易Tcp伺服器
※在 TCP/IP 協議中,客戶端發出請求,服務端回復響應,客戶端在數據鏈路層會校驗目的 MAC 地址嗎???
※為什麼多 TCP 連接分塊下載比單連接下載快?
※TCP Slow Start cause Tail Drop on interface with limited buffer
TAG:TCP |