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

Linux内核网络基础-TCP相关的几个关键结构体-小记

2022-07-28 14:51 作者:补给站Linux内核  | 我要投稿

Linux内核网络源码中经常看到的几个与TCP相关的关键结构体如下图所示,本文围绕下面这个图展开分析,分别介绍各个结构体以及关系



上图关系可以这样描述:

  • <span>struct inet_sock</span>继承自<span>struct sock</span>

  • <span>struct inet_connection_sock</span>继承自struct inet_sock

  • <span>struct tcp_sock</span>继承自struct inet_connection_sock

四个结构的关系具有面向对象的特征,通过层层继承,实现了类的复用;内核中网络相关的很多函数,参数往往都是struct sock, 函数内部依照不同的业务逻辑,将struct sock转换为不同的业务结构 ;这样做的好处:

  1. 简化接口的设计复杂度;

  2. 使用基类作为参数,类似于面向对象中的多态特性,能够有效的增强接口的稳定性、提升扩展性。

分别看一下这几个结构体如下:

struct tcp_sock的结构体成员大都是与tcp协议本身相关的关键字段,可以看到该结构体的的一个成员即为struct inet_connection_sock结构体,即struct tcp_sock从struct inet_connection_sock结构体的基础上继承而来,增加了一些tcp协议相关的字段,如滑动窗口协议,拥塞算法等一些TCP专有的属性。


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




继续看结构体,如下所示,它的一个域是 ,即struct inet_connection_sock结构体从struct inet_sock的基础上继承而来,增加了一些面向连接需要的字段。struct inet_connection_sock``struct inet_sock

如下所示,可以看到结构体,可以看到该结构的第一个成员是结构体,即struct inet_sock是struct sock从的基础上基础而来,增加了一些INET域专有的一些属性,比如TTL,组播列表,IP地址,端口等。struct inet_sock``struct sock

struct sock结构体如下所示,是最基础的sock结构体,也是网络中最核心的结构体。

看到这个结构体很自然想到struct socket结构体,如下所示,经常会有人问struct socket与struct sk有什么关联?

struct socket是通用BSD的socket定义,面向上层,struct sock面向下层,struct sock结构体定义非常大,根据使用的不通协议而挂入到struct socket,之所以从socket中分离出sock一个这样重要的结构是因为socket是通用的套接字结构体,而sock与具体使用的协议相关。总而言之把重要项放在与应用系统关系密切的结构 struct socket里,其他(如struct sock)因为要占用大量的内存空间,而将这此结构变量分离出来放在另外一些结构中,再让两个结构体彼此关联。

既然提到了这四个结构体的继承关系,文章看到也提到说这种继承关系的便利,如内核中网络相关的很多函数,参数往往都是struct sock, 函数内部依照不同的业务逻辑,将struct sock转换为不同的业务结构, 下面分析几个不同结构体直接互相转换的函数:

struct sock与struct inet_sock之间:

struct sock与struct inet_connection_sock之间

struct sock与struct tcp_sock之间

总之:tcp_sock,inet_connection_sock,inet_sock这几个结构体的第一个成员全都是struct sock;一层层继承下来,每一层都有自己的扩展,而且这些结构体在申请大小的时候都是按照最大值sizeof(struct tcp_sock)申请的,所以强转也不会越界。


Linux内核网络基础-TCP相关的几个关键结构体-小记的评论 (共 条)

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