TCP/IP Illustrated Vol1&2 笔记:数据流 和 内核数据结构

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;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值