欢迎光临散文网 会员登陆 & 注册

详细了解Linux内核网络协议栈socket、sock、sk_buff,etc(含内核源码)

2022-03-28 20:07 作者:补给站Linux内核  | 我要投稿
  • 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关于网络栈中数据包的状态,地址,端口等信息都封装在对应的结构中,可以说,了解这些数据结构是理解网络栈源码的基础,这里我们就来了解下网络协议栈中的各类数据结构。

1、socket

  • (include\linux\Socket.h)该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层面也会有涉及,但很少。



【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100名进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码) 


2、sock

  • (include\linux\Net.h) sock 使用范围比socket 要大得多,sock结构的使用基本贯穿硬件层、设备接口层、ip层、INET socket 层,而且是作为各层之间的一个联系,主要是因为无论是发送还是接收的数据包都要被缓存到sock 结构中的缓冲队列中。sock 结构与其对应的 socket 会相互绑定。


3、sk_buff

  • (include\linux\Skbuff.h) sk_buff 是网络数据包在内核中的表现形式,通过源码可以看出,数据包在内核协议栈中是通过这个数据结构来变现的。

  • 从其中的 union 字段可以看出,该结构是贯穿在各个层次的,可以说这个结构是用来为网络数据包服务的。其中的字段表明了数据包隶属的套接字、当前所处的协议层、所搭载的数据负载长度(data指针指向)、源端,目的端地址以及相关字段等。

  • 最重要的一个字段是 data[0],这是一个指针,它指向对应层的数据报(首部+数据负载)内容的首发地址。怎么解释呢?

如果在传输层,那么data指向的数据部分的首地址,其数据部分为 TCP 首部 + 有效数据负载。 

如果在网络层,data指向的数据部分的首地址,其数据部分为 IP 首部 + TCP 首部 + 有效数据负载。 

如果在链路层,data指向的首地址,其数据布局为 MAC 首部 + IP 首部 + TCP 首部 + 有效数据负载。 

所以在该skb_buff结构传递时,获取某一层的首部,都是通过拷贝 data 指向地址对应首部大小的数据。

4、device

  • include\linux\Netdevice.h)该结构表明了一个网络设备需要的字段信息。

5、tcp 首部格式

6、ip 首部格式

7、以太网帧帧头格式

8、ARP报文报头





详细了解Linux内核网络协议栈socket、sock、sk_buff,etc(含内核源码)的评论 (共 条)

分享到微博请遵守国家法律