如图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利用套接字缓冲区在协议层和网络设备之间传送数据。Sk_buff包含了一些指针和长度信息,从而可让协议层以标准的函数或方法对应用程序的数据进行处理。如图7所示,每个sk_buff均包含一个数据块、四个数据指针以及两个长度字段。利用四个数据指针,各协议层可操纵和管理套接字缓冲区的数据,这四个指针的用途如下:
当网络设备从网络上接收到数据报时,它必须将接收到的数据转换为sk_buff数据结构,然后将该结构添加到backlog队列中排队。当backlog队列变得很大时,接收到的sk_buff数据将会被丢弃。当新的sk_buff添加到backlog队列时,网络底层程序将被标志为就绪状态,从而可以让调度程序调度底层程序进行处理。
网络处理代码必须建立sk_buff来包含要传输的数据,并且在协议层之间传递数据时,需要添加不同的协议头和协议尾。
当传输IP数据报时,IP从IP路由表中找到发送该IP数据报的网络设备,网络设备对应的device数据结构中包含由一个mtu字段,该字段描述最大的传输单元。如果设备的mtu小于等待发送的IP数据报的大小,就需要将该IP数据报划分为小的片断。每个片断由一个sk_buff代表,其中的IP头标记为数据报片断,以及该片断在IP数据报中的偏移。最后的数据报被标志为最后的IP片断。如果分段过程中IP不能分配sk_buff,则传输失败。
-
TCP/IP原理、基础以及在Linux上的实现 (4)
TCP/IP原理、基础以及在Linux上的实现 (4)
Linux 基础 TCP 原理 休闲 -
TCP/IP原理、基础以及在Linux上的实现 (2)
TCP/IP原理、基础以及在Linux上的实现 (2)
Linux 基础 TCP/IP 原理 休闲 -
TCP/IP原理、基础以及在Linux上的实现 (3)
TCP/IP原理、基础以及在Linux上的实现 (3)
Linux 基础 TCP 原理 休闲 -
TCP/IP原理、基础以及在Linux上的实现 (1)
TCP/IP原理、基础以及在Linux上的实现 (1)
Linux 基础 TCP 原理 休闲 -
TCP/IP的底层队列实现原理
深入的了解TCP/IP的一些底层原理,收益颇多!
用户内存 字节数 半连接 全连接 线程组 -
TCP/IP基础
TCP/IP基础
生成树 路由选择协议 数据 -
【网络基础】《TCP/IP详解》学习笔记5
《TCP/IP详解》学习笔记
笔记 职场 学习 休闲 TCP/IP详解