1 引言
学分分析抓到的数据包是创作本文最初的目的,从而形成了以数据的视角看待数通网络的思考维度。以数据的视角来看待我们的计算机网络,这可能是理解它最好的思考方式和思想主线。
本文不仅详细介绍了数据在网络中的传输过程及表现形式,并通过相应抓包实例展示这些实现,试图使抽象的概念变得触手可及,这也是创作本书努力想要达到的目的,理论和实际紧密结合,从而让理论变得易于理解。这种叙述方式贯穿全书,通过各点击破从而掌控整个数据通信网络系统全局。
如果你对抓包协议分析工具的使用有疑问,请出门右转往前走,移步到《Wireshark抓包实战》。
2 数据在网络中的传输
所有的数据对于网络来说都是业务,不同的业务数据对传输的要求不一样,就需要有不同的信令协议来满足它,不同的信令协议对数据的封装和标识提出了不同的要求,从而又产生了各种封装协议和标识协议。现在就让我们从业务数据的角度来对数据通信网络做一个全面的、宏观的、高屋建瓴认识。
在数通网络模型中,每一个上层对于下层来说都是业务、是应用、是数据;每一个下层对于上层来说都是服务。下层协议通过SAP(Service Access Point 服务访问点)为上层协议提供服务,每一层对SAP的实现方式(或表现形式)都不一样。以TCP/IP模型为例,传输层使用TCP、UDP或SCTP协议,应用层的程序通过调用TCP、UDP或SCTP端口号(Port Number)获得传输层服务;网络层使用IPv4或IPv6协议,通过IP协议号(IP Protocol Number)或Next Header区分使用网络层服务的协议;网络接入层基本上是以太网的天下,以太网通过以太网类型(Ethernet Type)来区分使用网络接入层的协议。我们把端口号、IP协议号和以太网类型统称之为服务标志。
在发送端,数据从上层到下层逐层封装,并打上它在下层注册的服务标志;在接收端,数据再从下层到上层逐层拆解,根据标记的服务标志,送给对应的上层协议去处理,这就是所谓的对等层通信。数据最终会送到应用层相应的应用程序,经应用程序解析并处理后提供给用户或做进一步处理。
数据在网络模型中的封装与拆解,如下图02-01:
图 02-01 数据在网络各层次中的表现形式
在TCP/IP网络模型中,可以简单地理解各层的功能如下:应用层是用户接口,负责用户数据数字化;传输层是数据进入网络的接口,负责将数据封装成网络Socket;互联网层提供组网与网际互联,负责数据在网络中的转发;网络接入层负责为用户的联网设备提供接入网络的接口。其实在网络接入层中还应分出一个物理层,它负责将数字数据信号化,即将数字数据转换成电、光、或载波等物理信号。
我们无法将目前垄断局域网的以太网单独归入OSI模型的数据链路层或物理层,因为它同时实现了数据链路层和物理层的功能,将其归入TCP/IP的网络接入层才更合适。
用户通过调用应用程序,产生计算能够识别和处理的数据。
数据通过传输层Socket封装,进入网络进行传输。
互联网层在转发数据时需要先做三件事:1)计算本节点到目的节点的出口,即路由;2)对业务数据进行本层的标记封装;3)最后才是转发数据到对应的路由出口。计算路由和封装数据并没有先后顺序,但一般的情况是先计算好路由,数据来的时候直接封装并转发。
在还没有发展出IP网络的时候,即在网络发展的较早期阶段或简单组网场景中,数据转发没有或不需要网络层封装与转发,使用的是数据链路层的封装与转发。为了解决二层设备的兼容性和线路复用等问题,才发展出了网关和IP网络。
传说桑迪.勒纳(Sandy Lerner)和丈夫雷纳尔德.博萨科(Leonard Bosack)在斯坦福大学读研和任教时相识,两人为了解决使用不同电脑及联网协议传递信息的需要,开发出了协议网关产品,后来拿到风投创立了思科系统(CISCO System)公司。这很显然只是一个浪漫的创业故事(Story),真实性并不足以为信。
虽然说故事归故事,但我们还是从CISCO的成功中看到了联结和连接的重要性。华为公司后来居上,在联结和连接的成本和便利性等方面更胜一筹,实现了更大规模连接,创造了更大的价值,最终也成就了更好的自己。
ICT行业天然具有垄断性。网络的规模越大,其价值越大;节点的连接数越多,其价值越大。无论个人或组织,都应当千方百计地想办法加入到更大的价值网络当中,并尽可能地增加自己的连接数。千万不要把自己孤立在价值网络之外。
3 面向网络的应用程序
我们把使用到网络的应用程序叫做面向网络的应用程序,或简称为网络应用程序。借助网络应用程序,我们的数据才可以在网络上进行传输。面向网络的的应用程序一方面为用户提供人机界面,将用户数据数字化,另外一方面网络应用程序通过调用Socket相关操作,进入网络进行转发。
4 TCP、UDP与SCTP
从传输层开始,数据才真正进入网络。传输层通过提供Socket相关操作接口,为应用程序数据提供数据进入网络的入口,并通过不同端口号区分不同的上层应用。
4.1 端口号
传输层通过TCP、UDP或SCTP端口号为上层应用提供服务,不同的端口与对应不同的应用或服务。所有端口号都是由IANA(Internet Assigned Numbers Authority,互联网号码分配权威)管理,该组织维护一个在线的数据库并随时更新,所有已注册端口号都会在网站上公布,链接地址如下:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml。
常见的应用协议及对应端口号如表02-01:
表02-01 常用协议及端口表
Service Name | Port Number | Transport Protocol |
ftp-data | 20 | tcp |
ftp-data | 20 | udp |
ftp-data | 20 | sctp |
ftp | 21 | tcp |
ftp | 21 | udp |
ftp | 21 | sctp |
ssh | 22 | tcp |
ssh | 22 | udp |
ssh | 22 | sctp |
telnet | 23 | tcp |
telnet | 23 | udp |
smtp | 25 | tcp |
smtp | 25 | udp |
dns | 53 | tcp |
dns | 53 | udp |
bootps | 67 | tcp |
bootps | 67 | udp |
bootpc | 68 | tcp |
bootpc | 68 | udp |
tftp | 69 | tcp |
tftp | 69 | udp |
http | 80 | tcp |
http | 80 | udp |
http | 80 | sctp |
pop2 | 110 | tcp |
pop2 | 110 | udp |
pop3 | 110 | tcp |
pop3 | 110 | udp |
sftp | 115 | tcp |
sftp | 115 | udp |
ntp | 123 | tcp |
ntp | 123 | udp |
epmap | 135 | tcp |
epmap | 135 | udp |
profile | 136 | tcp |
profile | 136 | udp |
netbios-ns | 137 | tcp |
netbios-ns | 137 | udp |
netbios-dgm | 138 | tcp |
netbios-dgm | 138 | udp |
netbios-ssn | 139 | tcp |
netbios-ssn | 139 | udp |
imap | 143 | tcp |
imap | 143 | udp |
snmp | 161 | tcp |
snmp | 161 | udp |
snmpstrap | 162 | tcp |
snmpstrap | 162 | udp |
bgp | 179 | tcp |
bgp | 179 | udp |
bgp | 179 | sctp |
imap3 | 220 | tcp |
imap3 | 220 | udp |
efs | 520 | tcp |
router | 520 | udp |
ripng | 521 | tcp |
ripng | 521 | udp |
ibm-db2 | 523 | tcp |
ibm-db2 | 523 | udp |
ldp | 646 | tcp |
ldp | 646 | udp |
mysql | 3306 | tcp |
mysql | 3306 | udp |
bfd-control | 3784 | tcp |
bfd-control | 3784 | udp |
bfd-echo | 3786 | tcp |
bfd-echo | 3786 | udp |
postgre | 5432 | tcp |
postgre | 5432 | udp |
TCP是面向连接的协议,在通信的双方在交互数据之前先建立起TCP连接,数据传输的可靠性比较高,因此也需要更多的标识字段,协议开销也比较大,通信效率相对UDP较低,缺省的TCP报文头长度是20Bytes。应用在需要高可靠传输场景,广域网大部应用多采用TCP传输。
UDP是无连接的协议,数据交互之前不需要建立连接,数据传输的可靠性相对TCP较差,需要的标识字段也比较少,协议开销小,通信效率高,UDP报文头长度是8Bytes。应用在需要高效传输和网络质量较好的场景,很多局域网应用都采用UDP传输。
4.2 TCP
TCP(Transport Control Protocol,传输控制协议),IP协议号是6,是传输层一个面向连接的、可靠的传输协议。TCP最早在RFC761中描述,后来被RFC793被重新描述并废弃。对原著有明显偏好的同学可以移步到IETF官方网站,RFC793链接地址是:https://datatracker.ietf.org/doc/rfc793/?include_text=1。
4.2.1 TCP报头格式
图02-02 TCP报头格式 RFC793
TCP报头说明:
1)TCP报头宽度是32位;
2)Source Port源端口,长度16位;
3)Destination Port目的端口,长度16位;
4)Sequence Number顺序号,长度32位;
5)Acknowledgment Number确认号,长度32位;
6)HLEN,TCP头部长度,4位长,表示TCP中包含多少个32位字;
7)Reserved,保留,未使用,长度4位;
8)标志,可以是ACK,PSH,RST,SYN,FIN,用来建立和维护TCP连接等;
9)Window Size窗口大小,表示在确认了字节之后还可以发送多少字节,长度16位;
10)Checksum校验和,长度16位;
11)Urgent Pointer紧急指针;
12)Options and Padding可选项,0~32字节。
TCP报头在没有添加任何选项的情况下是20Bytes,也是TCP报头的最小长度,实现中通常都是这个长度。
4.2.2 TCP报文实例
在Wireshark网络协议分析工具显示的TCP报头如下图02-03。
图02-03 Wireshark网络协议分析工具显示的TCP报头
4.2.3 滑动窗口
TCP协议的流量控制是用窗口机制实现的。在接收端,窗口大小是指本地接收缓冲区的大小;在发送端,窗口大小是指发送缓冲区的大小。窗口的大小通过滑动窗口算法在发送端和接收端进行协商。在报头字段中用16位表示,最大可表示65535,也是常见的首次协商发起大小。
4.2.4 TCP三次握手
TCP连接建立过程也叫做TCP三次握手(TCP Three Way Handshake),如下图02-04。
图02-04 TCP三次握手
4.2.5 TCP三次握手实验
图02-05 TCP SYN
这是一个TCP SYN分节,从上图02-05我们可以看出如下信息:
1)TCP协议的IP协议号是6;
2)数据是由源地址192.168.1.2发往目的地址104.20.0.85;
3)源端口是本地随机分配的一个未被占用的端口1280,目的端口是源端请求的知名端口80;
4)TCP的流索引号是27;
5)SYN序列号是0,即seq = 0;
6)SYN位被设置,即0x02,表示这是一个SYN;
7)窗口大小为65535。
图02-06 TCP SYN+ACK
这是一个TCP SYN + ACK分节,从上图02-06我们可以看出如下信息:
1)TCP协议的IP协议号是6;
2)数据是由源地址104.20.0.85发往目的地址192.168.1.2;
3)源端口是一个知名端口80,目的端口是一个随机端口1280;
4)TCP的流索引是27,此字段可用来标识一个TCP连接;
5)SYN序列号是0,seq=0;
6)ACK序列号是1,即ack = seq + 1;
7)SYN位和ACK位都被设置,即0x12,表示这是一个SYN+ACK;
8)窗口大小为29200。
图02-07 TCP ACK
这是一个TCP ACK分节,从上图02-07我们可以看出如下信息:
1)TCP协议的协议号是6;
2)数据是由源地址192.168.1.2发往目的地址104.20.0.85;
3)源端口是一个随机端口1280,目的端口是一个知名端口80;
4)TCP的流索引是27;
5)ACK序列号是1,即ack = seq + 1;
7)ACK位被设置,0x10,表示这是一个ACK;
8)窗口大小为65536。
至此,流索引为27 的TCP连接建立成功!
4.3 UDP
UDP (User Datagram Protocol,用户数据报协议),IP协议号是17,是一个无连接的,尽力而为的传输协议,在数据封装和传输机制上都更加精简,相对于TCP来说传输效率更高。UDP协议在RFC768中描述,对原著有明显偏好的读者可以移步到IETF官方网站,链接地址是:https://datatracker.ietf.org/doc/rfc768/?include_text=1。
4.3.1 UDP报头格式
图02-08 TCP报头格式 RFC 768
UDP报头说明:
1)UDP报头宽度是32位;
2)Source Port,源端口,长度16位;
3)Destination Port,目的端口,长度16位;
4)Length,UDP分段长度,长度16位;
5)Checksum,校验和,长度16位,可选字段,当不使用检验和时,此字段全部置为0;
UDP报头的长度是8Bytes。因为没有什么选项,长度相对TCP比较固定。
4.3.2 UDP报文实例
在Wireshark网络协议分析工具上显示的UDP报头,如图02-09所示。
图02-09 Wireshark网络协议分析工具显示的UDP报头
从上图02-09中我们可以看出如下信息:
1)UDP协议的协议号是17;
2)数据是由源地址192.168.1.2发往目的地址163.177.69.40;
3)源端口是一个随机端口1028,目的端口是一个“知名”端口8000(连企鹅都知道);
4)报文的长度是178;
5)报文校验和是0x627f,没有使能确认;
6)数据内容有170字节。
4.4 SCTP
SCTP(Stream Control Transmission Protocol,流控制传输协议),IP协议号132。它支持多宿主和多流,处理和传输数据的效率高;在建立关联时,服务端不保存状态,不占用服务端系统资源,天然具有抗DoS(Denial of Service,拒绝服务)***能力;它唯一不好的地方就是提供乱序消息服务的同时没有处理好数据乱序的问题。SCTP目前应用相对较少,随着将来网络传输数据量的增加和安全性的需要,有望得到广泛应用。SCTP在RFC4960中描述,链接地址如下:https://datatracker.ietf.org/doc/rfc4960/?include_text=1
5 IP
IP(Internet Protocol,互联网协议)是互联网层最重要的一个协议,根据发展阶段不同,有两个版,分别是IPv4(Internet Protocol Version 4)和IPv6(Internet Protocol Version 4)。IPv4提供32位地址空间,IPv6提供128地址空间。联网设备数的增加是大概率事件,IPv6的普及也是大概率事件,现在正处在转折点上。
IP是一个标识协议,提供了两项非常重要的功能:寻址和破碎。寻址包括编址和把互联网数据报从源地址转发到目的地址;破碎就是把大块的上层应用数据分割并打包成能在网络上传输的小块,并在接收端把他们重组。IP被设计用在包交换计算机网络互联通讯系统中。
5.1 IPv4
IPv4 (Internet Protocol Version 4,互联网协议版本4),以太网类型是0x0800。互联网协议为在不同的互联系统中的主机提供主机到主机的数据报服务。Internet Protocol最早在RFC760中定义,后来被RFC791重新描述并废弃,对原著有明显偏好的同学可以移步到IETF官方网站,RFC791链接地址是:https://datatracker.ietf.org/doc/rfc791/?include_text=1。
5.1.1 IP协议号
IPv4通过协议号为上层应用提供服务,不同的应用对应不同的IP协议号,号码也是由IANA管理,在线数据库地址是:https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml#protocol-numbers-1。
常见的应用协议及对应协议号如表02-02:
表02-02 常用IP协议号及对应协议表
号码 | 协议缩写 | 协议名 |
1 | ICMP | Internet Control Message |
2 | IGMP | Internet Group Management |
4 | IPv4 | IPv4 encapsulation Stream |
6 | TCP | Transmission Control Protocol |
17 | UDP | User Datagram Protocol |
88 | EIGRP | Enhanced Interior Gateway Routing Protocol |
89 | OSPF | Open Shortest Path First |
103 | PIM | Protocol Independent Multicast |
112 | VRRP | Virtual Router Redundancy Protocol |
115 | L2TP | Layer Two Tunneling Protocol |
124 | ISIS over IPv4 | ISIS over IPv4 |
132 | SCTP | Stream Control Transmission Protocol |
134 | RSVP-E2E-IGNORE | RSVP-E2E-IGNORE |
137 | MPLS-in-IP | MPLS-in-IP |
5.1.2 IPv4报头格式
图02-10 IP报头格式,rfc791
IPv4报头结构解释如下 :
1)Version 版本,4位,0x0100表示是IPv4;
2)IHL 头长度,4位,表示32位字长的报文长度,缺省长度20Bytes,也是IP报头的最小长度;
3)Type of Service 服务类型,8位,用于实现QoS;
4)Total Length 总长度,16位,包括数据和报头在内的总长,以字节计;
5)Identification 标示,16位,标识一个数据包,与分片偏移字段一起使用,用来标识被分段的数据包。例如,当一个数据包的大小超网络传输的MTU时,被分片的数据包会打上同一标识;
6)Flags 标记,3位,表示是否可以对数据包分段,如果设置为对大包不分段,可以用来测试网络中MTU的大小;
7)Fragment Offset 片偏移/分段偏移,13位,以8位组为单位,用来标示分段起始点相对于报头起始点的偏移量;
8)Time to Live 生存时间,8位,在UNIX系和新的Windows操作系统上,缺省是64,在多数Windows操作系统上缺省值是128,目前在绝大多数网络设备上,缺省值都是255,数据包在网络中传输时,每经过1跳就会减1,当此值为0是包丢弃;
9)Protocol 协议,8位,用来标示封装的上层应用,用IP协议号来表示,每一个上层协议都会对应一个协议号,如本节开头所描述;
10)Header Checksum 报头检验和,16位,报头检验和,不包含数据,发送者计算产生,接收者重新计算以校验对错,因为TTL值的变化,每一个转发者需要重新计算;
11)Source Address 源地址,32位,发送者地址,由4个八位组构成的IP地址;
12)Destination Address 目的地址,32位,接收者地址,由4个八位组构成的IP地址;
13)Options 选项,可变长度,在IP报头中是可选的,通常都没有用到;
14)Padding 填充,填充选项,如果选项的长度不够32位,填充字段用0补足。
有关IP地址更多详细内容请查阅本书第15章《IP与IP编址》。
5.1.3 IPv4报文实例
IP报头在WireShark网络协议分析工具上的显示如下图:
图02-11 IPv4报头实例,访问www.ietf.org抓包
从上图我们可以看出如下信息:
1)这是一个IPv4数据包,源地址是104.20.0.85,目的地址是192.168.6.57;
2)报头长度是20Byte;
3)没有提供DSCP QoS(一种服务质量类型);
4)包总长度是40,单位是Bytes,是指上层数据的长度;
5)包ID是0x2c25(11301);
6)数据包没有被分片;
7)当前包的TTL是50;
8)上层协议是TCP,IP协议号是6;
9)头部校验和是0xed60,头部检验和禁用;
10)因为Wireshark头部检验没有启用;
11)源地址是104.20.0.85;
12)目的地址是192.168.6.57;
13)源IP地理位置信息,未知;
14)目的IP地理位置信息,未知;
5.2 ARP
ARP,Address Resolution Protocol,地址解析协议。用来查询出单播目的IP地址对应的下一跳IP地址的MAC地址,然后把查询出来的这一地址封装在以太网帧的目的MAC地址。ARP协议在RFC826中描述,对原著有特别偏好的同学可以移步到IETF官方网站,链接地址是: https://datatracker.ietf.org/doc/rfc826/?include_text=1。
传输层的数据段到达网络层后要封装上网络层的报头,并添加源和目的IP地址,形成数据包。数据包到达网络接入层后要封装以太网报头并添加源和目的MAC地址。源MAC地址直接封装出接口地址,目的MAC地址要如何封装呢?其实目的MAC地址封装的是目的IP地址对应的下一跳IP地址的MAC地址,有时目的IP地址可能就是下一跳地址,但如果涉及到向外网路由数据那就不是了。具体的实现有三种情况,分别是:
1)对于目的IP是广播地址,目的地址就是下一跳地址,广播IP地址(32个1)直接映射为广播MAC地址(48个1);
2)对于目的IP是组播地址,是通过将IP地址的后23位映射到组播MAC地址的后23位来实现的;
3)对于目的IP是单播IP地址,IP地址到MAC地址的映射是通过ARP来完成的。
单播IP地址才是常态,组播IP地址只有在组播协议或组播应用的网络中才有,数量也比较小,产生广播IP地址的场景主要是ARP和DHCP,并以ARP为主。其实ARP产生的广播IP也是由单播地址而来。ARP表中没有MAC地址对应关系的单播地址,其与MAC的对应关系是通过ARP协议查询得到,ARP查询的目的地址是广播地址。
IP地址与MAC地址的对应关系存放在ARP表中,单播IP地址的ARP表的构建需要两个步骤,如下图:
图02-12 ARP请求广播发送,单播回复,收到回复,表项建立成功
1)请求者以广播形式发送ARP请求,询问目的IP地址对应的下一跳IP地址的MAC地址,同一个广播域内的设备都会接收,正常情况下只有实际的IP地址拥有者才会响应;
2)实际被请求者以单播的形式进行回复,请求者收到回复,表项建立成功,交互结束。
ARP Request报文在Wireshark协议分析工具上的显示:
图 02-13 ARP请求以广播形式发送
从图02-13中我们可以看出:
1)这是一个ARP报文,其以太网类型是0x0806;
2)硬件类型是以太网,Ethernet;
3)协议类型是IP协议;
4)硬件大小是6;
5)协议大小是4;
6)ARP协议的类型是请求,request(0x0001);
7)不是无故ARP(无偿ARP/免费ARP);
8)发送者的MAC地址是00:1e:65:28:2f:46;
9)发送者的IP地址是192.168.6.30;
10)目标MAC地址是00:00:00:00:00:00;
11)目标IP地址是192.168.6.1。
ARP Reply报文在Wireshark协议分析工具上的显示:
图 02-14 ARP回复以单播形式发送
从图02-14中我们可以看出:
1)这是一个ARP报文,其以太网类型是0x0806;
2)硬件类型是以太网,Ethernet;
3)协议类型是IP协议;
4)硬件大小是6;
5)协议大小是4;
6)ARP协议的类型是回复,reply(0x0002);
7)不是无故ARP(在有些文献中也被叫做无偿ARP或免费ARP);
8)发送者的MAC地址是;20:a6:80:64:a3:5d;
9)发送者的IP地址是192.168.6.1;
10)目标MAC地址是00:1e:65:28:2f:46;
11)目标IP地址是192.168.6.30。
更多有关ARP的详细内容请查阅本书本书第16章《ARP及其在生产中的应用》。
5.3 IPv6
基于计算机网络本身的魅力,再加上5G(Fifth Generation)和IoT(Internet of Things)技术的普及,预期未来联网设备数将大幅度增加,原来提供32位地址空间的IPv4已经不能满足现实需要,迫切需要更大的可标识地址空间。中关村在线2019年11月27消息,2019年11月26日全球43亿个IPv4地址正式耗尽!
关于下一代互联网曾提出过很多个方案,最终IPv6胜出。IPv6可提供128位地址空间,是在IPv4经验教训的基础上提出的下一代互联网协议标准,各国政府都在全力推行,中国也不例外。
在2017年11月26日,中共中央办公厅、国务院办公厅印发了《推进互联网协议第六版(IPv6)规模部署行动计划》,并发出通知,要求各地区各部门结合实际认真贯彻落实。中国政府网可查全文内容,网页链接地址如下:http://www.gov.cn/zhengce/2017-11/26/content_5242389.htm
2018年05月03日,中国政府网又发布了工业和信息化部关于贯彻落实《推进互联网协议第六版(IPv6)规模部署行动计划的通知》, 中国政府网可查全文内容,网页链接地址如下:http://www.gov.cn/xinwen/2018-05/03/content_5287654.htm
2018年08月03日,工信部通信司召开IPv6规模部署及专项督查工作全国电视电话会议,新闻内容可在中共中央网络安全和信息化委员全办公室及中华人民共和国国家互联网信息办公室网站可查,网页链接地址如下:http://www.cac.gov.cn/2018-08/04/c_1123220958.htm
中国人民银行,中国银行保险监督管理委员会,中国证券监督管理委员会联合发文(《银发【2018】343号》),《关于金融行业贯彻《推进互联网协议第六版(IPv6)规模部署行动计划的实施意见》,《意见》对金融行业规模部署IPv6给出指导。
与IPv6相关的RFC文档有:
RFC1883,RFC2460,RFC5095,RFC5722,RFC5871,RFC6437,RFC6564,RFC6935,RFC6946,RFC7045,RFC7112,RFC8200。
RFC1883,Internet Protocol, Version 6 (IPv6) Specification,是IPv6的最早描述,链接地址:https://datatracker.ietf.org/doc/rfc1883/?include_text=1。
RFC2460是目前对IPv6的通用描述,它废弃了RFC1883,链接地址:https://datatracker.ietf.org/doc/rfc2460/?include_text=1。
IPv6的最新内容由RFC8200描述,发布于2017年10月30日,它废弃了RFC2460 [4],链接地址:https://datatracker.ietf.org/doc/rfc8200/?include_text=1。
IPv6通过Next Header来区分上层应用,在IPv4协议号的基础上增加一些IPv6特有的应用。
据IPv6 Forum网站消息,在全球IPv6采用和部署情况方面,中国还是比较落后的,目前排在前面的是比利时63%,德国61%,瑞士57%,美国51%,英国50%。
5.3.1 IPv6特点
IPv6不仅仅是提供了更大的地址空间,同时也优化了IPv4的一些不足,其特点总结如下:
1)将地址空间从32位扩展到128位;
2)简化报头格式;
3)改进为支持扩展选项,更强的扩展能力;
4)报头中添加流标记域,方便实现服务质量;
5)扩展的安全选项,支持端到端安全;
6)分层地址结构;
7)去掉广播,添加任播;
8)移动性支持;
9)无状态自动配置。
5.3.2 IPv6报头格式
图 02-15 IPv6报头格式
IPv6报头结构解释如下 :
Version 版本号,4位,0x0110,就是十进制的6,表示IPv6。
Traffic Class 流分类,8位,用于服务质量。
Flow Label流标签,20位,标识一个流。
Payload Length 载荷长度,16位,标识负载的长度。
Next Header 下一报头,8位,标识扩展中的报文类型比如类型,可实现更多扩展功能,比如:值为43的路由头,可实现移动IPv6,类型值为51的认证头,可用于IPSec,实现端到端加密。IPv6通过可选扩展报头还可实现目前没有的功能,其值的定义与IPv4报头中的Protocol字段定义的值相同,详情请参阅RFC1700以及与之相关IANA在线文档[18]。
Hop Limit 跳数限制,8位,可用于限制传播范围或防环。
Source Address 源地址,128位。
Destination Address 目的地址,128位。
5.3.3 IPv6报文实例
图 02-16 IPv6报头实例
从抓包实例我们可以看出如下信息:
1)这是一个IPv6数据包,Ethernet Type是0x86dd;
2)版本号是0110,即十进制的6,表示IPv6协议;
3)流分类是0x00,未分类或缺省分类;
4)流标签是0x0000,未标记或缺省标记;
5)数据载荷长度是40,这里的单位是字节Byte;
6)下一头类型(Next Header)是58,即ICMPv6;
7)跳数限制是128,即超过128个节点后数据包丢弃;
8)源地址是fe80::1001:9c37:37b3:4990;
9)目的地址是fe80::b0b0:8229:80fd:757b。
后面的内容就是ICMPv6相关的内容。
5.3.4 广播替代
IPv4网络最受垢病的就是广播,在IPv4中有两个用到广播的非常重要的协议分别是ARP和DHCP。针对ARP的替代,IPv6中通过ICMPv6的扩展协议NDP实现的;针对DHCP,IPv6中是通过DHCPv6实现的,DHCPv6继承了DHCP的基本实现思想,但是数据交互通过组播地址实现,消息的数量也由8个变成了13个。
更多有关IPv6的内容请查阅《IPv6》一节。
5.4 IP地址空间分配
IP既可以标识联网设备,也可以标识破碎后的数据。其中对联网设备的标示是通过IP地址实现的。IANA维护在其网站维护一个IP地址的分配状态库。
IPv4地址空间分配:
https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml。
组播IPv4地址分配:
https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml。
特殊用途IPv4地址:
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml。
IPv6地址空间分配:
https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml。
IPv6全球单播地址分配:
在地址空间分配上,中国一直处于劣势。
关于IP地址等更多内容,请参阅《IP地址》一节。
6 MPLS
MPLS,Multiprotocol Label Switching,多协议标签交换。介于数据链路层与网络层之间的协议,是一个2.5层的协议,有些文献干脆就把这一层叫做MPLS层。MPLS上层可以支持IPv4、IPv6、IPX、CLNP等,所以称之为多协议。下层可支持Frame Relay,ATM,Ethernet等多种网络类型。MPLS将上层的数据包添加4Bytes的MPLS报头,在MPLS域内都进行标签转发,转发效率高,出MPLS域之前会将标签弹出,从而形成了一个由MPLS构成的***(Virtual Private Network,虚拟专用网)隧道。MPLS层不是必须的存在,园区网基本用不到,但是在运营商环境却非常普遍。
有关MPLS比较重要的RFC有:
RFC3031,Multiprotocol Label Switching Architecture,推荐标准,定义了MPLS的体系结构,链接地址:https://datatracker.ietf.org/doc/rfc3031/?include_text=1。
RFRFC032,MPLS Label Stack Encoding,推荐标准,定义了MPLS标签格式,链接地址:https://datatracker.ietf.org/doc/rfc3032/?include_text=1。
6.1 MPLS报头格式
02-17 RFC 3032中定义的MPLS标签结构
各字段定义如下:
Label:定义标签值,长度20位;
Exp:文档中说是做实验用,但我们通常说是扩展位,用来做QoS,长度3位;
S:栈底标识,也叫栈底位,用来标识是否是标签栈底,长度1位;
TTL:Time to Live,与IPv4中的TTL功能相同,过一跳减1,到0丢弃,可用来防环,长度8位。
6.2 MPLS报文实例
通过Wireshark协议分析工具抓包并显示的MPLS报文头,如图02-18所示:
图 02-18 MPLS报头实例
从图02-18中我们可以看出如下信息:
1)以太网中的Type值是0x8847,表示这是一个MPLS单跳报文;
2)MPLS标签号是1024,是由BGP分配的动态标签;
3)MPLS Exp位是6,缺省对应的QoS服务类型是CS6;
4)栈底标记是1,表示是标签栈底,里面没有更多标签;
5)MPLS TTL值是255,表示这是第一跳MPLS路由器。
6.3 MPLS转发过程
02-19 RFC 3032中定义的MPLS标签结构
路由器的存在是依据路由选择协议(Routing Protocol)规则计算形成路由表(Routing Table),也即路由信息表(RIB,Routing Information Base),路由器对路由信息表中的下一跳地址进行迭代,最终得到一个出接口。这个接口可能是路由器上真实存在的物理接口,也有可能是虚拟的隧道接口(Tunnel Interface),迭代后形成的表就是转发信息表(FIB,Forwarding Information Base)。路由器转发数据的依据实际上是FIB。在FIB中,如果目标网段对应的Tunnel ID是0,通过物理接口转发数据,反之则根据Tunnel ID的值进入相应隧道转发。
在MPLS路由器上,路由器还可以根据MPLS标签值,查询入标签映射表(ILM,Incoming Label Map),得到Tunnel ID。
路由器拿目标网段对应的Tunnel ID,到下一跳标签转发表(NHLFE,Next Hop Label Forward Entry)中查询得到出接口。NHLFE中除了记录Tunnel ID对应的出接口,还记录了Tunnel ID对应的标签操作类型,如:压入(Push)、交换(Swap)、弹出(Pop)等。
MPLS路由器除了转发数据,还需要根据NHLFE中的记录对标签进行相应的操作。在入站MPLS路由器(Ingress节点),上层数据(如IP Packet)添加(Push操作)MPLS标签并进行标签转发;在MPLS转发路由器(Transit节点),路由器转发带标签的数据并更新(Swap操作)出入接口标签值;在出站MPLS路由器(Egress节点),路由器去掉(Pop操作)标签,数据交由上层协议(如IP)处理。
更多详细内容,请查阅本书第25章《MPLS及其应用》。
7 以太网
以太网是最为典型的网络接入层LAN实现,至今经历过两个版本,分别是Ethernet和Ethernet II,目前的LAN网络中应用的都是以太网。
以太网是由DEC,Intel,Xerox三家公司在1982年联合发布的一个标准,后来转到由IEEE 802.3委员会维护和更新,目前已经发展到100G以太网。以太网是一个包含了OSI/RM中数据链路层和网络层的内容。我们的个人计算机和服务器等机集成的网卡(NIC,Network Interface Card)一般都是以太网网卡。
以太网是局域网实事上的标准,它通过Type号为上层应用提供服务,不同的Type号对应不同的应用协议,Type号也是由IANA管理,在线数据库地址是:https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml。
常见的应用协议及对应Type号如表02-03:
表02-03 常见Ethernet Type号及对应协议
Ethernet Type(hex) | Description |
0x0000~0x05DC | IEEE802.3 Length Field |
0x0100~0x01FF | Experimental |
0x0800 | Internet Protocol version 4 |
0x0805 | X.25 Level 3 |
0x0806 | Address Resolution Protocol |
0x0808 | Frame Relay ARP |
0x0806 | Address Resolution Protocol |
0x22F3 | TRILL |
0x22F4 | L2-IS-IS |
0x8100 | Customer VLAN Tag Type (C-Tag, formerly called the Q-Tag) |
0x8181 | STP, HIPPI-ST |
0x86DD | Internet Protocol version 6 |
0x8808 | IEEE Std 802.3 – Ethernet Passive Optical Network (EPON) |
0x880B | Point-to-Point Protocol (PPP) |
0x8847 | MPLS |
0x8848 | MPLS with upstream-assigned label |
0x8863 | PPP over Ethernet (PPPoE) Discovery Stage |
0x8864 | PPP over Ethernet (PPPoE) Session Stage |
0x888E | IEEE Std 802.1X – Port-based network access control |
0x88A8 | IEEE Std 802.1Q - Service VLAN tag identifier (S-Tag) |
7.1 报文格式
图02-20 以太网II帧结构
1)Destination Address,目的地址,6字节,接收者的物理地址,通常说的MAC地址,48位二进制位;
2)Source Address,源地址,6字节,发送者的物理地址,48位二进制位;
3)Type/Length,类型/长度,2字节,可以表示帧数据的长度或上层应用的类型,值0~1500表示长度,1536~65535表示上层应用协议的类型,比如0x0800表示是IP,0x0806表示是ARP;
4)Data,数据,可变长度,46~1500字节;
5)FCS,帧校验序列,一般是循环冗余校验,4字节,对事个数据封装的校验。
以太网II帧头长度是18 Bytes,帧数据的最小长度是46 Bytes,最大长度(MTU,Maximum Transmission Unite,最大传输单元)是1500 Bytes,整个帧的长度是64~1518 Bytes。如果小于最小长度,则通过填充内容为0的八位组的方式补齐,填充内容不作为IP数据包的一部分,也不包含在包头字段的总长度当中(rfc894)。MAC子层检测到小于64bytes的帧会当作残帧丢弃。我们通常设置典型的以太网数据帧数据长度是1500 Bytes,再加上报头长度18Bytes,因此以太网帧的总长度就是1518bytes,如果超过最大长度,接收端系统会阻止其它系统发送给自己,解决这个问题的办法是在发送端设置TCP的最大分片大小选项(rfc894),即大块数据在发送一开始就会被分片。
一个典型的以太网帧在WireShark协议分析工具上的显示如下图02-17:
图02-21 典型以太网帧
从上图02-21中我们可以看到,以太网II数据帧信息:
1)源MAC地址是00:1e:65:28:2f:26;
2)目的MAC地址是20:a6:80:64:a3:5d;
3)封装的协议是IP(0x0800);
以太网II数据帧信息已经是网络接入层LLC子层的信息了,内容已经开始包含数据层面的信息。
7.2 关于数据链路层封装的一个不成熟思考
以太网是二层局域网实事上的标准,有一统天下之能势,但是局域网本身也存在一些问题。比如:1)没有老化机制,当环路发生时,一个数据帧可以在二层网络中无限传输,直到环路消失;2)二层网络中缺少像ICMP这样的跟踪定位工具协议,帧结构相对简单,网络问题很难定位;3)48位的MAC地址在未来是否依然够用?
数据链路层封装当初是怎么被设计出来的?如果没有这一层封装,又会带来什么问题?
二层网络的最大优势是VLAN,有它,二层组网可以更加简单方便,成本低廉。如果IPv6发展出合适的扩展报头及处理机制,二层网络被取代也不是没有可能,IPv6交换机也不是没有可能,如果二层封装可有可无,以太网的根基也就受到了动摇。
MPLS及其它其它依赖以太网的技术也无法存在了,将会产生什么样的影响?有什么替代的方案?
数据链路层封装到直网络路层封装如何过渡?两种封装如何共存?
7.3 MAC地址
TCP/IP将网络接入层(Network Access Layer)又划分为LLC(Logical Link Control,逻辑链路控制)子层和MAC(Media Access Control,介质访问控制)子层。介质访问控制地址是最受我们关注的一个存在,它由48位构成,经常用12个十六进制位表示。
1)这是一个烧录(Burn In)地址,一次性写入,不再更改。
2)MAC地址的前24位代表一个组织,叫OUI(Organizationally Unique Identifier 组织唯一标识符),可以通过下面的连接查询:
3)后24位是流水号,所以设备的MAC地址在正常情况下是不会重复的。
MAC地址的唯一性,可以帮助我们锁定某一台设备。
MAC地址的分配也是由IANA来管理,在线数据库地址是:https://www.iana.org/assignments/ethernet-numbers/ethernet-numbers.xhtml。
8 物理信号
物理层最为基础和底层,其主要功能是将数字数据信号化,另外还提供接口形式,引脚定义,电压和光强等。所有的数字都会被转换成由0和1组成的编码,这些编码在以电为信号的网络中由电压高低或电压变化来表示,在以光为信号的网络中由有无光或有无光变化来表示,在以电磁波为信号的网络中由载波有无和载波有无变化来表示,我们把将数字数据信号化为物理信号的过程叫做数字数据的信号化。
8.1 帧物理
很多文档或教材中也会把二层以太刚帧之前的帧起始定界符,前导(也叫前同步码是二进制10101010 10101010 10101010 10101010 10101010 10101010 10101010),甚至包括帧间隙,三者都视之为以太网帧的组成部分。这种理解也许说不上错,甚至也有其合理之处,但是更合理的理解是把它当作帧的物理信息来看待。
从上图02-21中我们可以看到,物理帧相关信息:
1)帧序号19,是指在本次抓包中的排序,仅在本次抓包中有意义;
2)接收时间是中国标准时间2016年6月16日10时03分45秒303545000;
3)新纪元时间1466042625.303545000秒;
4)距离上一帧捕获时间0.002398000秒;
5)距离上一帧显示时间0.002398000秒;
6)距离第一帧时间10.290923000秒;
7)帧序号19;
8)帧长度106字节(848位);
9)捕获长度106字节(848位);
10)帧没有被标记;
11)帧没有被忽略;
12)着色规则名称ICMP;
13)着色规则字串ICMP或ICMPv6;
14)帧长度是106字节。
帧信基本息其实是物理层的信息,从物理世界直接得到的信息。物理层判断帧的起止是通过一串特殊的字符,其实也可以把这一串特殊的字符都看作是数据链路层帧的前导字段。
8.2 帧间隙与帧时隙
计算机设备在发送数据帧时并不是连续的,即每发送完一个帧需要等待一个时间才可以发送下一个帧,其目的是为了让接收者能够处理得过来而不至于拥塞。这个等待的时间间隔我们把它叫做帧间隔或帧间隙(Inter Frame Gap,IFG),它表示一个站点连续发送数据时,帧与帧之间的空闲时间或间隔时间,但是其量纲却不是时间(time),而是比特(bit),比如10/100Mbps以太网的帧时隙就是96Bits,它指的是96位的数据通过线路的时间。Gbps以太网帧间隙是4096Bits。
帧时隙(IFS,Inter Frame Slot)也叫帧时槽,用来表示每一个数据帧占用的最小时间长度,比如10/100Mbps以太网的帧时隙就是512Bits,它是由最小帧数据长度46Bytes + 18Bytes的帧头信息计算得来。在10/100Mbps链路上,如果512位Bits时间仍然没有收到,则认为线路是空闲的,而小于512Bytes的帧则认为是残帧。
定义帧时隙是为了共享线路从而提高其利用率,此检查机制通过CSMA/CD(Carrier Sense Multiple Access/Collision Detection,带冲突检测的载波侦听多路访问)实现。在10Mbps以太网中,512Bits数据传输的时间是51.2us,5-4-3原则最大传输距离是2500m,而根据电磁波的传输角度来看,512Bits在10Mbps以太网最大可传输2800m。在100Mbps中,512Bits的数据传输完需要5.12us,电磁波在这个时间可传输约200m。以太网传输距离的限制最主要的原因其实是基于帧间隔与帧时隙基础上的CSMA/CD,其次才是信号强度的问题。在一些通讯距离较远,而又无法添加中继设备的场景中,我们需要还到另外一个技术,叫长距离以太网(Long Reach Ethernet,LRE),它除了将物理信号增强和提高信号检测的能力外,很重要的一点就是修改了帧间隙。因为帧间隙的修改,LRE设备都需要成对使用,否则时隙不一致就会导致冲突的产生。
9 数据传递实例
当我在浏览器的地址栏里填入http://www.ietf.org/并回车,到我看到IETF的网页,这中间发生了什么?
浏览器首先调socket()函数在本地创建一个大于1024的未被占用的随机端口,再用connect()函数与远端主机www.ietf.org的80端口连接,待TCP连接建立成功后,再使用write()函数将HTTP GET进行封装,发送给www.ietf.org这台主机。
www.ietf.org这台主机如果我刚刚已经访问过,那么主机对应的IP地址就会在我的电脑上进行缓存(Windows主机可能通过ipconfig /displaydns查看),如果在缓存中没有查到,再去查询etc/hosts文件,文件中也没有查到时,就会向DNS Server发起递归查询,直到找到主机www.ietf.org的IP地址,并把它封装到IP头的目的地址字段,源地址封装我电脑的对应出口的IP地址,Protocol字段标记为6。
数据在数据链路层又封装上以太网标记,其中源MAC地址封装我电脑对应出接口的MAC地址,目的地址封装目的IP地址对应的下一跳的MAC地址,这个地址如果ARP表中有,就直接查得并封装,如果没有,则通过发送ARP Request进行查询,收到对应的ARP Reply,则可以完成ARP表项,从而完成数据链路层封装。封装后的数据到达物理层,经过编码转化后形成二进制比特流(Bit Flowing)。
如果中间转发设备是以太网交换机,交换机会根据会根据数据帧目的MAC地址和源MAC地址,查MAC地址表(MAC Address Table)和相关的策略进行转发,且保持原数据帧不变。关于MAC地址表构建过程及数据帧转发的更多详细内容请参阅《STP及其在生产中的应用》一节。
如果中间转发设备是路由器设备,路由器收到数据帧查看其报头,发现其Ethernet Type字段的值是0x0800,把它交给IPv4进程处理。路由器的功能是依据网络层地址转发数据包,转发的依据是转发信息表(FIB,Forwarding Information Base),转发表来自于路由信息表(RIB,Routing Information Base),路由表来自于路由选择协议(Routing Protocol)。路由器转发数据出去之前需要像主机一样从上到下重新封装,不过它封装是从网络层及以下开始,重新添加以太网帧头信息,我们把这个过程叫做重新成帧。在重新成帧时因为封装目的MAC地址字段的需要,需要查询ARP表,这里的目的MAC字段同样填充的是目的IP地址对应的下一跳IP地址的MAC地址。有关路由器转发数据的过程的更多详细内容请查阅本书《路由选择》一节。
转发设备是路由器设备,但Ethernet Type字段的值是0x8847或0x8848,路由器会将数据送给MPLS进程处理,并根据MPLS标签进行转发。
中间可能还经过了传送网设备或其它转发设备,但是它们基本上都是把IP当作业务来处理的,做的是打包、封装、转发、拆解,还原为IP包过程。
数据经过多次查表转发(MAC地址表和路由转发表等),终于来到接收端,即IETF的Web服务器上。在TCP连接请求到达www.ietf.org主机之前,Web服务程序使用socket()函数创建一个端口,端口号是80,并用bind()函数使之与网络层地址相关联,并使用listen()函数监听这个端口,等待用户的TCP连接请求。当我发送的TCP连接请求被传送到www.ietf.org这台主机上时,依次从以太网封装开始向上层拆解。以太网层的封装Ethernet Type字段的值是0x0800,送给网络层,由IP来处理;网络层发现IP Protocol字段的值是6,送给传输层,由TCP来处理;传输层发现TCP端口号是80,www.ietf.org主机上HTTP应用服务使用accept()函数接受我电脑发送过来的TCP连接请求。
TCP连接建立之后,就收到了我从电脑上发过来的HTTP GET请求,HTTP服务进程根据GET请求的内容,回复我相应的HTML文档。回送过来的数据同样要经过从上层到下层的封装,经过网络设备的转发,当到达我的电脑后,再经过由下层到上层的逐层拆解,最终送到我电脑上发出请求的应用程序—浏览器,浏览器收到HTML文档,解析并呈现出来。于是就出现了图02-22的画面。
图02-22 在浏览器的地址栏填下网站的地址并回车,
中间发生了很多奇妙的事情
不管是在服务端和客户端,数据都是由应用层产生并逐层向下传递,在接收方,数据先由物理层接收并逐层向上传递,最终送给应用层的应用程序。中继设备只关心物理层;交换机关心数据链路层和物理层,重点在数据链路层;路由器关心下面三层,重点在网络层;个人电脑或服务器等端计算设备或主机设备拥有相对完备的协议栈,但端计算设备和主机设备重点关注的是应用层。
10 饭后思考题
1)为什么TCP首部长度的字段,而UDP没有?
2)有什么办法可以取代低效的TCP,并保留它的可靠性?
3)数据在网络上传递的过程中,要经过不同类型的网络设备,源IP、目的IP、源MAC、目的MAC经过这些设备后是否会重新封装?如何封装?
4)长距离以太网设备为什么要成对使用?
5)全栈升级到IPv6需要怎么做?需要用到哪些技术?有哪些注意事项?