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;
***
};
理解难免有偏差与错误,请同学们指正。
晚安
通过代码不难得到如下数据关系。
其中,关键字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;
***
};
理解难免有偏差与错误,请同学们指正。
晚安
相关文章推荐
- siebel学习笔记-数据结构层次,BC之间的关系
- Nginx源码分析-4个重要结构之间的关系
- 线程退出【Linux学习】pthread_create主线程与创建的新线程之间退出关系
- ffmpeg主要数据结构及其之间的关系
- Linux学习笔记之权限与命令之间的关系(重要)及文件与文件夹知识总结
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
- linux学习总结(数据结构之图的遍历)
- Linux igmp snooping 学习笔记 之一 相应的数据结构与初始化
- redis 源码学习(核心数据结构剖析)
- Linux 路由 学习笔记 之一 相关的数据结构
- Linux下从源码编译安装软件中3个命令之间的关系
- [C++]数据结构:从m叉搜索树谈到B-树的结构特点、阶数、高度、元素个数之间的关系
- libevent2.0源码学习二:通用数据结构
- 网络设备发送队列相关数据结构及其创建函数 (linux网络子系统学习 第十节 )
- 【Linux学习】pthread_create主线程与创建的新线程之间退出关系
- Linux 学习数据专题【管理、编程、源码分析】——Linux相关图书选购指南
- 【Linux学习】pthread_create主线程与创建的新线程之间退出关系
- ffmpeg主要数据结构及其之间的关系
- linux 学习笔记--字符设备驱动相关数据结构
- (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作