首頁>Club>
9
回覆列表
  • 1 # 百事魚塘

    MTU: Maximum Transmit Unit,最大傳輸單元,即物理介面(資料鏈路層)提供給其上層(通常是IP層)最大一次傳輸資料的大小;以普遍使用的乙太網介面為例,預設MTU=1500 Byte,這是乙太網介面對IP層的約束,如果IP層有<=1500 byte 需要傳送,只需要一個IP包就可以完成傳送任務;如果IP層有> 1500 byte 資料需要傳送,需要分片才能完成傳送,這些分片有一個共同點,即IP Header ID相同。

    MSS:Maximum Segment Size ,TCP提交給IP層最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用來限制application層最大的傳送位元組數,是tcp能傳送的分組的最大長度。

    MSS是系統預設的,就是系統TCP/IP棧所能允許的最大包。在建立連線時,這個值已經被確定了,這個值並不是客觀的值,而是由tcp/ip的實現確定的。

    如果底層物理介面MTU= 1500 byte,則 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte傳送,需要兩個segment才可以完成傳送,第一個TCP segment = 1460,第二個TCP segment = 540。

    A (MTU 1500) <——Internet ——> (MTU 1492) B

    見上圖,TCP SYN訊息,A 傳送給B 的MSS= 1460,告訴B,B發給A最大segment 為1460 byte

    TCP SYN訊息,B傳送給A的MSS= 1452,告訴A,A發給B最大segment 為1452 byte 。

    但A最終能一次發給B多大的位元組的segment呢???我們給它取名為:A_Send_MSS,取決於兩個值,一個是B的通告MSS= 1452;另一個是本地物理介面MTU的限制:1500-20-20= 1460。取這兩者較小的一個值,則

    A_Send_MSS = minimum ( 1452, 1460) = 1452

    同理可得

    B_Send_MSS = minimum ( 1460,1452)=1452

    可以看出這兩者最後是相同的,所以可以得到以下結論,通訊雙方最終的MSS = 雙方較小MTU- 40 。

    Socket傳送和接收緩衝區大小:按照我的理解,socket將TCP實現細節封裝成API,Socket雖然不等於TCP,但TCP的 send_buffer 和 receive_buffer 應該和socket 等同,用C語言的說法,就是指標相同,用通俗語言來說就是,相同的記憶體地址段。接收緩衝區receive_buffer 大小等同於自己通告的window size; 至於send_buffer 大小會影響application放入傳送緩衝區的速率,但是它應該不是瓶頸,所以不再討論它。

    TCP Window Size: 如果A傳送給B window size = 8192,意思是:B最多可以連續傳送8192 byte 給A,在A ACK這8192 byte之前。那A的這個8192byte 怎麼來的呢? 一般來說,8192byte就是A的接收緩區,A_Receive_Buffer= 8192,如果B不小心傳送超過8192 byte,如果application沒有及時取走,則超過8192 byte 資料可能會因為A_Receive_Buffer滿而被丟棄,所以B會嚴格遵守A的 advertised window size,如果A通告的window = 0,則B一定不會發送資料。

    Window Size 佔兩個byte,最大值為65535,看完下文你會發現它對對方傳送速率影響很大。如果window size 是高速網路頻寬的瓶頸,可以採用TCP Option scaling window 這個選項。

  • 中秋節和大豐收的關聯?
  • 俄羅斯一發射核武器,世界各國會咋樣應對?