struct options *opt;//IP选项缓冲于此处 volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */ unsigned long write_...
/* 接收缓冲区大小的上限,默认值是sysctl_rmem_default(sock_init_data),即32767, 也就是IP首部16位长度(最大65535)的一半*/ //当sock接收到一个包的时候,会在sock_queue_rcv_skb中判断当前队列中已有的skb占用的buffer和这个新来的buff之后是否超过了sk_rcvbuf int sk_rcvbuf; /* * 套接字过滤器。在传...
最大不超过sock写队列内存限额的最大值。 sk_rcvbuf:接收缓冲区大小。最大不超过sock读队列内存限额的最大值。 sk_forward_alloc:发送队列中可以直接使用的空间大小,是指已经分配了但尚未使用的空间。 sk_wmem_queued:发送队列所占空间,仅用于STREAM类型协议,替代sk_wmem_alloc。最大不能超过发送缓冲区大小。 接口...
struct options *opt;//IP选项缓冲于此处 volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */ unsigned long write_...
* @sk_rcvbuf: size of receive buffer in bytes * @sk_wq: sock wait queue and async head * @sk_rx_dst: receive input route used by early demux * @sk_dst_cache: destination cache * @sk_policy: flow policy * @sk_receive_queue: incoming packets ...
u32 limit = sk->sk_rcvbuf + sk->sk_sndbuf; limit += 64*1024; skb_condense(skb); if (unlikely(sk_add_backlog(sk, skb, limit))) { bh_unlock_sock(sk); return true; } return false; } 函数sk_add_backlog如下,如果即便内核增加了64K的缓存限额,backlog链表占用的空间与套接口接收缓存之...
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
它们是:rcvbuf和sndbuf。rmem_alloc和rcvbuf,wmem_alloc和sndbuf用于不同的目的。当我们收到一个数据包后,需要统计这个socket总共消耗的内存,这是通过skb_set_owner_r()来做的。 static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk) { skb->sk = sk; skb->destructor = sock_r...
if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || !sk_rmem_schedule(sk, skb, size)) { if (tcp_prune_queue(sk) < 0) return -1; while (!sk_rmem_schedule(sk, skb, size)) { if (!tcp_prune_ofo_queue(sk)) return -1; ...
sk_buff详解