tcp與udp緩衝區大小總結

1.tcp收發緩衝區默認值  
[root@localhost /]# cat /proc/sys/net/ipv4/tcp_rmem
4096    87380   4194304
87380  :tcp接收緩衝區的默認值  
[root@localhost /]# cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304
16384  : tcp發送緩衝區的默認值  
 
2.udp收發緩衝區默認值
[root@localhost /]# cat /proc/sys/net/core/rmem_default
110592
110592:udp接收緩衝區的默認值
[root@localhost /]# cat /proc/sys/net/core/wmem_default
110592
110592:udp發送緩衝區的默認值
 
3. tcp 或udp收發緩衝區最大值
[root@localhost /]# cat /proc/sys/net/core/rmem_max
131071
131071:tcp 或 udp 接收緩衝區最大可設置值的一半。
也就是說調用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);  時rcv_size 如果超過 131071,那麼
getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等於 131071 * 2 = 262142  
[root@localhost /]# cat /proc/sys/net/core/wmem_max  131071
131071:tcp 或 udp 發送緩衝區最大可設置值得一半。
跟上面同一個道理  
 
4. tcp 或udp收發緩衝區最小值
tcp 或udp接收緩衝區的最小值爲 256 bytes,由內核的宏決定;
tcp 或udp發送緩衝區的最小值爲 2048 bytes,由內核的宏決定
 
例子:
int iSock = -1;
iSock = socket(AF_INET, SOCK_DGRAM, 0);
int iRecvLen = 300*1024;
int iRecvLen_2 = 0;
int iOptlen = 4;
int iRet = -1, iRet_2 = -1;
iRet = setsockopt(iSock, SOL_SOCKET, SO_RCVBUF, &iRecvLen, 4);
iRet_2 = getsockopt(iSock, SOL_SOCKET, SO_RCVBUF, &iRecvLen_2, &iOptlen);
printf("RecvLen 2 is %d[%d:%d].\n", iRecvLen_2, iRet, iRet_2);
如果默認的udp緩衝區的最大值爲 110592 Bytes,當通過setsockopt()函數想將其設置爲300KB時,超過了最大上限的2倍,因此用getsockopt()函數獲取實際設置的緩衝區長度爲221184Bytes(110592*2)。
發佈了49 篇原創文章 · 獲贊 16 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章