一、OSI七层模型
1.1、概念
OSI七层模式是一个标准,规定了各种计算机在世界范围内互联成网的标准框架,OSI模型是一个分层的模型,每一个部分称为一层,每一层扮演固定的角色,互不干扰。
只要遵循了OSI标准,一个系统就可以和位于世界上任意地方的,也遵循这同一标准的其它任何系统进行通信。
OSI七层模型从上到下依次为:应用层、表现层、会话层、传输层、网络层、数据链路层、物理层。
OSI七层模型是一个理论模型,今天的互联网使用的实际模型是TCP/IP模型,缺少了OSI七层模型中的第五层、第六层,TCP/IP就常被称为是事实上的国际标准。因此后面在介绍时我们会忽略掉表示层和会话层。
对于路由器来说,其最高只用到网络层,并没有使用传输层和应用层。
1.2 物理层
在物理层上所传输数据的单位是比特。物理层的任务就是传送比特流。也就是说,发送方发送1(或0)时,接收方应当收到1(或0)而不是0(或1)。
因此物理层要考虑使用多少伏的电压代表“1”或“0”,以及接收方如何识别出发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各引脚应如何连接。
注:
- 传递信息所使用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议在内而是在物理层协议的下面。
1.3 数据链路层
我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻节点直接(主机与路由器之间或两个路由器之间)传送数据是直接传送的(点对点),这时就需要使用专门的链路层协议。
在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据包组装成帧,在两个相邻节点间的链路上“透明”的传送帧中的数据。
每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。典型的帧长是几百字节到一千多字节。
每一数据帧分成:报头head和数据data两部分;
- head:包含18个字节,发送者(源地址,6个字节)、接受者(目标地址,6个字节)、数据类型(6个字节);
- data:最多46个字节,最长1500个字节;
这就像写信,发送者的地址(源地址)就是你家的地址,接收者地址(目标地址)就是对方的收信地址,你家的路由器就相当于邮局。其实在计算机通信中的源地址和目标地址指的是mac地址。
1.4 网络层
网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把传输层产生的报文段或用户数据报封装成数据包进行传送。
网络层的另一个任务就是要选择合适的路由,使源主机传输层所传下来的分组,能够通过网络中的路由器找到目的主机。
1.5 传输层
传输的任务就是负责向两个主机中的进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此传输层有复用和分用的功能。
- 复用就是多个应用层进程可同时使用下面传输层的服务。
- 分用就是传输层把收到的信息分别交付给上面应用层中相应的进程。
传输层主要使用以下两种协议:
- 传输控制协议TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
- 用户数据报协议UDP(User Datagram Protocal):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付”。
1.6 应用层
应用层是体系架构中的最高层。应用层直接为用户的应用进程提供服务。在因特网的应用层协议有很多,如支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,支持文件传输的FTP协议等。
二、网卡驱动架构
2.1 概述
对于网卡来说,其工作物理层和数据链路层,主要负责收发网络的数据包,它将网络通信上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议。
在知道了网卡的工作内容后,我们也就清楚了网卡驱动程序要实现的功能,即通过控制硬件实现数据的传输,一方面让硬件将上层传递的数据包发送出去,另一方面接收外部数据并传递给上层。
为了能更加清楚理解linux内核中网卡驱动的程序,我们按照功能对它进行层次划分,划分后的Linux内核的网卡驱动程序的框架如下图所示:
从上图可以看出内核中的网卡驱动程序被划分为4层:
- 网络协议接口层:向网络层协议提供统一的数据包收发接口,该层主要负责调用dev_queue_xmit()函数发送数据包到下层或者调用 netif_rx()函数接收数据包,都使用sk_buff作为数据的载体;
- 网络设备接口层:通过net_device结构体来描述网络设备信息,是设备驱动功能层各个函数的容器,向上实现不同硬件类型接口的统一;
- 设备驱动功能层:用来负责驱动网络设备硬件来完成各个功能,各个函数是网络设备接口层net_device数据结构的具体成员,比如最核心的功能实现数据包的发送和数据包的接收;
- 网络设备和媒介层:是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介,网络适配器被设备驱动功能层中的函数在物理上驱动。对于Linux系统而言,网络设备和媒介都可以是虚拟的。
其中net_device结构体是协议层和硬件交互的桥梁,它屏蔽了硬件之间的差异,使得协议层不需要关心硬件的操作,在发送数据时只需要调用net_device结构体中操作函数完成数据的收发。
net_device结构体中的操作函数是由设备驱动功能层实现的函数注册的,对应不同的硬件设备,驱动功能层实现上会有所差异。
总的来说,我们编写网卡驱动程序也就是围绕网络设备接口层和设备驱动功能层进行的,根据硬件功能实现设备驱动功能层的数据收发函数,填充并向上注册net_device结构体。
2.2 核心数据结构
2.2.1 struct sk_buff
2.2.2 struct dev_ops
2.2.3 struct net_device
2.3 核心函数
2.3.1 dev_queue_xmit
2.3.2 netif_rx
2.3.3 ndo_start_xmit
2.3.4 alloc_netdecv
2.3.5 register_netdev
参考文章:
[1] Linux 网卡驱动程序
[2] 26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
[4]一篇文章让你通俗理解OSI七层模型(TCP/IP模型)
标签:OSI,网卡,物理层,linux,传输层,驱动,数据包 From: https://www.cnblogs.com/zyly/p/17073469.html