您的位置:首页 > 理论基础 > 数据结构算法

linux源码-TCP/IP协议栈学习预备(1) 数据结构之各socket之间的关系

2016-12-01 23:10 495 查看
在阅读协议栈的源码时,经常可以看到sock在各struct sock, struct socket及struct tcp_sock之间相互转换。刚开始时经常被转迷糊。特意总结一下,分享给大家。

通过代码不难得到如下数据关系。



其中,关键字struct我删掉了。各个sock的意义如下:

struct socket:通用的BSD socket
struct sock:  网络层中socket的表示
struct tcp_sock: tcp层中的socket表示
struct sock_common:  最小化的网络层的socket表示
struct inet_connection_sock: inet面向连接的sock
struct inet_sock :代表inet中的sock。其中inet表示internet

1、这样做的好处:所有的数据共用一段内存,tcp_sock最复杂,需要的内存最多。所有的数据共用一个首地址,可以方便的实现相互之间的转换,C语言中的强制类型转换。也就是以各自的视角来看待一个首地址,各自只看到自己层以上的数据。

2、Linux中为什么会分这么多的socket呢?原因很简单,在协议栈为了实现代码重用,对可以利用的部分都尽量重用的,这也是为什么看似简单的控制层与应用层之间会有这么多层socket传递。

3、为什么到tcp层,sock的传递就结束了?因为TCP层再向下就是不可靠的IP层了。这与SOCK的通用性目的相背离,而且应用对网络资源的管理一般是通过socket管理的,IP层是大家的,共享的,不能有哪个SOCKET独享。

4、最后一个问题:struct socket是怎么与这些socket关联起来的呢?由于struct
socket是面向用户的应用层的表示,所以结构上与内核里的socket都不太一样,所以可能的形式是struct
socket会包含一个指向sock的指针,因为sock_common只记录了基本的socket信息,真正连接struct
socket和tcp_sock的是struct sock。通过看源码也印证了这一点。

struct socket {

***

struct sock *sk;

***

};

理解难免有偏差与错误,请同学们指正。
晚安
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: