vlambda博客
学习文章列表

TCP/IP协议家中的老二——数据链路层


篇:


在这个系列里,我们将详细学习计算机网络相关的知识。这次要讲的是数据链路层

涉及知识——TCP/IP协议五层模型

为什么要有数据链路层

所谓存在即合理,经过了这么多年实践的考验,那这一层也定有它不可或缺的原因:

  1. 为IP模块发送和 接收IP数据报
  2. 为ARP模块发送ARP请求和接收ARP应答
  3. 为RARP发送RARP请求和接收RARP应答

什么是RFC

Request For Comments(RFC)是一系列以编号排定的文件,Internet的所有标准都是以请求评论文档(RFC)的形发布的,TCP/IP协议也不例外。

喏,就是下面这些,是一系列的文件。

RFC文档

为什么要提RFC协议

RFC要求每台接入Internet的主机:

  1. 必须能发送和接收采用RFC 894(以太网)封装格式的分组
  2. 应该能接收与RFC 894混合的RFC 1042(IEEE 802)封装格式的分组
  3. 也许能够发送采用RFC 1042格式封装的分组。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是 RFC 894分组。

以太网IP数据报的封装是在RFC 894中定义的,IEEE 802则是在RFC 1024中定义的。

可见以太网协议是局域网最常用的

两种封装格式

数据链路层主要有两种帧格式:以太网封装格式和IEEE802封装格式

TCP/IP协议家中的老二——数据链路层

RFC 893中还描述了尾部封装的封装格式,不过目前已遭到反对,有兴趣的同学可以自行查阅和了解。

IP数据报封装协议

上节中间部分就是IP数据报,然而对IP数据报的封装也是有讲究的!

目前主要有两种 SLIP 和 PPP(点对点协议)

SLIP

在RFC 1055中定义了SLIP(Serial Line IP)

TCP/IP协议家中的老二——数据链路层

SLIP协议格式
  1. IP数据报以一个称作 END(0 x c0)的特殊字符结束。同时,为了防止数据报到来之前 的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个 END字符。
  2. 如果IP报文中某个字符为 END,那么就要连续传输两个字节 0xdb和0xdc来取代它。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符(0 x 1b)不同。
  3. 如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和0xdd来 取代它。

缺陷:

  1. 每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。
  2. 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于 SLIP, 那么它不能同时使用其他协议。
  3. SLIP没有在数据帧中加上检验和(类似于以太网中的 CRC字段)。

CSLIP(压缩的SLIP)

之所以出现CSLIP的原因,就是因为SLIP大,所以需要优化,那么它大在什么地方呢。

我特意去RFC 1144(CSLIP的RFC定义文档)去查了一下,因为TCP/UDP协议很大,每次传输的时候将近一半的固定信息是不会变动的,每次就算用TCP协议传输1字节的数据都需要40字节的固定位信息的发送,因此这就是可以优化的地方。

CSLIP的做法是,接收端拷贝一份上次发送的固定字段,发送者每次只需要传递变动的位数就好了,这样通常可以把原来40字节压缩至3~5字节,可见效率真的很高!

PPP:点对点协议

点对点协议是针对SLIP的缺陷进行修改的:

  1. 在串行链路上封装 IP数据报的方法。PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分,这个信息部分的长度受最大传送单元MTU的限制。
  2. 建立、配置及测试数据链路的链路控制协议( LCP:Link Control Protocol)。它允许通信双方进行协商,以确定不同的选项。
  3. 针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。当前 RFC定义的网络层有I P、OSI网络层、DECnet以及AppleTalk。例如,IP NCP允许双方商定是 否对报文首部进行压缩,类似于 CSLIP(缩写词NCP也可用在TCP的前面)。

TCP/IP协议家中的老二——数据链路层

ppp数据封装格式

优点

  1. PPP支持在单根串行线路上运行多种协议, 不只是IP协议;
  2. 每一帧都有循环冗余检验;
  3. 通信双方可以进行 I P地址的动态协商(使用IP网络控制协议);
  4. 与CSLIP类似,对TCP和IP报文首部进行压缩;
  5. 链路控制协议可以 对多个数据链路选项进行设置。为这些优点付出的代价是在每一帧的首部增加 3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。

随着产品越来越多,产家也开始逐渐支持PPP,因此最终PPP应该取代SLIP。

HDLC协议

高级数据链路控制(High-Level Data Link Control)简称HDLC,是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC协议扩展开发而成的。

TCP/IP协议家中的老二——数据链路层

HDLC帧格式

PPP和HDLC协议对比

相同点

协议名 全双工链路 透明传输 差错检测
PPP协议
HDLC协议

不同点

协议名 面向方式 协议字段 有无序号和确认机制 是否可靠
HDLC协议 面向比特 可靠
PPP协议 面向字节 不可靠

环回接口

环回接口处理过程

可见127.0.0.1访问的IP数据包并不经过以太网卡

关键点

  1. 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
  2. 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。
  3. 任何传给该主机IP地址的数据均送到环回接口。

最大传输单元MTU

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是 1500和1492字节。链路层的这个特性称作MTU最大传输单元。不同类型的网络大多数都有一个上限。

如果IP层有一个数据报要传,而且数据的长度比链路层的 MTU还大,那么IP层 就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。

小结

  1. 局域网主要是以太网协议,广域网主要是PPP协议
  2. 回环接口使得本地回环地址不必经过以太网卡,但是对其他上层协议透明
  3. 最大传输单元会导致IP数据报分片
点个“在看”不失联