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

在阅读协议栈的源码时,经常可以看到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语言中的强制类型转换。也就是以各自的视角来看待一个首地址,各自只看到自己层以上的数据。

2Linux中为什么会分这么多的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 sockettcp_sock的是struct sock。通过看源码也印证了这一点。

struct socket {

***

struct sock *sk;

***

};

理解难免有偏差与错误,请同学们指正。

晚安



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值