解读《TCP/IP详解》(卷1):02章:链路层
2.1引言
在TCP/IP协议族中,链路层主要有三个目的:
(1)为IP模块发送和接收IP数据报。
(2)为ARP模块发送ARP请求和接收ARP应答。
(3)为RARP发送RARP请求和接收RARP应答。
TCP/IP支持多种不同的链路层协议,具体取决于网络所使用的硬件,本文讨论以太网链路层协议,串行接口链路层协议(SLIP和PPP)以及回环(127.0.0.1)驱动程序。
2.2以太网和IEEE 802封装
以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议标准。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/S的速率运行在多种类型的电缆上。后来IEEE 802委员会公布了一个稍有不同的标准集。
在TCP/IP世界中,以太网IP数据报的封装格式是在RFC 894中定义的,IEEE 802网路的IP数据报格式封装格式是在RFC 1042中定义的。主机需求RFC要求每台Internet主机都与一个10M/s的以太网电缆相连:
(1)必须能发送和接收 RFC 894(以太网)封装格式的分组。
(2)应该能接收与RFC 894混合的RFC 1042(IEEE 802)封装格式的分组。
(3)也许能够发送采用RFC 1042格式的分组。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认必须是RFC 894分组。
这里我们可以看出以太网的封装格式还是最普遍被人们接受的。
两种帧格式都采用48位(6字节)的目的地址和源地址,802.3允许16位地址,但一般也是48位。这就是我们通常所说的硬件地址(MAC地址)。接下来的两个字节在两种帧格式中互不相同。802中,长度字段是指它后续数据的字节长度,不包括CRC(循环冗余)校验码。而以太网中这两个字节是定义了后续数据类型的类型字段。802中的类型字段则由后续的SNAP(子网接入协议)的首部给出。幸运的是,802的有效长度指和以太网的类型值无一相同,这就可以对两种帧格式进行区分。
上图为IEEE 802.2/802.3(RFC 1042)与以太网封装格式图
其中:
LLC:逻辑链路控制 这是802网络共有的
DSAP:目的服务访问点 值0xaa
SSAP:源服务访问点 值0xaa
以太网和802.3都有帧的最小长度要求。802.3规定数据部分至少38字节,而以太网而要求46字节。如不能满足,则在不足的空间插入填充(pad)字节。
------------------------------
另外,RFC 893 描述了一种尾部封装,这种封装格式已经遭到反对。它的内容是将以太网数据帧的IP首部与TCP首部移到尾部CRC之前。
2.3 SLIP(串行线路IP)
SLIP
SLIP(Serial Line Internet Protocol,串行线路网际协议),主要在Unix远程访问服务器中使用,现今仍然用于连接某些ISP。因为SLIP协议是面向低速串行线路的,可以用于专用线路,也可以用于拨号线路,Modem的传输速率在1200bps到19200bps。RFC1055中有详细描述。
帧格式的规则:
(1)IP数据报以一个被称作END(0xc0)的特殊字符结束。同时为防止数据到来前的噪声,通常在开始处也会传一个END,用来标识数据的起始部分。
(2)若IP报文中某个字符为END,那么要连续传输两个字节0xdb,0xdc来代替。(好比,编程语言中要打印特殊含义的字符的时候要加转义字符)
(3)若IP报文中某个字符为ESC,那么要连续传输两个字节0xdb,0xdd来代替。
SLIP的缺陷:
(1)每一端必须知道对方的IP地址,不能把本端的IP地址通知给另一端
(2)数据帧中没有类型字段。如果一条串行线路用于SLIP,那么它不能同时使用其他协议。
(3)SLIP中没有类似于以太网的CRC校验字段,这样纠错能力差。
CSLIP
传统的串行线路速率较低,为了传输1个字节的数据需要20个字节的IP首部和20个字节的TCP首部。因此,人们提出CSLP(压缩SLIP),他将前面提到的40个字节压缩到3到5个字节,且能够在两端维持多大16个TCP连接,并且知道其中每个连接的首部中的某个字段一般不会发生变化。对于那些发生变化的字段,大多数只是一些小的数字和的改变。被压缩的首部大大缩短了交互响应时间。
2.4 PPP(点对点协议)
PPP协议修改了SLIP协议中的所有缺陷:
包括三个部分:
(1)在串行链路上封装了IP数据报的方法。PPP既支持数据位8为和无奇偶检验的异步模式,还支持面向比特的同步链接。
(2)建立、配置及测试LCP(数据链路的链路控制协议)。它允许通信双方进行协商,以及确定不同的选项。
(3)针对不同网络层协议的NCP(网路控制协议)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。例如,IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP
PPP数据帧的格式看上去很像ISO的HDLC(高层数据链路控制)。每一帧都以标志0x7e开始和结束,紧接着是一个地址字节,值始终是0xff,然后是一个值为0x03de控制字节。接下来是协议字段(类似于以太网中的类型字段):
其值为0x0021时,表示信息字段是一个IP数据报
其值为0xc021时,表示信息字段是链路控制数据
其值为0x8021时,表示信息字段是网络控制数据
标志字节值是0x7e,因此如果信息字段中出现此字符时,PPP需要对其转义。同样特殊字符0x7d也需要进行转义。
过程如下:
(1)当遇到0x7e时,需连续传送两个字符:0x7d和0x5e,以实现标志字符的转义。
(2)当遇到0x7d时,需连续传送两个字符:0x7d和0x5d,以实现转义字符的转义。
(3)默认的,如果字符的值小于0x20,一般都要进行转义。由ASCLL表可以看出20(16进制)以内的字符大都是控制字符,所以需要转义。
HEX |
字符 |
解释 |
HEX |
字符 |
解释 |
00 |
NUL |
空字符 |
10 |
DLE |
数据链路转义 |
01 |
SHO |
标题开始 |
11 |
DC1 |
设备控制1 |
02 |
STX |
正文开始 |
12 |
DC2 |
设备控制2 |
03 |
ETX |
正文结束 |
13 |
DC3 |
设备控制3 |
04 |
EOT |
传输结束 |
14 |
DC4 |
设备控制4 |
05 |
ENQ |
请求 |
15 |
NAK |
拒绝接收 |
06 |
ACK |
收到通知 |
16 |
SYN |
同步空闲 |
07 |
BEL |
响铃 |
17 |
ETB |
传输块结束 |
08 |
BS |
退格 |
18 |
CAN |
取消 |
09 |
HT |
水平制表符 |
19 |
EM |
介质中断 |
0A |
LF |
换行符 |
1A |
SUB |
替补 |
0B |
VT |
垂直制表符 |
1B |
ESC |
溢出 |
0C |
FF |
换页符 |
1C |
FS |
文件分割符 |
0D |
CR |
回车符 |
1D |
GS |
分组符 |
0E |
SO |
不用切换 |
1E |
RS |
记录分割符 |
0F |
DI |
启用切换 |
1F |
US |
单元分割符 |
PPP比SLIP只多了额外3个字节,一个字节留给协议字段,另外两个留个CRC字段。
总体看,PPP比SLIP有如下优点:
(1) PPP 支持在单根串行线路上运行多种协议,不只是I P 协议
(2) 每一帧都有循环冗余检验
(3) 通信双方可以进行 I P地址的动态协商(使用I P 网络控制协议)
(4)与C S L I P类似,对T C P和I P 报文首部进行压缩
(5) 链路控制协议可以对多个数据链路选项进行设置
为这些优点付出的代价是在每一帧的首部增加 3个字节。。虽然如今SLIP用户依然比PPP用户多,但最终SLIP将会被取代。
2.5回环接口(127.0.0.1)
回环接口,又叫环回接口都是Loopback Interface的翻译,不过我觉得环回有点拗口。关于这个127.0.0.1基本上学过网络编程的人都不会陌生。比如你用java写一个c/s的程序,要用自己的PC又当Server又当Client。就需要这个回环地址。同样java中可以用localhost代替。A类网络号就是为了回环接口预留的,大多数系统喜欢分配127.0.0.1,所以在你不装网卡的时候用ping命令也是可以通的。.当你把ip数据报传给这个接口的时候,就不能再任何网络上出现了。
也许你会觉得,既然是自己给自己传递数据。那么就不必先一层一层向下传,再一层一层向上传递了。但是多数厂品还是会完成传输层和网络层的传递过程。回环接口可以看作是网络层下面的另一个链路层。与其他链路层一样,只不过他把数据又返回了IP输入队列中。
2.6MTU(最大传递单元)
链路层对于传输的数据是有长度限制的。不同网络有所不同。
网络 |
MTU字节 |
超通道 |
65535 |
10Mb/s令牌环(IBM) |
17914 |
4Mb/s令牌环(IEEE 802.5) |
4464 |
FDDI |
4352 |
以太网 |
1500 |
IEEE 802.2/802.3 |
1492 |
X.25 |
576 |
点到点(低时延) |
296 |
上面的点到点的链路层(SLIP和PPP)的MTU并非是值网络媒体的物理特性,只是一个逻辑限制,为了加快交互相应速度。
如果两台主机在同一个网络,那么该网络的MTU就不用说了,确定了。但是如果两个主机在两个不同的网络,进行通信的时候中间又经过不同的网络,美每个网络都有不同的MTU,那么该次通信的MTU是多少呢?答案也很理解,就是其中的最小值。称为“路径MTU”。实际上,两台主机之间的路径MTU不是一个常数。这取决于当时所选的路由。比如,从小明到小红家有好多条路可以走,小明并不一定每一次都走同一条路哦。