linux网络栈结构

一. linux网络层次结构

linux网络栈的层次结构非常清晰,并没有按照OSI七层模型来实现,而是压缩并扩展了一些层。如下图中的所示:

从上而下,依次为应用层,系统调用接口层,协议无关接口层,网络栈层,设备无关接口层,设备驱动层。因为linux的网路栈中的socket是继承自BSD的,socket插口为应用层使用网络服务提供了简单的方法,它屏蔽了具体的下层协议族的差异。下面重点说一下中间的4层。

  • 系统调用接口层。系统调用接口层提供了socket接口的系统调用。可以参考下面的地址:https://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html

    链接中列举了linux socket控制相关的系统调用。

  • 协议无关接口层。为什么会有这一层呢?协议无关指的又是什么无关?首先呢,我们得知道,网络世界里是有很有种协议族的,比如我们最常用的tcp/ip v4协议族,但是除此之外还有很多协议族存在,比如netlink,unix等,因此,为了使用上的方便,抽象了一个协议无关接口层,只需要在创建socket时,传入对应的参数,就能创建出对应的协议族socket类型。具体的可以看一下socket函数的参数:socket(int domain, int type, int protocol);第一个参数就定义了使用的协议族,ipv4的?ipv6的?unix的?等等。第二个参数就是指定socket类型,是流式套接字还是用户数据报?还是原始套接字?一般来说,前两个参数选定了,就能确定一个socket的类型和使用的传输层协议了,如流式套接字对应使用tcp/ip中的tcp协议,用户数据包对应使用tcp/ip中的udp协议。

  • 网络栈层。这一层就是具体的各类协议的实现了。包括传输层和网络层。对于我们最经常使用的tcp/ip来说,传输层主要包括tcp和udp协议。网路层就是ip协议。这一部分也是这个系列重点需要解释的,后面仔细说。

  • 设备无关接口层。这一层夹在网络栈和驱动层之间,至于为什么会有这么一层存在?可以想象一下,网络设备种类多样,当收到数据包时,怎么传递给网络栈?如果没有设备无关接口层的抽象,势必会导致两层之间的调用花样百出,因此,有必要抽象出设备无关层,如驱动向上的传递接口,通用设备表示等。从这个设计来看,给我们很多启示,联想上面的协议无关接口层,可以看出,在一对多这种情况下,设计一个通用层会有很多好处。

二. linux网络栈文件分布层次

在第一节对实现网络设计结构做了说明之后,这一节说明一下实现文件的分布。

  1. 文件的实现主要在/linux/net目录下。
  2. /linux/net目录下的几乎每个文件夹就是一个协议族的集合。如ipv6,ipv4,802,ATM。
  3. 对于ipv4的网络层,传输层的实现分布在/linux/net/ipv4中。
  4. 协议无关接口层和设备无关接口层分布在/linux/net/core文件夹中。

更加详细的实现文件分布,如接口和数据结构的分布,待分析代码时一并交代。

原文地址:https://www.cnblogs.com/yhp-smarthome/p/6926246.html