从系统的角度讲,数据是怎么被传输的?
每一次创建进程就创建进程控制块PCB,进程控制块的核心实现就是task_struct,task_struct是一个结构体;
在task_srtruct中有一个files指针,用于指向文件的结构体,文件结构体当中就有一个文件描述符数组,数组的索引号就是文件描述符,用于打开文件;
每个文件都有一个inode,socket文件里的inode就指向内核当中socket结构体,在这个结构体当中会有一个发送队列和接收队列。发送队列/接收队列都存在很多的sk_buff,这个sk_buff就是网络当中各个抽象层的数据包。
为什么每一层要使用相同的结构体?
不需要每次传递都进行拷贝,如果拷贝会浪费很多cpu性能
具体的实现:
sk_buff当中有一个叫做data的指针
每次接收和发送就靠里面的data指针的移动
- 接收就是逐步剥离首部的过程:
因此指针指向整个数据包的过程是向后移动的,也就是data指针的值一直在增加
- 发送就是逐步增加首部的过程:
所以在数据加上头部之前,需要预留出一部分头部的空间,之后在每一层加上头部时data指针的值就减少,向前移动,指向到新加上的头部的开始位置
以下就是整个进程操作数据发送接收的流程
欢迎批评指正!