Author:阿冬哥

Created:2013-4-17

Blog:http://blog.csdn.net/c359719435/

Copyright 2013 阿冬哥 http://blog.csdn.net/c359719435/

使用以及转载请注明出处

1 设置socket tcp缓冲区大小的疑惑
       疑惑1:通过setsockopt设置SO_SNDBUF、SO_RCVBUF这连个默认缓冲区的值,再用getsockopt获取设置的值,发现返回值是设置值的两倍。为什么?
通过网上查找,看到linux的内核代码/usr/src/linux-2.6.13.2/net/core/sock.c,找到sock_setsockopt这个函数的这段代码:
case SO_SNDBUF:

/* Don't error on this BSD doesn't and if you think

about it this is right. Otherwise apps have to

play 'guess the biggest size' games. RCVBUF/SNDBUF

are treated in BSD as hints */

if (val > sysctl_wmem_max)//val是我们想设置的缓冲区大小的值

val = sysctl_wmem_max;//大于最大值,则val值设置成最大值

sk->sk_userlocks |= SOCK_SNDBUF_LOCK;

if ((val * 2) < SOCK_MIN_SNDBUF)//val的两倍小于最小值,则设置成最小值

sk->sk_sndbuf = SOCK_MIN_SNDBUF;

else

sk->sk_sndbuf = val * 2;//val的两倍大于最小值,则设置成val值的两倍

/*

*      Wake up sending tasks if we

*      upped the value.

*/

sk->sk_write_space(sk);

break;

case SO_RCVBUF:

/* Don't error on this BSD doesn't and if you think

about it this is right. Otherwise apps have to

play 'guess the biggest size' games. RCVBUF/SNDBUF

are treated in BSD as hints */

if (val > sysctl_rmem_max)

val = sysctl_rmem_max;

sk->sk_userlocks |= SOCK_RCVBUF_LOCK;

/* FIXME: is this lower bound the right one? */

if ((val * 2) < SOCK_MIN_RCVBUF)

sk->sk_rcvbuf = SOCK_MIN_RCVBUF;

else

sk->sk_rcvbuf = val * 2;

break;

        从上述代码可以看出:(1)当设置的值val > 最大值sysctl_wmem_max,则设置为最大值的2倍:2*sysctl_wmem_max;
                                    (2)当设置的值的两倍val*2 > 最小值,则设置成最小值:SOCK_MIN_SNDBUF;
                                    (3)当设置的值val < 最大值sysctl_wmem_max,且 val*2 > SOCK_MIN_SNDBUF, 则设置成2*val。
查看linux 手册:
            SO_RCVBUF:              
                    Sets or gets the maximum socket receive buffer in bytes.  
                    The kernel doubles this value (to allow space for bookkeeping overhead) when it                     is set using setsockopt(2), 
                    and this doubled value is returned by getsockopt(2).
                    The default value is set by the /proc/sys/net/core/rmem_default file, 
                    and the maximum allowed value is set by the /proc/sys/net/core/rmem_max file.  
                    The minimum (doubled) value for this option is 256.
      查看我的主机Linux 2.6.6 :/proc/sys/net/core/rmem_max:
           4194304 //4M
      查看/proc/sys/net/core/wmem_max:
           8388608   //8M
     所以,能设置的接收缓冲区的最大值是8M,发送缓冲区的最大值是16M。
        疑惑2:为什么要有2倍这样的一个内核设置呢?我的理解是,用户在设置这个值的时候,可能只考虑到数据的大小,没有考虑数据封包的字节开销。所以将这个值设置成两倍。
注:overhead,在计算机网络的帧结构中,除了有用数据以外,还有很多控制信息,这些控制信息用来保证通信的完成。这些控制信息被称作系统开销。
        
2 tcp缓冲区大小的默认值
       建立一个socket,通过getsockopt获取缓冲区的值如下:
发送缓冲区大小:SNDBufSize = 16384
接收缓冲区大小:RCVBufSize = 87380 
        疑惑3:linux手册中,接收缓冲区的默认值保存在/proc/sys/net/core/rmem_default,发送缓冲区保存在/proc/sys/net/core/wmem_default。
[root@cfs_netstorage core]# cat /proc/sys/net/core/rmem_default
1048576
[root@cfs_netstorage core]# cat /proc/sys/net/core/wmem_default
512488
        可知,接收缓冲区的默认值是:1048576,1M。发送缓冲区的默认值是:512488,512K。为什么建立一个socket时得到的默认值是87380、16384???
        进一步查阅资料发现, linux下socket缓冲区大小的默认值在/proc虚拟文件系统中有配置。分别在一下两个文件中:
