交换机与路由器配置项目式教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 分析不同协议封装格式

在TCP/IP模型中,传输层要使用TCP或UDP协议对应用层数据进行封装,然后交给互联层,再使用IP协议进行封装,而后再交给数据链路层,由数据链路层协议进行封装成帧。下面我们来简单了解TCP报头格式、IP数据报格式和以太网数据帧的帧格式,我们主要关心格式中的端口、IP地址和MAC地址。详细说明请参阅介绍TCP/IP协议的专门书籍。

1.传输层TCP协议封装格式

TCP协议对应用层数据进行封装时,就是在应用层协议数据单元前面加上TCP协议的控制信息,称为TCP报头,如图1.4所示。

图1.4 TCP报文格式

报文由报头和数据两个部分组成:数据部分就是应用层的协议数据单元,报头由20个固定字节和4N(N为正整数)个字节的选项和填充项组成。

Source Port是源端口,指明了发送端所使用的端口。端口是传输层向应用层提供服务的层间接口,编号用16位二进制数表示,最大值65536;Destination Port是目的端口,指明了接收端所使用的端口。报文到达目的主机的传输层后,就是根据目的端口来交给相应的应用程序的。

有些TCP端口是固定指派给一些应用程序的,称为著名端口。例如,FTP为21,WWW为80,Telnet为23,SMTP为25,POP3为110,DOMAIN为53。

同样,UDP也有一些著名端口,如DOMAIN为53,SNMP为161。

UDP和TCP都是传输层协议,但它们的端口号是独立的,即使同样的端口编号,应用程序也不会搞错。

2.互联层IP协议封装格式

IP协议对来自传输层的报文进行分组封装,封装后的数据称为数据报。封装格式如图1.5所示。

图1.5 IP数据报格式

版本:4位,标志IP版本号。目前有IPv4、IPv6。我们目前所用的IP协议基本都是IPv4版本。

首部长度:4位,指的是首部(包括所有选项)所占4字节的数目。首部长度值最小为5,即首部最小长度为4×5=20字节,最大长度为4×15=60字节。

服务类型:8位。其中包含优先权:3位,取值越大优先级越高;TOS:4位,分别表示最小延时、最大吞吐量、最高可靠性、最小费用,如果4位TOS子字段均为0,那么就意味着是一般服务;最后一位未使用。

总长度:16位,指首部和数据之和的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65536字节。

标志:16位,唯一地标志主机发送的每一份数据报。通常每发送一份数据报,这个值就会加1。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标志字段。但这个“标志”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU(最大传输单元)而必须分片时,这个标志字段的值就被复制到所有的数据报的标志字段中。相同的标志字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报,在分片和重组技术中将会用到。

标志:3位,目前只有2位有意义。标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报;MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

片偏移:13位,指较长的分组在分片后某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

生存时间:8位,生存时间字段常用到的英文缩写是TTL(Time To Live),表明数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子而白白消耗网络资源。

协议:8位,指出此数据报携带的是使用何种协议(上层协议)的数据,以便使目的主机的IP层知道应将数据部分上交给哪个进程处理。协议可包括TCP、UDP、Telnet等。如1代表ICMP,2代表IGMP,3代表TCP,17代表UDP等。

首部校验和:16位。首部校验和字段是根据IP首部计算的校验和码。它不对首部后面的数据进行计算。ICMP、IGMP、TCP和UDP在它们各自的首部中均含有同时覆盖首部和数据校验和码。为了计算一份数据报的IP校验和,首先把校验和字段置为0,然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在校验和字段中。当收到一份IP数据报后,同样对首部中每个16 bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的校验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即校验和错误),那么收到的IP数据报就被丢弃。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。

源IP地址:32位,指发送IP数据报的主机IP地址。

目的IP地址:32位,指IP数据报发往的主机IP地址。

3.数据链路层协议封装格式

我们在这里了解几种常用数据链路层封装协议,注意各个协议规定的物理地址之间的区别。

(1)以太网协议封装格式。

以太网帧格式主要有DIX Ethernet V2和IEEE 802.3以太网帧格式,Ethernet V2帧格式是普遍使用的帧格式。

Ethernet V2协议对网络层来的数据包按如图1.6所示格式进行封装。

