NSA-001



CH1
以太网MTU为1500字节,所以报文长度一般选择在1472以下(UDP 8字节报文头;TCP 20字节报文头;IP 20字节报文头)
T C P / I P插口的类型总是D T Y P E _ S O C K E
1) 我们的进程调用s o c k e t,最后分配了最小未用的描述符(在我们的例子中是3 )。在后
面,所有针对此s o c k e t的系统调用都要用这个描述符。
2) 以下内核数据结构是一起被分配和链接起来的:一个D T Y P E _ S O C K E T类型f i l e结构、
一个s o c k e t结构和一个i n p c b结构。这些结构的很多初始化过程我们并没有说明: f i l e结
构的读写标志(因为调用s o c k e t总是返回一个可读或可写的描述符 );默认的输入和输出缓
存大小被设置在s o c k e t结构中,等等。
3) 我们显示了标准输入、输出和标准错误处理的非s o c k e t描述符的目的是为了说明所有
描述符最后都对应一个f i l e结构,虽然s o c k e t描述符和其他描述符之间有所不同。
U D P检验和计算后存储在U D P首部中。注意,这要求遍历存储在m b u f链表中的所有1 5 0字
节的数据。这样,内核要对这1 5 0字节的用户数据做两次遍历:一次是把用户缓存中的数据复
制到内核中的m b u f中,而现在是计算U D P检验和。对整个数据的额外遍历会降低协议的性能,
在后续章节中我们会介绍另一种可选的实现技术,它可以避免不必要的遍历。
我们在前面说明了在结构m b u f中前两个成员的目的:指针 m _ n e x t把m b u f链接成一个
m b u f链表,而指针m _ n e x t p k t把m b u f链表链接成一个m b u f队列。
有些操作既提供了宏也提供了函数。宏版本的名称是以M开头的大写字母名称,而函数是
以m _开始的小写字母名称。两者的区别是一种典型的时间-空间互换。宏版本在每个被用到的
地方都被C预处理器展开(要求更多的代码空间),但是它在执行时更快,因为它不需要执行函
数调用(对于有些体系结构,这是费时的)。而对于函数版本,它在每个被调用的地方变成了一
些指令(参数压栈,调用函数等),要求较少的代码空间,但会花费更多的执行时间。