| 2009年11月11日
在内核中ipv4的初始化工作是由这个函数来做的。
static int __init inet_init(void)
而这个函数一开始要做的事就是注册协议族。如下:
rc = proto_register(&tcp_prot, 1);//注册tcp的协议族
。。。
rc = proto_register(&udp_prot, 1);//注册udp的协议族
。。。
rc = proto_register(&raw_prot, 1);//注册raw原始协议族
。。。
这些协议族都注册到proto_list这个链表上了,
static LIST_HEAD(proto_list);
关于已经注册的协议族的信息可以在/proc/net/protocols中查看。 如下,在我的系统中已经注册的协议族有PACKET,RAWv6,UDPLITEv6,UDPv6,TCPv6 ,UNIX,UDP-Lite, RAW,UDP ,TCP,NETLINK 这里表示了这些协议族的使用情况和使用的内存分配方式,以及已经实现的方法。
而这些信息都是由net/core/sock.c 中的proto_seq_printf函数打印输出到protocols文件中的。原型如下:
static void proto_seq_printf(struct seq_file *seq, struct proto *proto)
在proc系统下对应的文件是/proc/net/protocols
helight@zhwen:/proc/net$ cat protocols
protocol size sockets memory press maxhdr slab module cl co di ac io in de sh ss gs se re sp bi br ha uh gp em
PACKET 520 0 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n
RAWv6 680 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n
UDPLITEv6 664 0 -1 NI 0 yes kernel y y y n y y y n y y y y n n y y y y n
UDPv6 664 0 1 NI 0 yes kernel y y y n y n y n y y y y n n y y y y n
TCPv6 1332 1 31 no 304 yes kernel y y y y y y y y y y n y n n y y y y y
UNIX 452 326 -1 NI 0 yes kernel n n n n n n n n n n n n n n n n n n n
UDP-Lite 536 0 -1 NI 0 yes kernel y y y n y y y n y y y y y n y y y y n
RAW 516 0 -1 NI 0 yes kernel y y y n y y y n y y y y n y y y y n n
UDP 536 3 1 NI 0 yes kernel y y y n y n y n y y y y y n y y y y n
TCP 1204 21 31 no 304 yes kernel y y y y y y y y y y n y n n y y y y y
NETLINK 460 6 -1 NI 0 no kernel n n n n n n n n n n n n n n n n n n n
其中这里的cl co di ac io in de sh ss gs se re sp bi br ha uh gp em分别表示以下函数的实现。
proto_method_implemented(proto->close),
proto_method_implemented(proto->connect),
proto_method_implemented(proto->disconnect),
proto_method_implemented(proto->accept),
proto_method_implemented(proto->ioctl),
proto_method_implemented(proto->init),
proto_method_implemented(proto->destroy),
proto_method_implemented(proto->shutdown),
proto_method_implemented(proto->setsockopt),
proto_method_implemented(proto->getsockopt),
proto_method_implemented(proto->sendmsg),
proto_method_implemented(proto->recvmsg),
proto_method_implemented(proto->sendpage),
proto_method_implemented(proto->bind),
proto_method_implemented(proto->backlog_rcv),
proto_method_implemented(proto->hash),
proto_method_implemented(proto->unhash),
proto_method_implemented(proto->get_port),
proto_method_implemented(proto->enter_memory_pressure));
关注「黑光技术」,关注大数据+微服务