/proc/sys/net/ipv4/tcp_wmem
[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   131072  //第一个表示最小值,第二个表示默认值,第三个表示最大值。
/proc/sys/net/ipv4/tcp_rmem
[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_rmem
4096    87380   174760
       由此可见,新建socket,选取的默认值都是从这两个文件中读取的。可以通过更改这两个文件中的值进行调优,但是最可靠的方法还是在程序中调用setsockopt进行设置。通过setsockopt的设置,能设置的接收缓冲区的最大值是8M,发送缓冲区的最大值是16M(Linux 2.6.6中)。
另一文章中简单介绍:http://www.linuxidc.com/Linux/2012-08/68874.htm

1. tcp 收发缓冲区默认值
[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem  
4096    87380   4161536
87380  :tcp接收缓冲区的默认值
[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_wmem 
4096    16384   4161536
16384  : tcp 发送缓冲区的默认值

2. tcp 或udp收发缓冲区最大值
[root@ www.linuxidc.com]# 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@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_max  
131071
131071:tcp 或 udp 发送缓冲区最大可设置值得一半。
跟上面同一个道理

3. udp收发缓冲区默认值
[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_default   
111616:udp接收缓冲区的默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_default 
111616
111616:udp发送缓冲区的默认值

4. tcp 或udp收发缓冲区最小值
tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;
tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定

【Linux】tcp缓冲区大小的默认值、最大值相关推荐

  1. linux网卡缓冲区设置,【Linux】tcp缓冲区大小的默认值、最大值

    Author:阿冬哥 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 阿冬哥 http://blog.cs ...

  2. TCP缓冲区大小及限制

    TCP缓冲区大小及限制 这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数据报大小 IPv4的数据报最大大小是65535字节,包括IPv4首部.因为首部中说明大小的 ...

  3. TCP/IP学习(四)TCP缓冲区大小及限制

    这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数据报大小IPv4的数据报最大大小是65535字节,包括IPv4首部.因为首部中说明大小的字段为16位. IPv6的 ...

  4. Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...

    深夜睡不着,点根烟起来写点儿东西吧. 一个驱动程序除了具备读写设备的能力之外,其也应当具有对硬件控制的能力.在Windows下用户层代码使用API函数DeviceIoControl,通过传入驱动句柄, ...

  5. linux tcp 包大小,Linux TCP数据包接收处理 --- 转

    在接收流程一节中可以看到数据包在读取到用户空间前,都要经过tcp_v4_do_rcv处理,从而在receive queue中排队. 在该函数中,我们只分析当连接已经建立后的数据包处理流程,也即tcp_ ...

  6. linux tcp 包大小,linux – 通过大量连接和小数据包流量高的千兆网络提高TCP性能...

    我正在尝试通过"具有大量连接和小数据包流量的千兆网络"来提高TCP吞吐量.我的服务器操作系统是Ubuntu 11.10 Server 64bit. 有大约50.000(和不断增长的 ...

  7. linux 修改tmpfs大小,修改默认共享内存tmpfs大小

    通过挂载的方式在原有目录或新建目录改造 如: [root@luozhonghua /]# df -h Filesystem            Size  Used Avail Use% Mount ...

  8. socket接收与发送缓冲区大小

    1.查看默认设置 转自:https://www.cnblogs.com/x_wukong/p/8444557.html cat /proc/sys/net/core/rmem_max 212992ca ...

  9. linux tcp参数调优,Linux TCP 性能调优笔记

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 为了保证可靠连接,tcp 建立连接需要"三次握手",这三次握手对 tcp 的性能有至关重要的影响. ...

最新文章

  1. 在CISCO路由器上实现CHAP认证
  2. java CAS原语
  3. Fragment回调Activity的事件分发
  4. 智点创科机器人_秒会机器人教育_秒会机器人教育加盟_秒会机器人教育加盟费多少钱-武汉智点创科机器人科技发展有限公司-项目网...
  5. 大数据创业难度大 五个值得关注的重点
  6. 北师大听讲座-张建华-走近Russia
  7. 九十、Python的GUI系列 | QtDesigner进行界面设计
  8. 【数据结构与算法】之给Nx3网格图涂色的方案数的求解算法
  9. java实现远程系统控制_java实现电脑远程控制完整源代码
  10. iPhone SE 2生产无限期推迟,苹果决定推迟3月份产品发布会
  11. CodeSmith使用存档
  12. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?
  13. 多个字段排序_SQL | 汇总分析、排序、运行顺序
  14. Qunee学习开发体会
  15. Windows明文密码获取
  16. php zend debugger_PHPStorm 与 Zend Debugger
  17. AndroMDA Getting started(七)
  18. Vue上传图片图片,img标签显示图片
  19. Excel中如何将一列(行)数同时加减乘除同一个数
  20. WordPress正确使用51la统计来统计网站访问数据[WP教程]

热门文章

  1. mysql多重主键错误,老师,jd_spider中数据插入Mysql时一直显示主键错误,求助~
  2. in use 大学英语4word_2015年7月中国医科大学《大学英语4》在线作业答案
  3. mysql 去重_点赞功能,用 MySQL 还是 Redis ?
  4. ATOM插件库,收藏以备不时仔细!
  5. 第九天2017/04/18(1、友元函数、运算符重载)
  6. 【Java】泛型中 extends 和 super 的区别?
  7. MyBatis 源码分析系列文章合集
  8. Deep Learning 中文翻译
  9. 从命令行运行 MyBatis Generator
  10. Oracle编程入门经典 第9章 掌握SQL*Plus