TCP/IP 教程 | 链路层

Posted by Aiden on August 12, 2019

链路层设计的主要协议如下 :

image.png

CSMA/CD 协议

最初的以太网是将所有的计算机连接到一根总线上。当一台计算机发送数据的时候,总线上的所有计算机都能检测到这个数据。 这就是广播通信方式。 当我们需要在总线上进行一对一通信的时候,就需要使每一台计算机的网卡拥有一个与其他网卡都不同的地址。这个时候,我们在发送数据帧时,就需要表明数据帧接收站的地址。只有网卡地址与其相同时,才接受数据帧,否则丢弃帧。

CSMA/CD是以太网帧与802帧的底层支持协议。

特点

载波监听(carrier sense)

以太网络上的各个工作站在发送数据前,都要监听总线上有没有数据正在传输。若有数据传输 (称总线为忙),则不发送数据,需要等待;若无数据传输(称总线为空),可以立即发送准备好的数据。

多路访问(multiple access)

以太网络上的各个工作站在发送数据时,共同使用一条总线,且发送数据是广播式的。

碰撞检测(collision detected)

以太网上有两个或两个以上工作站同时发送数据,在总线上就会产生信号的冲突;多个工作站都同时发送数据,在总线上就会产生信号的冲突,哪个工作站接收到的数据都辨别不出真正的信息。这种情况称冲突或者碰撞。

为了减少冲突发生的影响,工作站在发送数据过程中还要不停地检测自己发送的数据,检测自己传输过程中有没有其他工作站在发送数据,在传输过程中与其它工作站的数据发生冲突,这就是冲突检测。

每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。

image.png

特性

使用 CSMA/CD 协议的以太网不能进行全双工通信而只能进行双向交替通信(半双工通信)。

每个站在发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。

这种发送的不确定性使整个以太网的平均通信量远小于以太网的最高数据率。

争用期

