插口层对应的O/I,主要是用于发送数据,接收数据,数据的select选择。
- 插口缓存:
缓存的概念是很明白的,每个插口都有一个发送缓存和一个接收缓存。设置缓存是为了加快读取和输出速度。
- 插口宏和函数
不一一列举,无聊的函数。
- write,witev,sendto,sendmsg的系统调用
这四个函数的作用是往网络连接上发送数据。
作为内核函数,进程通过内核函数调用,传输到相关协议,如TCP,UDP,ICMP,TP4等。就是一个目的要将进程的数据传输到网络连接的协议栈上。
然后就是无聊的数据结构和包结构。
- sendmsg系统调用
通过这函数可以访问到插口API相关的所有功能。
这个函数有三个参数:插口描述符:指向msghdr结构的指针;几个控制标志。
- sendit函数
无聊的函数。
- sosend函数
复杂的函数,但是很重要。sosend函数根据协议支持的语义和缓存限制,将数据和控制信息传送给pr_usrreq函数。sosend从不将数据放在发送缓存中。
- read,readv,recvfrom,recvmsg系统调用
所有的插口输入都是由soreceive处理
从recv,recvmsg,recvit,soreceivr最后到TCP.UDP,ICMP,TP4.这是个连环的过程。
- recvmsg系统调用
1复制IOV函数
2recvit收集数据,并且释放缓存。
无聊的函数调用
- recvit函数
recvit函数,无聊的函数,中转站。。。
- soreceive函数
主要作用是从插口的接受缓存传送到进程制定的缓存。
带外数据OOB
报文边界
控制信息和带外数据
OOB的主要作用是标记和同步。
- Select系统调用
selscan函数
soo_select函数
selrecord函数
selwakeup函数
- 小结:
本节主要介绍了读写和选择系统调用。
具体的机制和实现手段细节要具体看。分层的增加和减少未来会动态的变化。
但是没有什么计算机技术的问题是分层解决不了的。