linux的TCP/IP协议栈
以下是tcp_v4_init时间分析,这是在网 / / tcp_ipv4 C IPv4:tcp_inode,当然,是一个inode节点,并tcp_socket等于tcp_inode.u.socket_i,
它们通过指针指向相同的内存。
tcp_socket用于通信,可以称为TCP controlsocket或通信
套接字,当TCP通信没有相应的套接字时,套接字充当套接字角色。例如,当您在一个闭合端口上接收SYN时发送RST,或当握手为三时发送SYN(不接受新的套接字产生)。
值得注意的是,OPS ->创建函数调用,在我们的af_inet回调函数前看到这inet_create网 / / af_inet IPv4。C的函数,这个函数是用来创建一个套接字的使用,因为函数是比较长的,在这里我们跳过分析,第一分析只是一个大概的流程熟悉。
由于套接字的创建和通信,代码是与协议相关的,所以代码是从原始TCP C中提取出来的。
以下是tcp_init功能。在网络中,一般来说,它创建几个哈希表和桶。代码,并创建以下全局对象。
tcp_openreq_cachep
tcp_bucket_cachep
tcp_timewait_cachep
tcp_ehash
tcp_bhash
ehash代表establishedhash和bhash代表bindhash。当然,他们都是袜子。tcp_establishedstate < tcp_close满足现状,但我不知道是什么斗意味着这里。认识几个cachep作用不是很明显,特别是第二,摸不到头脑。因为整个功能主要是内存分配和错误处理,它不是贴在这里。
其次是icmp_init功能。在IPv4网 / / ICMP。C,事实上,如果在tcp_v4_init的ipproto_tcp取而代之的是ipproto_icmp,它基本上是相同的,其余的proc_net_register功能已经在它面前说,并不是要在这里说。
到目前为止,我们基本上应该了解Linux下IP堆栈的开始,并且有几个关键功能:
dev_add_pack:注册一个处理函数的链路层以上,这是一般的使用了新的网络层
协议,但如果重复登记时也可用,系统会设置一个复制点在这个时候。如果是eth_p_all,所有的数据包将被接收。这些元素都放在了ptype_all链表中的ptype_basehash链表。
inet_add_protocol:注册协议在IP层的建立,如TCP、UDP、等。
proc_net_register(以及类似的proc_register):
NET目录下,创建一个子目录条目,使Manager可以通过文件系统获取统计信息。
现在仍有许多谜题。一是结构的sk_buff每个成员的意义,一个是袜子的结构的意义,但这两个问题应该知道后。其次,我想分析每个协议之一,包括状态转换/数据传输/接收。