大家好,我是小杰。
在这个系列里,我们将详细学习计算机网络相关的知识。 这次要讲的是数据链路层
老规矩,先上这个系列的镇宝图——TCP/IP协议五层模型
为什么要有数据链路层
所谓存在即合理,经过了这么多年实践的考验,那这一层也定有它不可或缺的原因:
- 为IP模块发送和 接收IP数据报
- 为ARP模块发送ARP请求和接收ARP应答
- 为RARP发送RARP请求和接收RARP应答
ARP和RARP分别为地址解析协议和逆地址解析协议
什么是RFC
Request For Comments(RFC)是一系列以编号排定的文件,Internet的所有标准都是以请求评论文档(RFC)的形发布的,TCP/IP协议也不例外。
喏,就是下面这些,是一系列的文件。
为什么要提RFC协议
RFC要求每台接入Internet的主机:
- 必须能发送和接收采用RFC 894(以太网)封装格式的分组
- 应该能接收与RFC 894混合的RFC 1042(IEEE 802)封装格式的分组
- 也许能够发送采用RFC 1042格式封装的分组。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是 RFC 894分组。
以太网IP数据报的封装是在RFC 894中定义的,IEEE 802则是在RFC 1024中定义的。
可见以太网协议是局域网最常用的
两种封装格式
数据链路层主要有两种帧格式:以太网封装格式和IEEE802封装格式
两种帧格式都采用6字节的目的地址和源地址(IEEE的802.3可采用两字节),最后都包含一个CRC循环冗余校验部分,用来检查错误。其他的区别就不细探讨了,主要研究以太网封装格式。
RFC 893中还描述了尾部封装的封装格式,不过目前已遭到反对,有兴趣的同学可以自行查阅和了解。
IP数据报封装协议
上节中间部分就是IP数据报,然而对IP数据报的封装也是有讲究的!
目前主要有两种 SLIP 和 PPP(点对点协议)
SLIP
在RFC 1055中定义了SLIP(Serial Line IP)
- IP数据报以一个称作 END(0 x c0)的特殊字符结束。同时,为了防止数据报到来之前 的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个 END字符。
- 如果IP报文中某个字符为 END,那么就要连续传输两个字节 0xdb和0xdc来取代它。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符(0 x 1b)不同。
- 如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和0xdd来 取代它。
缺陷:
- 每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。
- 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于 SLIP, 那么它不能同时使用其他协议。
- SLIP没有在数据帧中加上检验和(类似于以太网中的 CRC字段)。
CSLIP(压缩的SLIP)
之所以出现CSLIP的原因,就是因为SLIP大,所以需要优化,那么它大在什么地方呢。
我特意去RFC 1144(CSLIP的RFC定义文档)去查了一下,因为TCP/UDP协议很大,每次传输的时候将近一半的固定信息是不会变动的,每次就算用TCP协议传输1字节的数据都需要40字节的固定位信息的发送,因此这就是可以优化的地方。
CSLIP的做法是,接收端拷贝一份上次发送的固定字段,发送者每次只需要传递变动的位数就好了,这样通常可以把原来40字节压缩至3~5字节,可见效率真的很高!
PPP:点对点协议
设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。
点对点协议是针对SLIP的缺陷进行修改的:
- 在串行链路上封装 IP数据报的方法。PPP既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分,这个信息部分的长度受最大传送单元MTU的限制。
- 建立、配置及测试数据链路的链路控制协议( LCP:Link Control Protocol)。它允许通信双方进行协商,以确定不同的选项。
- 针对不同网络层协议的网络控制协议(NCP:Network Control Protocol)体系。当前 RFC定义的网络层有I P、OSI网络层、DECnet以及AppleTalk。例如,IP NCP允许双方商定是 否对报文首部进行压缩,类似于 CSLIP(缩写词NCP也可用在TCP的前面)。
优点
- PPP支持在单根串行线路上运行多种协议, 不只是IP协议;
- 每一帧都有循环冗余检验;
- 通信双方可以进行 I P地址的动态协商(使用IP网络控制协议);
- 与CSLIP类似,对TCP和IP报文首部进行压缩;
- 链路控制协议可以 对多个数据链路选项进行设置。为这些优点付出的代价是在每一帧的首部增加 3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。
随着产品越来越多,产家也开始逐渐支持PPP,因此最终PPP应该取代SLIP。
HDLC协议
高级数据链路控制(High-Level Data Link Control)简称HDLC,是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC协议扩展开发而成的。
PPP和HDLC协议对比
相同点
协议名 | 全双工链路 | 透明传输 | 差错检测 |
---|
PPP协议 | √ | √ | √ | HDLC协议 | √ | √ | √ |
不同点
协议名 | 面向方式 | 协议字段 | 有无序号和确认机制 | 是否可靠 |
---|
HDLC协议 | 面向比特 | 无 | 有 | 可靠 | PPP协议 | 面向字节 | 有 | 无 | 不可靠 |
环回接口
大多数的产品都支持环回接口,以允许运行在同一台主机上的客户程序和服务器程序通过 TCP/IP进行通信。A类网络号127就是为环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口,并命名为 localhost。一个传给环回接口的IP数据报不能在任何网络上出现。
可见127.0.0.1访问的IP数据包并不经过以太网卡
关键点
- 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
- 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。
- 任何传给该主机IP地址的数据均送到环回接口。
最大传输单元MTU
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是 1500和1492字节。链路层的这个特性称作MTU最大传输单元。不同类型的网络大多数都有一个上限。
如果IP层有一个数据报要传,而且数据的长度比链路层的 MTU还大,那么IP层 就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。
小结
- 局域网主要是以太网协议,广域网主要是PPP协议
- 回环接口使得本地回环地址不必经过以太网卡,但是对其他上层协议透明
- 最大传输单元会导致IP数据报分片
|