TCP/IP Illustrated Vol1&2 笔记:数据流 和 内核数据结构
2012-04-13 20:45
274 查看
1. IP层会通过IP Header中的协议字段,把处理后的IP包传递给不同的传输层协议去处理,所以UDP端口是独立于TCP端口的;(TCP/IP vol1 11.2)
参考:TCP/IP vol1 Figure 1.8,IP层会根据协议来分流(demultiplexing)数据;
![](http://my.csdn.net/uploads/201204/13/1334315517_3340.png)
更多内核中的信息流动细节参考,vol2,1.9,1.10 这两节;
a). UDP 输出的时候(send),中间过程没有排队过程,直到数据到达了以太网输出函数(设备驱动层);(vol2,p19)
包/数据在到达设备驱动层之前都mbuf chain 中;
b). 当网卡接收到数据的时候,驱动会把接收到的数据复制到 mbuf chain 中,直到UDP接收到数据,UDP会根据目的IP和port来选择socket(是和UDP中的inpcb链表中每一个inpcb来确定的),然后把接受到的数据,接在该 socket 的 recieve queue (一个mbuf队列)中,之后,进程会把数据从mbuf复制到进程的缓冲区中;(vol2,
1.10)
2. 内核为TCP/UDP分别维护了一个inpcb(internet protocol control block)结构的双向列表,每一个incpb结构对应一个socket结构,这两个结构分别有指针指向对方,用于数据的双向传输;
inpcb是一个传输层的数据结构,用于TCP,UDP,和 raw IP,没有用于IP,ICMP,和 IGMP;(vol 2, p715)
更多关于internet protocol control block的信息,参考 vol2,ch22;
参考(vol2 Figure 1.5)的一部分,说明了inpcb{}列表、inpcb{}和socket{}的关系:
![](http://my.csdn.net/uploads/201204/13/1334317409_5761.png)
struct inpcb 结构如下:
![](http://my.csdn.net/uploads/201204/13/1334321702_9604.png)
3. 端口是用于确定 发送/接受进程 用的,(vol 1, 11.2)那么是如何用端口来区分的呢?
根据上面的解释,根据协议特定的inpcb结构列表,因为inpcb包含接收端的IP和端口,UDP可以找到接收到的数据报对应的socket;socket结构包含一个成员:
pid_t so_pgid;
/* pgid for signals */
该成员函数指定了到该socket接收到数据时,应该向哪个进程发送信号;这个进程就是创建该socket的进程,此时可能正在调用recvfrom,接收到信号之后,进程就能可以从该socket中读取数据了。
4. tcp/udp socket send/receive queue/buffer
socket的receive/send buffer,也有叫做send/receive queue的,都是指同样的东西,因为这个buffer是的数据是通过mbuf queue来组织的;参考struct socket中struct sockbuf:(vol2, 15.3, 16.3)
![](http://my.csdn.net/uploads/201205/04/1336062588_8764.png)
每一个udp socket都有一个send/receive buffer,不过源地址也保存在buffer中,数据还是分段的;
每一个tcp socket都各有一个send/receive buffer,因为对于tcp来说,数据是连续的;
缓存大小可以通过选项来修改:SO_RCVBUF, SO_SNDBUF;
参考:TCP/IP vol1 Figure 1.8,IP层会根据协议来分流(demultiplexing)数据;
![](http://my.csdn.net/uploads/201204/13/1334315517_3340.png)
更多内核中的信息流动细节参考,vol2,1.9,1.10 这两节;
a). UDP 输出的时候(send),中间过程没有排队过程,直到数据到达了以太网输出函数(设备驱动层);(vol2,p19)
包/数据在到达设备驱动层之前都mbuf chain 中;
b). 当网卡接收到数据的时候,驱动会把接收到的数据复制到 mbuf chain 中,直到UDP接收到数据,UDP会根据目的IP和port来选择socket(是和UDP中的inpcb链表中每一个inpcb来确定的),然后把接受到的数据,接在该 socket 的 recieve queue (一个mbuf队列)中,之后,进程会把数据从mbuf复制到进程的缓冲区中;(vol2,
1.10)
2. 内核为TCP/UDP分别维护了一个inpcb(internet protocol control block)结构的双向列表,每一个incpb结构对应一个socket结构,这两个结构分别有指针指向对方,用于数据的双向传输;
inpcb是一个传输层的数据结构,用于TCP,UDP,和 raw IP,没有用于IP,ICMP,和 IGMP;(vol 2, p715)
更多关于internet protocol control block的信息,参考 vol2,ch22;
参考(vol2 Figure 1.5)的一部分,说明了inpcb{}列表、inpcb{}和socket{}的关系:
![](http://my.csdn.net/uploads/201204/13/1334317409_5761.png)
struct inpcb 结构如下:
![](http://my.csdn.net/uploads/201204/13/1334321702_9604.png)
3. 端口是用于确定 发送/接受进程 用的,(vol 1, 11.2)那么是如何用端口来区分的呢?
根据上面的解释,根据协议特定的inpcb结构列表,因为inpcb包含接收端的IP和端口,UDP可以找到接收到的数据报对应的socket;socket结构包含一个成员:
pid_t so_pgid;
/* pgid for signals */
该成员函数指定了到该socket接收到数据时,应该向哪个进程发送信号;这个进程就是创建该socket的进程,此时可能正在调用recvfrom,接收到信号之后,进程就能可以从该socket中读取数据了。
4. tcp/udp socket send/receive queue/buffer
socket的receive/send buffer,也有叫做send/receive queue的,都是指同样的东西,因为这个buffer是的数据是通过mbuf queue来组织的;参考struct socket中struct sockbuf:(vol2, 15.3, 16.3)
![](http://my.csdn.net/uploads/201205/04/1336062588_8764.png)
每一个udp socket都有一个send/receive buffer,不过源地址也保存在buffer中,数据还是分段的;
每一个tcp socket都各有一个send/receive buffer,因为对于tcp来说,数据是连续的;
缓存大小可以通过选项来修改:SO_RCVBUF, SO_SNDBUF;
相关文章推荐
- 数据结构学习笔记3(链表 下 双向链表&单链表逆转)
- AT&T学习笔记汇编之内核
- Scala学习笔记<基本数据结构>
- Linux 内核入门学习笔记(一) AT&T汇编基础
- Linux内核学习笔记-AT&T汇编语法
- 【由尚德内核编程学习笔记1】AT&T汇编语法
- linux设备驱动第三版笔记---->linux驱动重要数据结构之inode.
- 数据结构复习笔记(Data Structures & Algorithms in Java, 4th) --Garbage Collection
- [笔记]《Linux内核设计与实现》第六章内核数据结构
- 数据结构&算法学习笔记: 归并排序
- 数据结构&算法学习笔记: 快速排序
- Python学习笔记(四)——Python数据结构之字符串&字典
- JAVA学习笔记(三十) - 数据流 DataInputStream & DataOutputStream
- linux设备驱动第三版笔记---->linux驱动重要数据结构之file_operations
- PostgreSQL数据库内核分析 笔记(这本书没有怎么很好的看,主要就是一些数据结构、概念和流程的文字介绍)
- R语言学习笔记——数据结构 & 数据框基本操作
- Linux Kernel Development 笔记(五)内核数据结构
- AT&T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表
- linux设备驱动第三版笔记---->linux驱动重要数据结构之struct file
- [Net&Web]网络相关杂碎笔记