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

5190阅读 0评论2017-03-24 frankzfz
分类:LINUX

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;


上一篇:使用SPEC文件编译内核rpm包
下一篇:TCP接收窗口--确定Window