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中)。

socket tcp缓冲区大小的默认值、最大值的更多相关文章

  1. 【Linux】tcp缓冲区大小的默认值、最大值

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

  2. TCP缓冲区大小及限制

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

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

    链接来自:http://blog.csdn.net/ysu108/article/details/7764461 这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数 ...

  4. udp之关于linux udp收发包缓冲区大小

    1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...

  5. 网络编程之UDP(2)linux查看socket默认缓冲区大小和最大值

    默认值 命令: cat /proc/sys/net/core/rmem_default 结果: 最大值 命令: cat /proc/sys/net/core/rmem_max 结果:

  6. Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

    Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

  7. 修改帧大小和socket缓冲区大小(转)

    修改帧大小和socket缓冲区大小 MTU (最大传输单元)的缺省值为1500. 通过下面命令将其改为9000(jumbo frame) % ifconfig eth0 mtu 9000 socket ...

  8. [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小

    Windows 命令行 cmd 窗口系统默认的大小(80*40)对于现在的屏幕配置已经跟不上时代了,我们总是要把它改大些,而且缓冲区大小也想改得大大的.单纯的为当前的 Windows 命令行窗口修改显 ...

  9. 如何设置 Windows 默认命令行窗口大小和缓冲区大小

    关键字: 命令行不能全屏 命令行最大化只有一半屏幕 命令行 字体 背景 颜色 解决方案:http://unmi.cc/save-windows-command-size/ 简要说明: win+r,输入 ...

随机推荐

  1. TcxGrid 调整列位置的事件

  2. Java 接口关键字 interface

    interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现,它允许创建者确定方法名.参数列表和返回类型,但没有任何方法体,接口只提供了形式,而未提供任何具体实现 一个接口表示:& ...

  3. hdu 1754 线段树(单点替换 区间最值)

    Sample Input5 61 2 3 4 5Q 1 5 //1-5结点的最大值U 3 6 //将点3的数值换成6Q 3 4Q 4 5U 2 9Q 1 5 Sample Output5659 # i ...

  4. Codeforces 466E Information Graph

    Information Graph 把询问离线之后就能随便搞了, 去check一下是不是祖先, 可以用倍增也能用dfs序. #include<bits/stdc++.h> #define ...

  5. codeM编程大赛E题 (暴力+字符串匹配(kmp))

    题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...

  6. 001.Chrony时间服务器

    一 Chrony概览 1.1 Chrony简介 Chrony是一个开源的自由软件,是网络世界协议(NTP)的另一种实现,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成: ...

  7. Qt代码创建分隔条

    我们在使用Qt时,会发现在使用UI界面时可以添加窗口分隔条,但我们使用纯代码时却没有分隔条的类函数.这时候我们就需要手动添加,添加方式和Qt自定义标签按钮一样,下面我直接写代码.如果不知道怎么添加的, ...

  8. linux学习笔记-10.解压与压缩

    1.gzip压缩 gzip a.txt 2.解压 gunzip a.txt.gzgzip -d a.txt.gz 3.bzip2压缩 bzip2 a 4.解压 bunzip2 a.bz2bzip2 - ...

  9. Java8 Lambda 之 Collection Stream

    Lambda 之 Collection Stream Collection.stream() 测试实体类 class Demo { private Long id; private String na ...

  10. tornado登陆装饰器

    tornado作为鼎鼎大名的web异步框架,用来作为高性能服务器以及web框架都是首选.自从python3.4加入了asyncio原生协程后,tornado的最新版本也开始使用了原生的协程.定义协程函 ...