接着笔记一:今天心情不好……我觉得我就是一个悲剧;
1.7 网络实现概述
Net/3通过对多种网络协议支持来提供通用底层服务;BSD支持四种不同的通信协议族:
1)TCP/IP 互联网协议族
2)XNS 今天已经很少人在使用了
3)OSI协议
4)Unix域协议;在Unix域中提供俩种不同协议;1种是可靠的,面向连接的;第二种是不可靠的无连接的;
1.8 描述符
Udp插口是Internet协议族和数据报插口(SOCK_DGRAM)组成;
socket返回的是一个描述符,他是一个内核描述符,具有与其他unix相同的特性;
接下来看一下在程序中调用socket后的内核数据结构
首先当我们调用socket函数时就会访问进程表proc()当中的p_fd指向filedesc()中的fd_ofiles指向一个file()数组其中f_type类行为DTYPE_SOCKET就会指向socket结构了,socket结构中还有一个Internet协议块(pcb),要说一下就是当一个UDP数据到达一个网络接口是,内核搜索所有UDP协议控制块,寻找一个合适的,至少要根据UDP的端口号,可能还有目标的IP地址、源IP地址、源端口号,就会找到相应的socket结构了;
1.9 mbuf与输出处理
存储器缓存:mbuf
书上是用了一个例子描述的:sendto第五个参数就会被复制到这个mbuf中,mbuf结构是前20个字节包括4个4字节的和2个2字节的字段,mbuf一共128个字节;
m_next和m_nextpkt会指向下一个mbuf,m_len是m_data的长度,m_type位m_data的数据类型。
下面我们说一下包含数据的mbuf链表
先看图:我们按图来解释,首先前面说了1个mbuf总长位128,去掉20字节的首部,还要去掉另外8个字节分别是:m_pkthdr.len\m_okthdr.rcvif,这俩个一共占了8字节,所以一个mbuf最多能存储100字节的数据。m_pkthdr.len的意思是总字节长度就像先前的例子sendto长度为150个字,m_okthdr.len=150,m_len = 100;这样就可以算出第二个mbuf的长度了,mbuf分组首部的地址就是m_pkthdr.rcvif,如果更多的话就需要更多,但是会有新的技术来替代叫做簇。
m_pkthdr.len他的长度为总长度的原因是当要用到总长度时候不用遍历加;
还有就是刚才一直没有提过的sendto最后一个参数m_flag的作用,当要用到分组的时候m_flag为M_PKTHDR。
添加IP和UDP首部
先上一张图OSI网络参考模型方便我们更好的理解
在插口层我们将数据复制到mbuf中以后,就会到协议层,明确的说是UDP输出例程被调用,mbuf指针作为一个参数被传递。这个例程要在mbuf前面添加一个IP首部和UDP首部,然后将心mbuf传递给IP输出例程;
接下来我们在看一张图
新mbuf占了28个字节的首部(20个字节IP首部和8个字节Udp首部),28个字节放在最下面是为了留给以后的首部,总长度变为178;
以太网输出
以太网输出第一个要做的就是把本地32位IP转化成相应的48位以太网地址。在使用ARP时会使用这个功能,并会等待新的应答。然后以太网输出例程把一个14字节的以太网首部添加到链表的第一个mbuf中,其中包括6个字节以太网目标地址和6个字节以太网源地址和俩个字节以太网帧类型。
好了今天就到这吧,安了