购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 Socket Buffer 设计概述

在这一章和下一章中,我们将会介绍Linux内核网络体系结构实现的两个最重要的数据结构:Socket Buffer数据结构sk_buff和网络设备数据结构net_device。这两个数据结构所包含的数据域比较多,是网络子系统中两个较复杂的数据结构。一开始就逐一学习数据结构的组成和数据域的含义是一项非常枯燥的任务,要全部理解和记住它们所有的数据域也比较困难,为什么我们仍然要在本书的开始部分就花大量的篇幅对这两个数据结构的数据域进行详细分析呢?因为数据结构是理解程序运行方式和状态的关键因素。

什么是数据结构?它是系统中各个实体,如网络数据包、网络设备在内核中的符号描述和抽象,它表示了这些实体的属性和运行时间变化过程。程序的运行就是:读取数据结构的相关数据域,获取实体的属性,根据它们的当前值来分析数据包/网络设备的状态;修改数据结构的数据域或更新某些数据域的值来对数据包/网络设备作处理。数据结构设计得是否合理在很大程度上决定了:程序体系结构是否清晰;操作是否灵活;是否具备可扩展性。所以要理解Linux内核网络体系结构的设计思想和实现原理,首先应掌握代表网络子系统中各个实体的重要数据结构。

2.1.1 Socket Buffer与TCP/IP协议栈

协议代表了通信双方的一种约定,使双方能理解彼此要交流的内容。就有如你要发一封信到英国,如果对方不懂中文,你需要用英语写信件;如果你不懂英语,对方也不懂中文,你们双方就需要约定第三种彼此都懂的语言来通信,这样双方才能沟通。TCP/IP协议栈就是在计算机网络上通信双方的约定,TCP/IP协议栈把复杂的网络通信协议分步实现。TCP/IP 协议栈与OSI参考模型如图2-1所示。

Socket Buffer与TCP/IP协议栈的关系就如信件与写信的语言一样。网络数据包从应用程序传到内核时是原始数据,协议栈要在原始数据中加入通信约定。由于内核中TCP/IP协议栈是分层实现的,数据包在内核中要经过TCP/IP协议栈的传输层、网络层、数据链路层各层协议的处理,最后由网络设备发送出去,所以各层协议都要对表示网络数据包的数据结构进行操作。

对Socket Buffer 数据结构的操作会贯穿在整个TCP/IP协议栈的各层。

图2-1 TCP 协议栈与OSI 参考模型

2.1.2 Socket Buffer的对外接口

如果各层协议处理程序都对Socket Buffer数据结构的数据域直接操作,会造成程序的结构混乱。一旦对Socket Buffer数据结构做出调整,则整个协议栈的代码都需要修改。所以内核中实现了一系列的方法来操作Socket Buffer的数据域,供TCP/IP协议栈各层处理函数调用,这些方法构成了Socket Buffer对外交流的统一接口。在本章中我们也会对其主要的方法和实现流程作详细的分析。这是理解应用Linux内核网络协议栈的重要基础。

2.1.3 Socket Buffer的特点

Linux内核网络子系统的实现之所以灵活高效,主要在于其管理网络数据包的缓冲器-Socket Buffer设计得高效合理。在Linux网络子系统中, Socket Buffer 是一个关键的数据结构,因为它代表了一个网络数据包在内核中处理的整个生命周期过程。也就是说Socket Buffer就是要接收或发送的网络数据包在内核中的对象实例。 RAXITr2DS3LMTHudGP3b2AZ0pJ45J98j8hfspa7JWTegKWKacue3uZYzHDxyouDK

点击中间区域
呼出菜单
上一章
目录
下一章
×