协议分层
现在的Internet使用的主流协议族是TCP/IP协议族,,他是一个分层,多协议的通信体系。
TCP/IP包含众多协议,我们无法一一讨论,我会在后续章节逐步介绍,本篇将对协议如何分层,封装和分用进行介绍。
为什么需要分层
网络协议栈设计成层状结构,目的在于将一个实时传输通信的庞大的功能进行解耦,使得各层能做到各自可维护以及可扩展。
例如,我们在通话时,符合人与人之间的语言协议,这使得我们可以彼此进行沟通,但是下一层电话之间的通信协议是如何约定的,再往下的电信号是如何传输的,以及经过了多少基站,我们并不关心,当然电话也听不懂人类的语言,它只负责把我们能认知的信息转达给我们即可。
每一层只需关心对方的对应层的协议是否和自己互通,而上下层之间只负责接口调用即可。期间电话升级成了手机的无线通话,手机通话再升级为视频通话,人类之间并不会因为底层通信方式的改变而改变我们交流的基本方式——语言沟通,这便是通信协议分层即解耦的好处。
OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 每一层都有相关的协议和相应的物理设备;
- OSI七层模型是一框架性的设计方法,其最主要的功能就是帮助不同类型,不同系统的主机实现数据传输;
- 它的优点是将服务,接口和协议这三个概念明确的区分开,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠通信。
TCP/IP 四层模型
OSI七层模型较为复杂且不常用,我们更多谈论的是 TCP/IP 四层模型。 TCP/IP 是一组协议的代名词,其中包含了许多协议,他们组成了 TCP/IP 协议簇。
由下往上依次为:(物理层),数据链路层,网络层,传输层,应用层。
- (物理层):光电信号的传输介质,如光纤,同轴电缆,电磁波。物理层的能力决定了最大传输效率,传输距离,抗干扰性等。集线器(hub)可对接收到的信号进行放大,以扩大网络的传输距离。
- 数据链路层:负责设备之间的数据帧的传送和识别,例如网卡设备的驱动、帧同步(识别新帧)、冲突检测(检测到冲突自动重发),数据差错校验。该层有以太网,令牌环网,无线lan等标准。交换机工作在数据链路层。
- 网络层:负责地址管理和路由选择,IP协议从属该层,在IP协议中,通过IP地址,来标识一台主机,并通过路由表的方式规划出两台主机间数据传输的线路(路由)。路由器工作在网络层。
- 传输层:负责两台主机之间的数据传输,如传输控制协议(TCP)工作在该层,能够确保数据可靠的从源主机发送到目标主机。
- 应用层:负责应用程序间的沟通,如文件传输协议,网络远程访问协议,电子邮件传输。socket编程就在该层。
- 对于一台路由器,它实现了网络层到物理层;
- 对于一台交换机,它实现了从数据链路层到物理层;
- 对于集线器, 他只实现了物理层;
很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);
数据链路层
该层实现网卡接口的网络驱动程序。以处理数据在物理媒介(以太网,令牌环等)的传输,不同的物理网路具有不同的实现特性,网络驱动程序有隐藏了这些细节,向上层提供一个统一的接口。
数据链路层的两个常用的协议是ARP协议(Address Resolve Protocol,地址解析协议)和RARP协议(Reverse Address Resolve Protocol,逆地址解析协议)。他们实现了IP地址和机器物理地址(通常是MAC地址,全球唯一,以太网,令牌环和无线网络都使用MAC地址)的相互转换。
网络层使用IP地址寻址一台机器,而数据链路层使用物理地址寻址一台机器,因此网络层必须将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务,这就是ARP协议的用途。RARP协议仅用于网络上的无盘工作站,因缺乏存储设备,无法记住自己的IP地址,它可以利用网卡上的物理地址来向网络管理者查询自己的IP地址。运行RARP服务的网络管理者存有该网络上所以机器的物理地址到IP地址的映射。
网络层
网络层实现数据包的选路和转发。
WAN(Wide Area Network,广域网)通常使用众多的路由器来连接分散的主机和局域网(LAN,Local Area Network),因此通信的两台主机不是直接相连的,而是通过多个中间结点(路由器)连接的。网络层的任务就是选择这些中间结点,以确定两台主机之间的通信路径**。同时网络层对上层隐藏了网络拓扑的连接细节,**使得上层的传输层和应用层看来,通信的双方是直接相连的。
网络层的核心协议是IP协议(Internet Protocol,因特网协议)。
IP协议根据数据包的目的IP地址来决定如何投递它,如果数据包无法直接发送给目标主机,那么IP协议就为他寻找下一个合适的下一跳主机(nest hop),并将数据包交付给i路由器来转发。多次重复这一步骤,直到数据包最终到达目标主机,或者因发送失败而被丢弃。
可见IP协议是通过逐跳(hop by hop)的方式确定通信路径。
网络层另一重要协议是ICMP协议(Internet Control Message Protocal,因特网控制报文协议),是IP协议的重要补充,用于检测网络连接,ICMP的报文格式如下:
传输层
传输层为两台主机上的应用程序提供端到端(end to end)的通信。与网络层的逐跳方式不同,传输层只关心通信的起始段和目的端,不在乎数据包的中转过程:
实线箭头表示TCP/IP协议族各层之间的实体通信(数据包确实沿着这些线路传递),而虚线则代表了逻辑通信线路。
- 数据链路层(驱动程序)封装了物理网络的电气细节;
- 网络层封装了网络连接的细节
- 传输层为应用程序封装了一条端到端的逻辑通信线路,他负责数据的收发,链路的超时重连等。
传输层的主要协议:TCP协议,UDP协议
-
TCP (Transmission Control Protocol,传输控制协议) 为应用层提供可靠的,面向连接的和基于流(stream)的服务。通过超时重传,数据确认等方式确保数据包正确发送至目的端,因此TCP是可靠的。 使用TCP通信协议的双方先建立TCP连接,并在内核中为该连接维持一些必要的数据结构,如连接状态,读写缓冲区,以及诸多定时器等。 当通信结束,双方必须关闭连接以释放这些内核数据。 TCP服务是基于流的,基于流的数据没有边界(长度)限制,它源源不断的从通信的一端流入另一端,发送端逐字节向数据流写入数据,接收端逐字节接收数据。 -
UDP (User Datagram Protocol,用户数据报协议) UDP与TCP大相径庭,他为应用层提供不可靠,无连接和基于数据包的服务。 不可靠:使用UDP协议的的应用程序通常要自己处理数据确认,超时重传等逻辑。 无连接:通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定接收端的地址(IP地址等信息)。 基于数据报:每个UDP数据报都有长度,接受端必须以该长度作为最小单位将内容一次性读出,否则数据将被截断。
应用层
应用层负责处理应用程序的逻辑。
数据链路层,网络层,传输层各自分工负责处理通信细节,这部分必须稳定且高效,因此他们在内核空间中实现。
而应用层在用户空间实现,它们需负责处理众多逻辑如文件传输,网络管理等。如果应用层也在内核中实现,内核会变得非常庞大,会有少部分服务器程序在内核中实现,这样代码就无需在内核空间和用户空间切换(主要是数据复制),极大提高工作效率,但这类代码实现较为复杂,不够灵活且不便移植。之后的文章将只围绕应用层的系统调用部分(socket编程)。
列举几个应层协议
- ping 是应用程序,而不是协议,它利用ICMP协议报文检测网络连接,是调试网络环境的必备工具。
- telnet协议:远程登录协议,使我们在本地完成远程任务。
- OSPF协议(Open Shortest Path First,开放最短路径优先):是一种动态路由更新协议,用于路由器之间的通信,以告知对方各自的路由信息。
- DNS协议(Domain Name Service,域名服务)提供机器域名到IP地址的转换。
封装
上层协议要使用下层协议提供的服务,是通过封装实现的。
上层数据沿着协议栈依次往下传递,每层协议都将上层数据的基础上加上自己的头部信息(有时还包括尾部信息),以实现该层的功能,该过程便是封装。
经TCP封装后的数据称为TCP报文段(TCP message segment),TCP协议为通信双方维持一个连接,并在内核存储相关数据:
TCP的头部信息和TCP内核缓冲区(发送或者接收)数据一起构成TCP报文段:
当发送端的应用程序调用send(或write)函数向TCP连接写入数据,内核中的TCP模块将数据复制进内核的TCP发送缓冲区中,然后TCP模块调用IP模块的服务,传递的参数将包含TCP头部信息及TCP发送缓冲区的数据,即TCP报文段。
UDP的封装与TCP类似,但不同的是UDP无需为应用层数据保存副本,他的服务是不可靠的。如果应用程序检测到,UDP数据包没有成功被接收端接受,并打算重发这个数据报,则应用程序需要重新从用户空间将该数据拷贝到UDP内核缓冲区中。
经过数据链路层封装的数据称为帧(frame),传输媒介不同,帧的类型也不同。比如,以太网传输的是以太网帧(ethernet frame),而令牌环网络传输的是令牌环帧(token ring frame)。
以太网帧使用6字节的目的物理地址和6字节的源物理地址来表示通信双方。关于类型字段,会在以后的文章讨论,4字节CRC字段对帧的其他部分提供循环冗余校验。
帧的最大传输单元(Max Transmit Unit,MTU),即帧最多能携带多少上层协议数据,通常受网络类型的影响,过长的IP数据报可能需要被分片传输。
分用
当帧达到目的主机时,沿着协议栈自底向上依次传递,各层协议依次处理帧中本层负责的头部数据,以获取所需信息,并最终将处理后的数据交给目标应用程序。这个过程称为分用,分用是依靠头部信息中的类型字段实现的。
因为IP协议、ARP 协议和RARP协议都使用帧传输数据,所以帧头部需提供类型字段来区分他们。
以太网帧为例:
类型字段为0x800为IP数据报,0x806为ARP请求或应答报文,0x835为RARP请求或应答报文。
同样,因为ICMP协议,TCP协议和UDP协议都使用IP协议,所以IP数据报的头部采用16为的 协议字段来区分它们。
TCP报文段和UDP报文段则通过其头部的16位端口号(port number)字段来区分上层应用程序。比如DNS协议对应端口号为53,HTTP协议对应端口号80。
所以应用层协议使用的端口号都可在 /etc/services文件中找到。
帧通过上述分用步骤后,最终将封装前的原始数据送至目标服务,这样在顶层目标服务看来,封装和分用似乎没有发生过。
— end —
青山不改 绿水长流
|