Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4441824
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: LINUX

2017-03-24 10:21:24

1.1 使用系统默认的buf


 在创建socket的时候,会在inet_create 调用sock_init_data函数,然后对sk_sndbufsk_rcvbuf的设置,下面是对这两个buf的设置,但是会被后面的tcp_v4_init_sock重新赋值修改,

sk->sk_rcvbuf      =    sysctl_rmem_default;

 sk->sk_sndbuf      =    sysctl_wmem_default;

如果用户空间没有使用setsockopt函数的SO_RCVBUF参数设置接收缓存时,其初始化的值在tcp_v4_init_sock函数中确定:


sk->sk_sndbuf = sysctl_tcp_wmem[1];

 sk->sk_rcvbuf = sysctl_tcp_rmem[1];  

1.2 用户空间配置buf

1) 如果用户使用的setsocketopt设置了SO_RCVBUF,则进入下面的逻辑配置sk_rcvbuf

点击(此处)折叠或打开

  1. case SO_RCVBUF:
  2.         val = min_t(u32, val, sysctl_rmem_max);//用户设置的值不能大于sysctl_rmem_max
  3. set_rcvbuf:
  4.         sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
  5. /* #define SOCK_MIN_RCVBUF         TCP_SKB_MIN_TRUESIZE
  6. #define TCP_SKB_MIN_TRUESIZE    (2048 + SKB_DATA_ALIGN(sizeof(struct sk_buff))) */
  7.         sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF);
  8.         break;
从上面的代码可以看出,实际的sk_rcvbuf的值,最小值为SOCK_MIN_RCVBUF ,否则为用户设置的2倍。

点击(此处)折叠或打开

  1. 2)sk_sndbuf
  2.     case SO_SNDBUF:
  3.         val = min_t(u32, val, sysctl_wmem_max);
  4. set_sndbuf:
  5.         sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
  6.         sk->sk_sndbuf = max_t(u32, val * 2, SOCK_MIN_SNDBUF);
  7.         /* Wake up sending tasks if we upped the value. */
  8.         sk->sk_write_space(sk);
  9.         break;


阅读(4991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~