我們都知道TCP是一個流媒體協議。與UDP相比,UDP可以保證整個客戶端消息作爲單個數據報被傳送到服務器(我們正在討論傳輸層,因此避免了MTU),TCP可以將一條「消息」(數據被傳遞給send
函數)分成幾個更小的數據包,所以我們必須使用我們自己的分隔符作爲消息的邊界。TCP如何分割其數據
現在的問題是 - TCP如何選擇哪些數據應該分段並按哪個大小?有沒有使用共同/標準的方法?
我們都知道TCP是一個流媒體協議。與UDP相比,UDP可以保證整個客戶端消息作爲單個數據報被傳送到服務器(我們正在討論傳輸層,因此避免了MTU),TCP可以將一條「消息」(數據被傳遞給send
函數)分成幾個更小的數據包,所以我們必須使用我們自己的分隔符作爲消息的邊界。TCP如何分割其數據
現在的問題是 - TCP如何選擇哪些數據應該分段並按哪個大小?有沒有使用共同/標準的方法?
TCP使用稱爲Maximum Segment Size參數:
的最大段大小(MSS)是TCP報頭,用於指定數據的量最大,以字節爲單位指定的選項字段的參數,即一個計算機或通信設備可以在單個TCP段中接收。它不計算TCP報頭或IP報頭。包含一個TCP段的IP數據報可以在一個數據包中獨立存在,也可以由多個分段的數據塊重構;無論哪種方式,MSS限制均適用於最終重建的TCP部分中包含的數據總量。
默認TCP最大分段大小爲536.如果主機希望將最大分段大小設置爲非默認值,則的最大分段大小被指定爲TCP選項,最初在TCP SYN分組中TCP握手。建立連接後無法更改該值。
如果啓用path MTU discovery,則將MSS設置爲減去TCP標頭大小。
在Linux TCP_MAXSEG
套接字選項控制參數:
如果這個選項被連接建立之前設置,也改變公佈的初始數據包的另一端的MSS值。 大於(最終)接口MTU的值不起作用。 TCP還將對所提供的價值施加其最小和最大範圍。
我發現網絡協議(如TCP)的解釋非常有趣:) – pjcognetta
好吧,它可以在TCP層(每個數據包最大到MSS)和IP層(每個數據包最多到MTU),對嗎? – FrozenHeart
@FrozenHeart是的,TCP將數據拆分成段,IP層拆分成碎片。 –
@Robᵩ那麼有沒有共同的規則或標準的碎片方法? – FrozenHeart
從應用程序中觀察不到。你想解決什麼問題? –
@Robᵩ這比實際的問題更具理論性。有趣的是知道這樣的事情 – FrozenHeart