TCP和UDP發送數據包的大小問題


用UDP協議發送時,用sendto函數最大能發送數據的長度為:65535-20-8=65507字節,其中20字節為IP包頭長度,8字節為UDP包頭長度。用sendto函數發送數據時,如果指的的數據長度大於該值,則函數會返回錯誤。

 
用TCP協議發送時,由於TCP是數據流協議,因此不存在包大小的限制(暫不考慮緩沖區的大小),這是指在
用send函數時,數據長度參數不受限制。而實際上,所指定的這段數據並不一定會一次性發送出去,如果這段數據比較長,可能會被分段發送,如果比較短,可能會等待和下一次數據一起發送。
我在測試的時候,發現長度一般會被切成16384(16K)或49152(48K),不知道這兩個值有什么意義。
比如在send()中設定發送數據的長度為100000,在接收端用recv()函數接收時,接收到的數據長度如下表:
start recvLen: 16384      nu: 0    type: 0
normal recvLen: 16384    nu: 0    type: 0
normal recvLen: 67232    nu: 0    type: 0
-------------------
normal recvLen: 49152    nu: 1    type: 1
normal recvLen: 49152    nu: 0    type: 0
normal recvLen: 1696    nu: -1208847736    type: -1207635502
-------------------
normal recvLen: 49152    nu: 2    type: 1
normal recvLen: 49152    nu: 0    type: 0
normal recvLen: 1696    nu: -1208847736    type: -1207635502
-------------------
從表中可以看出每次發送的100000byte的數據被拆成了3段,這3段長度加起來正好是100000。
經過測試得出如果將send()函數參數中的數據長度設為16384(16K),每次用recv()接收到的長度也為16384,而大於或小於這個值,都會被拆分或合並。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM