Linux 2.4网络栈数据包之旅

5星 · 超过95%的资源 需积分: 9 63 下载量 134 浏览量 更新于2024-07-28 1 收藏 920KB PDF 举报
"深入解析Linux 2.4内核网络协议栈中的数据包之旅" 《Linux 2.4网络协议栈中的数据包旅程》是由Harald Weltela forge编写的文档,详细介绍了在Linux 2.4.x内核中,一个网络数据包从接收到转发的全过程。自2.2内核版本以来,由于放弃了全局序列化的下半部分处理,转而采用新的软中断系统,这一过程发生了显著变化。 1. 前言 作者承认自己并非内核专家,文档主要关注的是默认情况,即x86架构下处理IP数据包的转发。尽管作者不是内核领域的权威,但他提供的信息可能存在错误。他欢迎读者的反馈和修正。 2. 接收数据包 2.1 接收中断 当网络卡接收到匹配本地MAC地址或链路层广播的以太网帧时,它会触发一个中断。对应的网络驱动程序处理这个中断,通过DMA(直接存储器访问)/PIO(编程输入输出)等方式将数据包加载到RAM中。然后,它会分配一个sk_buff(数据缓冲区)并调用协议无关的设备支持例程:net/core/dev中的函数。 在这一阶段,数据包首先被接收中断处理程序捕获,然后通过网络驱动的处理流程,将数据从硬件层面转移到内核空间。sk_buff是Linux内核中用于存储网络数据包的数据结构,它包含了数据包的原始数据以及相关的元信息,如长度、头部信息等。 3. 数据包的进一步处理 2.4.x内核中的软中断系统允许多个中断处理程序并发执行,提高了系统处理网络流量的能力。一旦数据包进入内核,协议栈会按照TCP/IP模型的层次结构进行处理,依次通过链路层、网络层和传输层。 3.1 链路层处理 在链路层,以太网驱动程序会检查数据包的目标MAC地址,如果匹配本地接口,则继续处理;否则,如果目标是广播地址,也会进行处理。不匹配的数据包通常会被丢弃。 3.2 网络层处理 在网络层,IP协议会检查数据包的目标IP地址,决定是否将其发送给上层协议(如TCP、UDP)或进行路由决策。若目标IP地址是本地主机,IP层会解封装数据包并传递给相应的传输层协议。 3.3 传输层处理 在传输层,如TCP或UDP,协议会根据端口号找到对应的应用程序,将数据包传递给相应的应用进程。例如,HTTP请求会被交给Web服务器进程,FTP数据会被交给FTP服务器进程。 4. 软中断和底半部处理 软中断系统使得网络协议栈可以快速响应中断,而不会阻塞其他任务。数据包处理的底半部通常在中断返回后异步执行,这优化了系统性能,避免了频繁的上下文切换。 5. 转发与输出 对于非本地IP地址的目标数据包,内核会进行路由决策,根据路由表确定下一跳,并可能通过ARP(地址解析协议)获取下一跳的MAC地址,然后由网络驱动程序将其发送出去。 总结,该文档详细描绘了Linux 2.4内核中网络协议栈处理数据包的完整过程,从硬件中断到软件中断,再到各层次的协议处理,最后到数据包的转发或输出,展示了Linux网络栈的高效和灵活性。
2023-04-20 上传