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

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)数据;



更多内核中的信息流动细节参考,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{}的关系:



struct inpcb 结构如下:



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)



每一个udp socket都有一个send/receive buffer,不过源地址也保存在buffer中,数据还是分段的;

每一个tcp socket都各有一个send/receive buffer,因为对于tcp来说,数据是连续的;

缓存大小可以通过选项来修改:SO_RCVBUF, SO_SNDBUF;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: