TCP/IP详解 卷1:协议 学习笔记 第二章 链路层
链路层主要有三个目的:
1.为IP模块发送和接受IP数据报。
2.为ARP模块发送ARP请求和接受ARP应答。
3.为RARP模块发送RARP请求和接受RARP应答。
TCP/IP支持不同的链路层协议,这取决于网络所用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)、RS-232串行线路等。
以太网指数字设备公司、英特尔公司、Xerox公司在1982年联合公布的一个标准,是当今TCP/IP采用的主要局域网技术。它采用CSMA/CD的媒体接入方法,其含义是带冲突检测的载波监听多路接入,它的速率为10Mb/s,地址为48bit。
几年后,IEEE(电子电气工程师协会)802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络,这三者的共同特性(即802网络共有的逻辑链路控制(LLC))由802.2标准定义,不幸的是,802.2和802.3定义了一个与以太网不同的帧格式。
以太网IP数据报的封装是在RFC 894中定义的,IEEE 802网络的IP数据报封装是在RFC 1042中定义的。
最常使用的封装格式是RFC 894定义的格式。
两种帧格式都采用48bit(6字节)的目的地址和源地址(802.3允许16bit地址,但一般是48bit),这就是硬件地址。ARP和RARP协议对32bit的IP地址和48bit的硬件地址进行映射。
源地址和目的地址之后的2字节在两种帧结构中互不相同,一个表示类型(以太网帧格式),一个表示长度(802帧格式,表示从长度之后的后续数据的字节长度,但不包括CRC检验码),但它们的有效值无一相同,由此可以区分出两种帧格式。
以太网帧格式中,类型之后就是数据。
CRC字段用于帧内数据字节差错的循环冗余码检验(被称为FCS或帧检验序列)。
802.3规定数据部分必须至少为38字节,而以太网要求最少有46字节,因此有时需要填充字节。
RFC 893描述了另一种用于以太网的封装格式,称为尾部封装。但现在已遭到反对。
SLIP(Serial Line IP)是一种在串行线路上对IP数据报进行封装的简单形式。SLIP协议定义的帧格式:
1.IP数据报以一个称作END(0xc0)的特殊字符结束。为防止数据报到来前线路噪声也被当作数据报内容,大多数实现在数据报的开头处也传一个END字符,这样如果有线路噪声,那么END字符将结束这份错误报文。这样当前报文会正确传输,而前一个错误报文交给上层后,会因其毫无意义而丢弃。
2.若IP报文中某字符为END,则用两个字节0xdb和0xdc来取代它,0xdb这个特殊字符被称为SLIP的ESC字符,但它的值与ASCII码的ESC字符0x1b不同。
3.若IP报文段的某字符与SLIP的ESC字符相同,则用两个字节0xdb和0xdd取代它。
SLIP是有缺陷的:
1.每一端必须知道对方的IP地址,没有办法把本端的IP通知给另一端。
2.数据帧中没有类型字段,如果一条串行线路用于SLIP,那么它不能同时使用其他协议。
3.SLIP没有在帧中加上校验和,传输错误(噪声等影响)只能通过上层协议来发现(新型的调制解调器可以检测并纠正错误报文)。上层提供某种形式的CRC很重要。
串行线路通常速率较低,且通信常是交互式的,因此在SLIP线路上有许多小的TCP分组进行交换。为传送1字节的数据需要20字节的IP首部和20字节的TCP首部,总数超过40字节,于是CSLIP诞生,它能把上面的40个字节压缩到3或5个字节,且能在CSLIP每一端维持16个TCP连接。被压缩的首部大大缩短了交互响应的时间。大多SLIP产品都支持CSLIP。
PPP协议包括:
1.在串行链路上封装IP数据报的方法。它既支持数据为8位和无奇偶校验的异步模式(如串行接口),也支持面向比特的同步链接。
2.建立、配置和测试数据链路的链路控制协议(LCP,Link Control Protocol),允许通信双方协商,以确定不同的选项。
3.针对不同网络层协议的网络控制协议(NCP,Network Control Protocol)体系。如IP NCP允许双方商定是否对报文首部进行压缩。
PPP帧协议字段可以区分信息字段是IP数据报还是链路控制数据还是网络控制数据。
PPP帧以0x7e(01111110)开始或结束,因此当该信息出现在信息字段中,需要进行转义。同步链路中,使用名为零比特填充(在帧起始和终止间,遇到5个1就填充1个0)的硬件技术完成。异步链路中,使用0x7d作为转义字符,当转义字符出现在PPP数据帧中时,紧接着的字符的第6个比特要取其补码,具体过程如下:
1.遇到字符0x7e时,需要连续传两个字符:0x7d和0x5e。以实现字符的转义。
2.遇到转义字符0x7d时,需连续传两个字符:0x7d和0x5d。
3.默认,如果一个字符值小于0x20(如一个ASCII控制字符,注:ASCII字符可通过Alt+ASCII码输入),一般要进行转义,如,遇到0x01时,需要连续传送0x7d和0x21两个字符(此时第6个比特取补码后变为1,而前两种情况均把它们变为0)。
链路控制协议可以指定是否需要对这32个字符(字符值小于0x20的值)中的某些值进行转义,默认是将这32个字符都进行转义。
PPP协议也常用于低速的串行线路,因此减少每一帧的字节数可以降低应用程序的交互时延,利用链路控制协议,大多产品可省略标志符和地址字段,并把协议字段减为1字节,此时PPP协议只比SLIP多了3个字节,1字节留给协议字段,2字节用于CRC。使用IP网络控制协议,大多数产品可通过协商使用Van Jaconbson报文首部压缩方法,以减小IP和TCP首部长度。
PPP协议相比SLIP协议的优势:
1.可在单根串行线路上运行多种协议,不只是IP协议。
2.每一帧都有CRC。
3.通信双方可以进行IP地址动态协商(通过网络控制协议)。
4.可对TCP、IP报文首部进行压缩。
5.链路控制协议可设置多个数据链路选项。
大多产品都支持环回接口,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的,大多系统把127.0.0.1分配给这个接口,并命名为localhost。
4.4BSD定义了变量useloopback,并初始化为1,但如果这个变量为0时,以太网驱动程序把本地分组送到网络而非环回接口,这样可能不能工作,这取决于使用的以太网接口卡和设备驱动程序。
一旦传输层检测到目的端地址是环回地址,可以省略部分传输层、网络层的逻辑操作。但大多产品还是照样完成传输层/网络层所有过程,只是当IP数据报离开网络层时把它返回给自己。
上图中的关键点有:
1.任何传给该主机IP地址的数据均送到环回接口。2.传给环回地址(127.0.0.1)的任何数据均作为IP输入。
3.传给广播或多播地址的数据报复制一份传给环回接口,然后送到以太网上。(广播和多播传送的定义包括主机本身)
上图中一个隐含的意思是传给环回接口的IP数据报一般不出现在相应的网络上。例如,在一个以太网上,分组一般不传出去然后读回来。某些BSD以太网的设备驱动程序注明,许多以太网接口卡不能读回它们自己发送出去的数据,这种情况下一台主机必须处理发送给自己的数据报,上图是最简单的处理办法。
用传输层和IP层的方法处理环回数据似乎效率不高,但它简化了设计,因为环回接口可以被看作是网络层下面的另一个链路层,网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把数据报返回到IP的输入队列中。
以太网和802.3对数据帧长度都有一个限制,最大值分别是1500字节和1492字节。链路层的此特性被称为MTU,最大传输单元。
如果IP层有一个数据报要传,且其长度比链路层的MTU要大,那么IP层就需要分片。
点到点的链路层(如SLIP、PPP)的MTU不是硬件物理特性,而是逻辑限制,目的是为交互使用提供足够快的响应时间。
如果两主机之间的通信要通过多个网络,那么每个网络的链路层可能有不同的MTU,其中最小的MTU被称为路径MTU。路径MTU不一定是一个常数,它取决于当时选择的路由,而选路不一定是对称的,因此两方向上的MTU不一定相同。
为提高交互式应用响应时间,大多SLIP实现提供把交互数据放在大块数据前面的服务,但它不能影响已经进入下游(如串行驱动程序)队列的非交互数据,假设新型调制解调器有很大缓冲区,交互数据进入缓冲时可能前面已有大块非交互数据。
将SLIP的MTU降低到256字节可以降低交互时延。不选择64或128是由于256提供良好的线路利用率(如大文件传输),假设CSLIP报文首部5字节,数据帧总长251字节,数据占比98.1%,利用率高。
上图中点对点链路的MTU是296字节,这是因为TCP和IP首部一共占40字节。MTU是IP向链路层查询的结果,因此该值必须包括通常的TCP、IP首部。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)