TCP/IP原理、基础以及在Linux上的实现(5) - 艳阳天的小窝- 51CTO技术博客


如图6所示,Linux以分层的软件结构实现了TCP/IP协议。BSD套接字由一般性的套接字管理软件INET套接字层支持。INET套接字管理着基于IP的TCP或UDP协议端。在传输UDP数据报时,Linux不必关心数据报是否安全到达目的端。但对TCP数据报来说,Linux需要对数据报进行编号,数据报的源端和目的端需要协调工作,以便保证数据报不会丢失,或以错误的顺序发送。IP层包含的代码需要处理数据报的报头信息,并且必须将传入的数据报发送到TCP或 UDP两者中正确的一层处理。在IP层之下是Linux的网络设备层,其中包括以太网设备或PPP设备等。和Linux系统中的其它设备不同,网络设备并不总代表实际的物理设备,例如,回环设备就是一个纯软件设备。ARP协议提供地址解析功能,因此它处于IP层和网络设备层之间。

图6 Linux网络分层结构图

在Linux进行网络层的初始化时,每个协议要在ptype_all链表或ptype_base哈希表中添加packet_type数据结构以进行注册。Packet_type数据结构包含协议类型、指向网络设备的指针、指向协议的接收数据处理例程的指针等。Ptype_base是一个哈希表,其哈希函数以协议标识符为参数,内核通常利用该哈希表判断应当接受传入的网络数据报的协议。通过检查ptype_all链表和ptype_base哈希表,网络底层处理程序会复制新的sk_buff,最终,sk_buff会传递到一个或多个目标协议的处理例程。

当传输IP数据报时,IP从IP路由表中找到发送该IP数据报的网络设备,网络设备对应的device数据结构中包含由一个mtu字段,该字段描述{zd0}的传输单元。如果设备的mtu小于等待发送的IP数据报的大小,就需要将该IP数据报划分为小的片断。每个片断由一个sk_buff代表,其中的IP头标记为数据报片断,以及该片断在IP数据报中的偏移。{zh1}的数据报被标志为{zh1}的IP片断。如果分段过程中IP不能分配sk_buff,则传输失败。
IP片断的接收较片断的发送更加复杂一些,因为IP片断可能以任意的顺序接收到,而在重组之前,必须接受到所有的片断。每次接收到IP数据报时,IP 要检查是否是一个分段数据报。当{dy}次接收到分段的消息时,IP建立一个新的ipq数据结构,并将它链接到由等待重组的IP片断形成的ipqueue链表中。随着其他IP片断的接收,IP找到正确的ipq数据结构,同时建立新的ipfrag数据结构描述该片断。每个ipq数据结构中包含有其源和目标IP地址、高层协议的标识符以及该IP帧的标识符,从而{wy}描述了一个分段的IP接收帧。当所有的片断接收到之后,它们被组合成单一的sk_buff并传递到上一级协议层处理。如果定时器在所有的片断到达之前到期,ipq数据结构和ipfrag被丢弃,并假定消息已经在传输中丢失,这时,高层协议需要请求源主机重新发送丢失的信息




郑重声明:资讯 【TCP/IP原理、基础以及在Linux上的实现(5) - 艳阳天的小窝- 51CTO技术博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——