TCP协议的初始化(以TCP协议为入口分析协议栈协议的注册与使用,其他协议类型触类旁通)
TCP/IP协议栈初始化开始的时候由
fs_initcall
函数把
inet_init
注册到
linux
的启动表项中,TCP协议的初始化也是有
inet_init
开始的。
从内核的源代码中可以看到,在
inet_init
中分别对
ARP/IP/TCP/UDP/ICMP
协议和
IPv4
的
proc
部分进行了初始化,对除了TCP协议之外的协议的初始化我们会在其他的博文中介绍。
协议注册部分请参见博文:
TCP/IP协议栈源码图解分析系列1:协议的注册
其中需要补充说明的部分包括:tcp_sockets_allocated、 tcp_orphan_count,其他的部分图中已经进行了相关的解释。
A. tcp_sockets_allocated
1. tcp_sockets_allocated 类型的定义
struct percpu_counter {
spinlock_t lock;
s64 count;
#ifdef CONFIG_HOTPLUG_CPU
struct list_head list;
/* All percpu_counters are on a list */
#endif
s32 __percpu *counters;
};
struct percpu_counter tcp_sockets_allocated;
2. tcp_sockets_allocated 功能作用
tcp_sockets_allocated 用于对当前TCP sockets数目的统计,相当于TCP的counter, tcp_sockets_allocated 会在tcp_v4_init_sock用于初始化socket的时候加1,其操作函数为
percpu_counter_inc(&tcp_sockets_allocated); 在TCP协议销毁socket的时候通过
tcp_v4_destroy_sock函数调用
percpu_counter_dec(&tcp_sockets_allocated)来对
tcp_sockets_allocated 的值减1.
B.tcp_orphan_count
tcp_orphan_count 被注册到tcp_prot.orphan_count中, orphan_count会在tcp_close的时候对无法完成发送的数据包进行统计,对其操作的函数与tcp_sockets_allocated 相同,都为函数对
percpu_counter_inc与
percpu_counter_dec。