最先发送数据帧的站,在发送数据帧后至多经过时间 $2\tau$(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。

以太网的端到端往返时延 $2\tau$ 称为争用期,或碰撞窗口。

经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。

退避算法

发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。

确定基本退避时间,一般是取为争用期 $2\tau$。

定义重传次数 $k, k <= 10$ 即 $k = Min[k, 10]$

从整数集合$[0,1,…, (2k -1)]$ 中随机地取出一个数,记为$r$。重传所需的时延就是$r$倍的基本退避时间。

当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告。


以太网

以太网这个术语一般是指数字设备公司(Digital Equipment Corp.)、英特尔公司(IntelCorp.)和Xerox公司在1982年联合公布的一个标准。它是当今TCP/IP采用的主要的局域网技术

以太网允许每个帧传输的最大长度MTU=1500, 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。

以太网帧格式:

image.png

以太网帧主要有三种数据包 :

IP 数据包(类型 : 0x0800

image.png

ARP 数据包 (类型 : 0x0806)

image.png

RARP 数据包 (类型 : 0x8035)

image.png

现在网络中使用的链路层帧基本上都是以太网帧,举个例子:

我们抓一个普通的https交互的报文看一下:

image.png

ARP 协议包查看 :

image.png


IEEE 802.3

继以太网标准公布后几年的时间, IEEE(电子电气工程师协会)802委员会针对整个CSMA/CD网络发布了 802.3 协议. 802.3 协议标准特性是建立在802.2的基础上,所以与以太网标准有些许不同。

802.3允许每个帧传输的最大长度MTU=1492, 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。

image.png

在802帧格式中,类型字段跟随在后面的是3字节的802.2 LLC和5字节的802.2 SNAP。 目的服务访问点( Destination Service Access Point,DSAP)和源服务访问点(Source Service Access Point,SSAP)的值都设为 0xaa。 Ctrl字段的值设为3。随后的3个字节org code都置为0。 再接下来的2个字节类型字段和以太网帧格式一样(其他类型字段值可以参见RFC 1340 [Reynolds and Postel 1992])。

image.png


SLIP 协议

SLIP 是一种在串行线路上对IP数据报进行封装的简单形式,SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet。

帧格式

image.png

  • IP数据报以一个称作END(0xc0)的特殊字符结束。同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个END字符(如果有线路噪声,那么END字符将结束这份错误的报文。这样当前的报文得以正确地传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃)。

  • 如果IP报文中某个字符为END,那么就要连续传输两个字节0xdb0xdc来取代它。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符(0x1b)不同。

  • 如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb0xdd来取代它。

缺陷

  • 每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。

  • 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于SLIP,那么它不能同时使用其他协议。

  • SLIP没有在数据帧中加上检验和(类似于以太网中的CRC字段)。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(另一种方法是,新型的调制解调器可以检测并纠正错误报文)。这样,上层协议提供某种形式的CRC就显得很重要。

image.png


PPP : 点对点协议

PPP是为了在点对点物理链路(例如RS232串口链路、电话ISDN线路等)上传输OSI模型中的网络层报文而设计的,它改进了之前的一个点对点协议–SLIP协议–只能同时运行一个网络协议、无容错控制、无授权等许多缺陷,PPP是现在最流行的点对点链路控制协议。这种连接提供了同时的双向的全双工操作,并且假定数据包是按顺序投递的。

PPP是目前使用最广泛的数据链路层协议,因特网用户通常都要连接到某个ISP 才能接入到因特网。 PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议。 ISP使用PPP协议为计算机分配一些网络参数(如IP地址、域名等)。

功能

  • IP地址的动态分配和管理
  • 同步或异步的物理层通信
  • 链路的配置、质量检测和纠错
  • 多种配置参数选项的协商

内容

  • 在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异步模式(如大多数计算机上都普遍存在的串行接口),还支持面向比特的同步链接。
  • 建立、配置及测试数据链路的链路控制协议( LCP:Link Control Protocol)。它允许通信双方进行协商,以确定不同的选项。
  • 针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及Apple Talk。例如,IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP(缩写词NCP也可用在TCP的前面).

image.png

  • 当遇到字符0x7e时,需连续传送两个字符:0x7d0x5e,以实现标志字符的转义。

  • 当遇到转义字符0x7d时,需连续传送两个字符:0x7d0x5d,以实现转义字符的转义。

  • 默认情况下,如果字符的值小于0x20(比如,一个ASCII控制字符),一般都要进行转义。例如,遇到字符0x01时需连续传送0x7d0x21两个字符(这时,第6个比特取补码后变为1,而前面两种情况均把它变为0)。

过程

  1. 链路不可用阶段: 初始阶段
  2. 链路建立阶段: LCP协商,(协商认证方式等)
  3. 验证阶段: PAP/CHAP验证
  4. 网络层协议阶段:NCP协商
  5. PPP会话维持阶段: 维持PPP会话, 定时发送Echo Request报文,并等待Echo Reply报文
  6. 网络终止阶段: 终止PPP会话,回到链路不可用阶段。

环回接口

大多数的产品都支持环回接口(Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。

大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能在任何网络上出现。

环回接口处理IP数据包的过程

image.png

  • 传给环回地址(一般是127.0.0.1)的任何数据均送到环回接口。
  • 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身。
  • 任何传给该主机IP地址的数据均送到环回接口。

image.png


ARP 协议

ARP 协议工作在链路层与网络层之间, 准确的说是属于网络层协议。

ARP 的主要作用是在局域网内共享对应ip 地址的 mac 地址协议。

image.png

主机每个接口有一个ARP表, 专业上叫ARP高速缓存, 用来记录在本子网内部主机到mac地址的映射关系。

image.png

主机查找mac封装以太网首部过程

image.png

分组格式

image.png

以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。

对于ARP请求或应答来说以太网类型字段为: 0x0806

硬件类型字段表示硬件地址的类型: 它的值为1即表示以太网地址。

协议类型字段表示要映射的协议地址类型: 它的值为0x0800即表示IP地址。

硬件地址长度 : 单位字节, 默认值为6。

协议地址的长度 : 单位字节, 默认值为4.

操作字段 : ARP请求(值为1)、ARP应答(值为2).

ARP 代理

果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作委托ARP或ARP代理(Proxy ARP)。这样可以欺骗发起ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另一边”。路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。

举例是说明ARP代理的最好方法。如图所示,系统sun与两个以太网相连。在sun和子网140.252.1之间实际存在一个路由器,就是这个具有ARP代理功能的路由器使得sun就好像在子网140.252.1上一样。路由器Telebit NetBlazer,取名为netb,在子网和主机sun之间。

当子网140.252.1(称作gemini)上的其他主机有一份IP数据报要传给地址为140.252.1.29的sun时,gemini比较网络号(140.252)和子网号(1),因为它们都是相同的,因而在图4-6上面的以太网中发送IP地址140.252.1.29的ARP请求。路由器netb识别出该IP地址属于它的一个拔号主机,于是把它的以太网接口地址140.252.1作为硬件地址来回答。主机gemini通过以太网发送IP数据报到netb,netb通过拨号SLIP链路把数据报转发到sun。这个过程对于所有140.252.1子网上的主机来说都是透明的,主机sun实际上是在路由器netb后面进行配置的。

image.png

image.png

RARP 协议

具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址。但是无盘机,如X终端或无盘工作站,则需要采用其他方法来获得IP地址。

无盘系统的RARP实现过程是从接口卡上读取唯一的硬件地址,然后发送一份RARP请求(一帧在网络上广播的数据),请求某个主机响应该无盘系统的IP地址(在RARP应答中)。

RARP 分组格式

image.png

以太网报头中的前两个字段是以太网的源地址和目的地址。目的地址为全1的特殊地址是广播地址。

对于RARP请求或应答来说以太网类型字段为: 0x8035

硬件类型字段表示硬件地址的类型: 它的值为1即表示以太网地址。

协议类型字段表示要映射的协议地址类型: 它的值为0x0800即表示IP地址。

硬件地址长度 : 单位字节, 默认值为6。

协议地址的长度 : 单位字节, 默认值为4.

操作字段 : RARP请求(值为3)、RARP应答(值为4).

参考内容

document/TCPIP详解卷1协议.pdf at master · Aiden-Dong/document · GitHub

CSMA/CD 协议 CSDN博客