读书笔记(随笔2)数据在网络中的传输

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
  在 TCP/IP 网络模型中,可以简单地理解各层的功能如下:应用层是用户接
口,负责用户数据数字化;传输层是数据进入网络的接口,负责将数据封装成
网络 Socket;互联网层提供组网与网际互联,负责数据在网络中的转发;网络
接入层一方面负责为用户的联网设备提供接入网络的接口,另外一方面为网络
层等上层应用提供介质无关封装,屏蔽物理硬件的差异。其实在网络接入层中
还应分出一个物理层,它不仅提供物理的接口,还负责将数字数据信号化,即
将数字数据转换成电、光、或载波等物理信号。
我们无法将目前垄断局域网的以太网单独归入 OSI 模型的数据链路层或物理
层,因为它同时实现了数据链路层和物理层的功能,将其归入 TCP/IP 的网络接
入层才更合适。
用户通过调用应用程序,产生计算机能够识别和处理的数据。
数据通过传输层 Socket 接口,进入网络进行传输。
互联网层在转发数据时需要先做三件事:
1)计算本节点到目的节点的出口, 即路由;
2)对业务数据进行本层的标记封装;
3)最后才是转发数据到对应的 。计算路由和封装数据并没有先后顺序,但一般的情况是先计算好路 由,数据来的时候直接封装并转发。
逻辑链路控制(LLC,Logical Link Control) 介质访问控制(Media
Access Control) 一起屏蔽硬件的差异,为上层应用提供统一的访问接口,让
网络层可以专心做自己的转发,而不用关心传输的介质和介质的性质特性等。
不管传播介质是铜线,光纤,还是无线,不管速率是 10Mbps、100Mbps,还是
1000Mbps,对于网络层来说,封装和转发都是同一套规则。
在网络发展的早期阶段,各设备厂家各自为政,各封装样式、封装标识和
通信机制等都各不相同,组建一个网络系统只能使用一个设备厂商的产品,各
个厂商的产品之间基本没有互操作性,导致同一个组织的不同部门因为采购了
不同厂商的产品,部门之间天然形成部门墙,更重要的是用户还很容易被某个
厂商绑定,网络系统的升级改造也是个很大的问题。
传说桑迪.勒纳(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 常用协议及端口表

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。

 

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,目的端口是源端请
TCP Client
(connect())
TCP Server
(listen())
Send SYN
Seq = x
Send ACK
ack = y + 1
Send SYN + ACK
ack = x + 1, seq = y 求的知名端口 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 UDP 报头格式 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
(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 协议号及对应协议表        

 

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
补足。
 
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。
 
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,RF
C6935,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
I
Pv6 的最新内容由 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 个。
 
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 全球单播地址分配:
https://www.iana.org/assignments/ipv6-unicast-address
assignments/ipv6-unicast-address-assignments.xhtml
在地址空间分配上,中国一直处于劣势。
 
6 MPLS
MPLS,Multiprotocol Label Switching, 多协议标签交换 。介于数据链路
层与网络层之间的协议,是一个 2.5 层的协议,有些文献干脆就把这一层叫做
MPLS 层。MPLS 上层可以支持 IPv4、IPv6、IPX、CLNP 等,所以称之为多协议。
下层可支持 Frame Relay,ATM,Ethernet 等多种网络类型。
MPLS 将上层的数 据包添加 4Bytes 的 MPLS 报头,在 MPLS 域内都进行标签转发, 转发效率高 ,出 MPLS 域之前会将标签弹出,从而形成了一个由 MPLS 构成的 VPN (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)处理。
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 号及对应协议

 

 7.1 报文格式 

 

1)Destination Address,目的地址,6 字节,接收者的物理地址,通常说的 MAC 地址,48 位二进制位。
2)Source Address,源地址,6 字节,发送者的物理地址,48 位二进制位;
3)Type/Length,类型/长度,2 字节,可以表示帧数据的长度或上层应用
的类型,值 0~1500 表示长度,1536~65535 表示上层应用协议的类型,比如
0x0800 表示是 IP,0x0806 表示是 ARP。当普通的数据帧时,此字段表示
Type,当封装 Dot1Q 数据帧时,此字段表示 Length,Type 由 Dot1Q 字段中的
TPID 表示。
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 中我们可以看到,以太网 II 数据帧信息:
1)源 MAC 地址是 00:1e:65:28:2f:26;
2)目的 MAC 地址是 20:a6:80:64:a3:5d;
3)封装的协议是 IP(0x0800)

                                                      图 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 地
址在未来是否依然够用? 数据链路层封装当初是怎么被设计出来的?如果没有这一层封装,又会带
来什么问题?
二层网络的好处:
1)VLAN,有它,二层组网可以更加简单方便,成本低廉;
2)数据链路层做了介质无关封装,使 IP 协议能够轻松应用于各种通信介质。
如果 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 组织唯一标识符),
可以通过下面的连接查询: https://mac-oui.com/
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()函数在本地创建未被占用的随机端口,再用
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) 和相关的策略进行转发,
且保持原数据帧不变。
如果中间转发设备是路由器设备,路由器收到数据帧查看其报头,发现其
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 在浏览器的地址栏填下网站的地址并回车,

中间发生了很多奇妙的事情
不管是在服务端和客户端,数据都是由应用层产生并逐层向下传递,在接 收方,数据先由物理层接收并逐层向上传递,最终送给应用层的应用程序。
继设备只关心物理层;交换机关心数据链路层和物理层,重点在数据链路层;
路由器关心下面三层,重点在网络层;个人电脑或服务器等端计算设备或主机
设备拥有相对完备的协议栈,但端计算设备和主机设备重点关注的是应用层

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值