网络知识点
一、内核网络栈代码:
BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。
分析socket结构:
state表示socket所处的状态,是一个枚举变量;
type是表示socket在特定协议族下的类型如SOCK_STREAM;
flags是一组标志位,用来设置socket是否正在忙碌;
wq是sock的等待队列,在TCP需要等待时就sleep在这个队列上;
file是回指指针;
sk是网络层对于socket的表示,sock是对socket的扩充;socket是inode结构中的一部分,即inode结构内部的一个union用作socket结构,如果把所有的结构成分放到socket结构中,inode结构中的union就会变得很大,对于其他文件会造成很大的浪费,但是在系统中使用inode结构的数量远远超过socket的数量,所以把插口分成两部分,把与文件系统相关的放在socket结构中,与通信相关的放在sock中。
ops协议相关的一组操作集;是依据协议绑定到该socket上的特定的协议族的操作函数指针,IPV4 TCP为inet_stream_ops;
INET socket层:BSD socket是个可以用于各种网络协议的接口,而当用于tcp/ip,即建立了AF_INET形式的socket时,还需要保留些额外的参数,于是就有了struct sock结构。
TCP/UDP层:处理传输层的操作,传输层用struct proto_ops和struct proto两个结构表示。
sk是网络层对于socket的表示,sk_prot和sk_prot_creator,这两个成员指向特定的协议处理函数集,其类型是结构体struct proto,该结构体也是跟struct proto_ops相似的一组协议操作函数集,struct proto_ops的成员操作struct socket层次上的数据,处理完了,再由它们调用成员sk->sk_prot的函数,操作struct sock层次上的数据。即它们之间存在着层次上的差异。struct proto类型的变量在协议栈中总共也有三个,分别是mytcp_prot,myudp_prot,myraw_prot,对应TCP, UDP和RAW协议。
sk_state表示socket当前的连接状态,是一个比struct socket的state更为精细的状态。
IP层:处理网络层的操作,网络层用struct packet_type结构表示。
这个结构是供属于不同协议的数据包使用的,用于数据链路层和网络层交互时,比如当有数据到来时通过其中的func指针调用网络层不同协议的函数来处理接收到的数据。此结构的实例存储在ptype_base[]数组中,每种协议都要定义一个packet_type结构,引导进入相关的协议数据处理函数,所有节点(packet_type结构)组成一个链表(HASH链表)。
一般各协议的packet_type结构都是静态存在,初始化时只提供type和func两个参数就可以了,每个协议在初始化时都要将此结构加入到系统类型链表中。
数据链路层和驱动程序:每个网络设备以struct net_device表示,通用的处理在dev.c中。
俩个大的数据结构sock和net_device 没有整理出来。