TCP接收缓存分析--缓存的初始化

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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值