TCP,UDP数据包的大小以及MTU
TCP、UDP數據包大小的確定
????UDP和TCP協議利用端口號實現多項應用同時發送和接收數據。數據通過源端口發送出去,通過目標端口接收。有的網絡應用只能使用預留或注冊的靜態端口;而另外一些網絡應用則可以使用未被注冊的動態端口。因為UDP和TCP報頭使用兩個字節存放端口號,所以端口號的有效范圍是從0到65535。動態端口的范圍是從1024到65535。
??? MTU最大傳輸單元,這個最大傳輸單元實際上和鏈路層協議有著密切的關系,EthernetII幀的結構DMAC+SMAC+Type+Data+CRC由于以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64bytes最大不能超過1518bytes,對于小于或者大于這個限制的以太網幀我們都可以視之為錯誤的數據幀,一般的以太網轉發設備會丟棄這些數據幀。
??? 由于以太網EthernetII最大的數據幀是1518Bytes這樣,刨去以太網幀的幀頭(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes那么剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes這個值我們就把它稱之為MTU。
UDP?包的大小就應該是?1500 - IP頭(20) - UDP頭(8) = 1472(BYTES)
TCP?包的大小就應該是?1500 - IP頭(20) - TCP頭(20) = 1460 (BYTES)
注*PPPoE所謂PPPoE就是在以太網上面跑“PPP”。隨著寬帶接入(這種寬帶接入一般為Cable Modem或者xDSL或者以太網的接入),因為以太網缺乏認證計費機制而傳統運營商是通過PPP協議來對撥號等接入服務進行認證計費的,所以引入PPPoE。PPPoE導致MTU變小了以太網的MTU是1500,再減去PPP的包頭包尾的開銷(8Bytes),就變成1492。不過目前大多數的路由設備的MTU都為1500。
????如果我們定義的TCP和UDP包沒有超過范圍,那么我們的包在IP層就不用分包了,這樣傳輸過程中就避免了在IP層組包發生的錯誤;如果超過范圍,既IP數據報大于1500字節,發送方IP層就需要將數據包分成若干片,而接收方IP層就需要進行數據報的重組。更嚴重的是,如果使用UDP協議,當IP層組包發生錯誤,那么包就會被丟棄。接收方無法重組數據報,將導致丟棄整個IP數據報。UDP不保證可靠傳輸;但是TCP發生組包錯誤時,該包會被重傳,保證可靠傳輸。
????UDP數據報的長度是指包括報頭和數據部分在內的總字節數,其中報頭長度固定,數據部分可變。數據報的最大長度根據操作環境的不同而各異。從理論上說,包含報頭在內的數據報的最大長度為65535字節(64K)。
??? 我們在用Socket編程時, UDP協議要求包小于64K,TCP沒有限定。
??? 不過鑒于Internet上的標準MTU值為576字節,所以建議在進行Internet的UDP編程時,最好將UDP的數據長度控制在548字節 (576-8-20)以內。
?
就具體函數而言:
????用UDP協議發送時,用sendto函數最大能發送數據的長度為:65535- IP頭(20) - UDP頭(8)=65507字節。用sendto函數發送數據時,如果發送數據長度大于該值,則函數會返回錯誤。??
??? 用TCP協議發送時,由于TCP是數據流協議,因此不存在包大小的限制(暫不考慮緩沖區的大小),這是指在用send函數時,數據長度參數不受限制。而實際上,所指定的這段數據并不一定會一次性發送出去,如果這段數據比較長,會被分段發送,如果比較短,可能會等待和下一次數據一起發送。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的TCP,UDP数据包的大小以及MTU的全部內容,希望文章能夠幫你解決所遇到的問題。