图1.6 Ethernet V2以太网帧格式

目的MAC地址是接收站的物理地址,由48位二进制数表示;源MAC地址是发送站的物理地址。

类型字段用于标识所携带数据的上层协议的类型,区分数据是IP数据、IPv6数据、IPX数据等,如0X0800代表IP数据,0X86DD代表IPv6数据。

Ethernet V2协议封装的以太网帧格式由14个字节的帧头、数据本身和4个字节的帧尾组成。帧长度最少为64个字节,最长为1518个字节。少于64个字节的以太网帧是无效帧。

当Ethernet V2帧由数据链路层交给物理层时,还要由硬件自动给帧在前面加上8个字节。其中,前7个字节为同步码,第8个字节为帧开始定界符。

(2)HDLC协议的帧格式。

HDLC(High Level Data Link Control)协议是一个面向位的同步高级数据链路控制协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC(Synchronous Data Link Control)协议扩展而成的。实现通信链路上一个主站与多个次站之间的数据通信。HDLC协议将数据封装成帧,HDLC帧格式如图1.7所示。

图1.7 HDLC帧格式

HDLC有信息帧(I帧)、监控帧(S帧)和无编号帧(U帧)3种不同类型的帧。信息帧用于传送有效信息或数据,通常简称为I帧。监控帧用于差错控制和流量控制,通常称为S帧。无编号帧用于提供对链路的建立、拆除以及多种控制功能,简称U帧。

HDLC帧由标志、地址、控制、信息和帧校验序列等字段组成。

标志字段为01111110,标志一个HDLC帧的开始和结束。

地址字段是8比特,用于标志接收或发送HDLC帧的地址。地址字段的内容取决于所采用的操作方式。在操作方式中,有主站、从站、组合站之分。每一个从站和组合站都被分配一个唯一的地址。命令帧中的地址字段携带的地址是对方站的地址,而响应帧中的地址字段所携带的地址是本站的地址。

控制字段是8比特,用来标明是数据帧、命令帧还是应答帧,标明所发送帧的序号和希望接收的帧的序号以及查询、结束标志等。

信息字段可以是任意的二进制比特串,长度未做限定,其上限由FCS字段或通信节点的缓冲容量来决定,目前国际上用得较多的是1000~2000比特,而下限可以是0,即无信息字段。但是监控帧中不可有信息字段。

帧检验序列字段为16位CRC校验码,对两个标志字段之间的整个帧的内容进行校验。

(3)Cisco HDLC协议的帧格式。

Cisco HDLC协议是Cisco公司对ISO的HDLC协议的扩展,主要是增加了16比特的协议字段,用来标明所携带数据的上层协议的类型,如0X0800代表IP数据。帧格式如图1.8所示。

图1.8 Cisco HDLC帧格式

Address字段用来标明所携带的是单播包还是广播包。0X0F代表单播包,0X8F代表广播包。

Control字段总是设置成全零,即0X00。

FCS字段为CRC校验字段。

Flag字段为帧标志字段。

Cisco路由器在串口上默认使用Cisco HDLC协议进行封装。

(4)帧中继协议封装格式。

帧中继封装分为IETF(互联网工程任务组)封装和Cisco封装。Cisco封装简化了IETF封装。我们这里只介绍对分配到网络层协议标志(Network Level Protocol ID,NLPID)的协议数据进行IETF帧中继封装的格式。NLPID由ISO和CCITT负责管理,数量有限,不可能为每个协议分配。IETF帧格式如图1.9所示。

图1.9 IETF帧格式

地址字段的主要用途是区分同一通路上多个数据链路连接,以便实现帧的复用或分路。地址字段通常为16位,包含一个指明能够到达接收站的本地虚电路DLCI号。DLCI号占10位,最大值1023;C/R为命令/应答指示;EA0、EA1为地址字段扩展位;DE为帧可丢弃位;FECN为前向显式拥塞位;BECN为后向显式拥塞位。

控制字段代表帧类型,IETF帧的控制字段值为0X03,为无编号帧。

网络层协议标志(NLPID)用来区分携带的不同网络层协议,如IP、SNAP等。没有分配NLPID的协议使用0X80。没有分配NLPID的协议数据在进行封装时,还需要添加填充字段。