本系列文章为湖南科技大学高军老师的计算机网络微课堂学习笔记,前面的系列文章链接如下:
计算机网络:P1-概述
计算机网络:P2-物理层
计算机网络:P3.1-数据链路层(上)
计算机网络:P3.2-数据链路层(中)
计算机网络:P3.3-数据链路层(下)
计算机网络:P4.1-网络层(上)
计算机网络:P4.2-网络层(中)

文章目录

  • 七、IPv4数据报的首部格式
  • 八、网际控制报文协议ICMP
  • 九、虚拟专用网VPN与网络地址转换NAT
  • 十、软件定义网络SDN

七、IPv4数据报的首部格式

IPv4数据报的首部格式

为了简单起见,之后我们将IPv4数据报简称为IP数据报,而不指出版本号。IP数据报的首部格式及其内容是实现IP协议主要功能的基础。因此,我们有必要搞清楚这部分内容。如图所示,这是IP数据报的首部格式。

它由20字节的固定部分和最大40字节的可变部分组成。所谓固定部分,是指每个IP数据报首部都必须包含的部分。而某些IP数据报的首部除了包含20字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能。ID数据报的首部长以32个比特为单位进行描述。图中的每一行都由32个比特,也就是4个字节构成。每个小格子称为字段或者域。每个字段或某些字段的组合用来表达IP协议的相关功能。

版本字段

该字段占4个比特,用来表示IP协议的版本。通信双方使用的IP协议的版本必须一致,目前广泛使用的IP协议的版本号为4,即IPV4。

首部长度字段

该字段占4个比特,用来表示IP数据报首部的长度。该字段的取值以4字节为单位,最小十进制取值为5,表示IP数据报首部只有20字节的固定部分。最大十进制取值为15,表示IP数据报首部包含20字节的固定部分和最大40字节的可变部分。

可选字段

该字段的长度从1个字节到40个字节不等,用来支持排错、测量以及安全措施。可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的,这就增加了每一个路由器处理IP数据报的开销。实际上,可选字段很少被使用。

填充字段

该字段用来确保首部长度为4字节的整数倍,使用全0进行填充。我们之前刚刚介绍过,首部长度字段是以4字节为单位的。换句话说,IP数据报的首部长度一定是4字节的整数倍。由于首部中的可选字段的长度从1个字节到40个字节不等,那么当20字节的固定部分加上1到40个字节长度不等的可变部分,会造成首部长度不是4字节的整数倍时,就用取值为全0的填充字段填充相应的字节,以确保IP数据报的首部长度是4字节的整数倍。

区分服务字段

该字段占8个比特,用来获得更好的服务。该字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组把这个字段改名为区分服务。利用该字段的不同数值可提供不同等级的服务质量。只有在使用区分服务时,该字段才起作用,一般情况下都不使用该字段。

总长度字段

该字段占16个比特,用来表示IP数据报的总长度,也就是首部和数据载荷的长度总和。最大取值为十进制的65535,以字节为单位。需要注意的是,在实际应用中很少传输这么长的IP数据报。

举例说明首部长度字段和总长度字段的区别与联系:
这是一个IP数据报,它由首部和数据载荷两部分构成。

首部中的首部长度字段的二进制取值为0101,则可以计算出IP数据报的首部长度。也就是用首部长度字段的取值乘以4字节单位,共20字节。首部中的总长度字段的二进制取值为0000 0011 1111 1100,则可以计算出IP数据报的总长度,也就是在总长度字段的取值后添加字节单位,共1020个字节。进而可以计算出数据载荷的长度,也就是用IP数据报的总长度减去IP数据报的首部长度,结果为1000个字节。

标识、标志、片偏移字段

这3个字段共同用于进行IP数据报分片。

假设下面是网际层封装出的IP数据报,它将在数据链路层封装成帧。每一种数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元MTU。例如,以太网的数据链路层规定MTU的值为1500个字节。如果某个IP数据报的总长度超过MTU时,将无法封装成帧,需要将原IP数据报分片为更小的IP数据报,再将各分片IP数据报封装成帧。

标识字段。占16比特,属于同一个数据报的各分片数据报应该具有相同的标识。IP软件维持一个计数器,每产生一个IP数据报,计数器的值就加1,并将此值赋给标识字段。
标志字段。占3个比特,各比特含义如下:
----DF位表示是否允许分片。置1表示不允许分片,清0表示允许分片。
----MF位表示本分片后面是否还有分片。置1表示本分片后面还有分片,清0表示本分片就是最后一个分片。
----还有一个保留为必须设置为0。
片偏移字段。占13个比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多远。片偏移以8个字节为单位。
举例说明IP数据报如何进行分片:
假设有这样一个IP数据报,它由20字节的固定首部和3800字节的数据载荷两部分构成。也就是说该IP数据报的总长为3820个字节。假设使用以太网传送该IP数据报,以太网的最大传送单元MTU为1500个字节,也就是以太网的数据载荷部分最大为1500个字节,无法封装3820字节长的IP数据包。因此,需要把该IP数据报分片成几个更小的IP数据报,每个长度不能大于1500个字节。然后再将每个分片IP数据报封装成一个以太网的帧进行传输。为了更好地描述后续的分片工作,我们将原IP数据报数据载荷部分的每一个字节都编上号,第一个字节编号为0,最后一个字节编号为3799。

我们可将原IP数据报的数据载荷分成3个更小的分片。第一个分片从0号字节到1399号字节,共1400个字节。第二个分片从1400号字节到2799号字节,共1400个字节。第三个分片从2800号字节到3799号字节,共1000个字节。分片结束后,给每个分片重新添加一个首部,使之成为IP数据报。

思考: 给各个分片添加的首部是否完全相同呢?我们来一起填一下下面这张表格。
①原IP数据报首部中的总长度字段的十进制取值为3800+20。标识字段的十进制取值为12345。MF比特的取值为0,表示后面没有分片数据报,这就是最后一个分片数据报。DF比特的取值为0,表示该IP数据报允许被分片。由于这是未分片的源IP数据报,因此片偏移为0。

②对于分片1 IP数据报首部中,总长度字段的十进制取值为1400+20,其中1400字节是分片的长度,20字节是固定首部的长度。标识字段的十进制取值与原IP数据报的相同。由于该分片不是最后一个分片,因此MF比特的取值为1,表示该分片后还有分片。该分片IP数据报允许被再次分片,因此DF比特的取值为0。该分片IP数据报数据载荷部分的第一个字节,就是原IP数据报数据载荷部分的第一个字节,因此片偏移字段的取值为0除以8。除以8的原因是片偏移字段以8字节为单位。

③类似的,可以填写出分片2 IP数据报首部中相关字段的值。分片2 IP数据报首部中这几个相关字段的值只有片偏移字段的值与分片1 IP数据报的不同。

④对于分片3 IP数据报首部,总长度字段的十进制取值为1000+20,其中1000字节是分片的长度,20字节是固定首部的长度。
标识字段的十进制取值与原IP数据报的相同。由于该分片就是最后一个分片,因此MF比特的取值为0,表示该分片后没有其他分片。该分片IP数据报允许被再次分片,因此DF比特的取值为0。该分片IP数据报数据载荷的第一个字节是原IP数据报数据载荷中编号为2800的字节,因此片偏移字段的取值为2800除以8。

现在假定分片2的IP数据报经过某个网络时,还需要再进行分片。其中一个分片长度为800字节,另一个分片长度为600字节。分片结束后,给每个分片重新添加一个首部,使之成为IP数据报。我们按照上面的做法填写该表格,让如下所示。

生存时间字段

该字段占8个比特,最初以秒为单位,最大生存周期为255秒。路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间。若不为0就转发,否则就丢弃。现在以跳数为单位。路由器转发IP数据报时,将IP数据报首部中的该字段的值减1。若不为0就转发,否则就丢弃。

举例说明生存时间字段的作用:
假设采用如下图所示的网络拓朴,路由器R1、R2、R3各自的路由表如图所示。为了简单起见,我们只给出了各路由器路由表中的由人工配置的静态路由条目。例如路由器R2中的这条静态路由条目,它指出了IP数据报要到达网络N2,下一跳需要转发给路由器R3。

假设我们在人工配制这条静态路由条目时,错将下一跳配置成了R1,这会导致将去往网络N2的IP数据报错误的转发给路由器R1。

我们来看看会出现什么问题。假设某个IP数据报从网络N1发往网络N2。该IP数据报到达R1后,R1进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R2,于是R1将该IP数据报转发给了R2。R2收到该IP数据报后进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R1,于是R2将该IP数据报又转发回了R1。很显然形成了路由环路。如果没有其他措施,IP数据报将在路由环路中永久兜圈。现在,相信大家能够更好地理解IP数据报首部中生存时间字段的作用了,那就是确保IP数据报不会在网络中永久兜圈。IP数据报每经过一个路由器,其生存时间的值减1。当减少到0时,IP数据报将被路由器丢弃。

协议字段

该字段占8个比特,用来指明IP数据报的数据部分是何种协议数据单元。

常用的一些协议和相应的协议字段值如下表所示。

我们来举例说明。这是一个IP数据报,当首部中协议字段的取值为1时,表明数据部分是ICMP报文,也就是用ICMP协议封装的协议数据单元。

当首部中协议字段的取值为6时,表明数据部分是TCP报文段,也就是用TCP协议封装的协议数据单元。

首部检验和字段

该字段占16个比特,用来检测IP数据报首部在传输过程中是否出现差错。所采用的检错码比循环冗余检错码简单,称为因特网检验和,我们就不再赘述了,有兴趣的同学可自行查阅相关资料。IP数据报每经过一个路由器,路由器都要重新计算首部检验和。因为某些字段,例如生存时间、标志、片偏移等的取值可能会发生变化。由于IP层本身并不提供可靠传输的服务,并且计算首部检验和是一项耗时的操作。因此,在IPV6中,路由器不再计算首部检验和,从而更快转发IP数据报。

源IP地址、目的IP地址字段

它们各占32个比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。

例题

【2018年题47】某公司网络下图所示。IP地址空间192.168.1.0/24被均分给销售部和技术部两个子网,并已分别为部分主机和路由器接口分配了IP地址,销售部子网的MTU=1500B,技术部子网的MTU=800B。
(2)假设主机192.168.1.1向主机192.168.1.208发送一个总长度为1500B的IP分组,IP分组的头部长度为20B,路由器在通过接口F1转发该IP分组时进行了分片。若分片时尽可能分为最大片,则一个最大IP分片封装数据的字节数是多少?至少需要分为几个分片?每个分片的片偏移量是多少?

解析:
这是题目所给的销售部中某个主机发送的IP分组,总长度为1500个字节。题目给出IP分组的头部长度为20字节,因此数据载荷部分应为1480个字节。为了方便描述,我们将数据载荷中的每一个字节都编上号,第一个字节的编号为0,最后一个字节的编号为1479。

题目给出,由于该IP数据报通过路由器的F1接口转发时,受到所在网络的最大传送单元MTU为800字节的限制,需要进行分片。换句话说,分片后的每一个IP数据报的最大长度可以是800字节。假设下面是分片1的IP数据报。为了符合题目的要求,尽可能分为最大片,我们将分片长度取为780个字节,其第一个字节的编号为0,最后一个字节的编号为779,片偏移量等=0/8=0
将剩余的700字节作为分片2,其第一个字节的编号为780,最后一个字节的编号为1479,给其添加相应的20字节首部,使之成为分片2的IP数据报。片偏移量=780/8=97.5。由于片偏移量必须为整数,因此这种分片方案不行。

我们可将分片的最大长度取为小于780且能整除8的最大整数。具体方法是,将780除以8的结果向下取整,然后再乘以8,结果为776。这样,分片1的长度为776个字节,剩余704个字节作为分片2。分片1的最后一个字节编号为775,分片二的第一个字节编号为776。这样,分片2的片偏移量=776/8=97

例题

【2011年题47】题47-a图是网络拓扑,题47-b图是主机进行Web请求的1个以太网数据帧前80个字节的十六进制及ASCII码内容。
(1)Web服务器的IP地址是什么?该主机的默认网关的MAC地址是什么?
(4)该帧所封装的IP分组经过路由器R转发时,需修改IP分组头中的哪些字段。

解析: 尽管到目前为止,我们还未学习Web请求是用什么应用层协议封装的,也不知道在运输层还会用什么协议进行封装。但是我们知道,在网际层一定会用IP协议对其进行封装,使之成为IP分组。Web服务器的IP地址就填写在IP分组头中的目的IP地址字段。IP分组还要封装成以太网帧才能发送。

在IP分组头中,目的IP地址字段前还有16个字节的内容。在以太网帧中,数据载荷前还有14字节的内容。

因此可知,在以太网帧中,从第31个字节开始的4个字节实际上就是目的IP地址的内容。题目所给的以太网数据帧的第一列数据实际上并不是以太网帧的内容,仅仅作为行号,其增量为16,表示每行有16个字节的内容。前面部分是以太网帧内容的16进制形式,后面是以太网帧内容的ASCII码。这些是以太网帧的前30个字节。

接下来的4个字节就是Web服务器的IP地址,为40 aa 62 20,其点分十进制形式为64.170.98.32。

从图中可知,主机的默认网关就是路由器R。主机会将Web请求发送给默认网关路,由默认网关将web请求转发到因特网。因此,以太网帧头中的目的MAC地址字段封装的就是默认网关的MAC地址,如图所示。而目的MAC地址字段就是以太网帧的前6个字节,其内容就是默认网关的Mac地址。写成MAC地址的形式为00-21-27-21-51-ee。

IP分组经过路由器R10,生存时间字段的值被减1,首部检验和会被重新计算。若IP分组总长度大于最大传送单元MTU的值,则需要进行分片。此时总长度字段、标志字段、片偏移字段都需要修改。

小测验

1、以下关于IPv4数据报结构的描述中,错误的是
A. IPv4数据报的首部长度是可变的
B. IPv4数据报首部中的协议字段表示IP的版本,值为4表示IPv4
C. IPv4数据报首部中的首部长度字段以4B为单位,总长度字段以字节为单位
D. IPv4数据报首部中的生存时间字段的值表示一个IPv4数据报可以经过路由器的数量
答案:B

2、在IPv4数据报首部的字段中,与分片和重组无关的字段是
A. 标识
B. 标志
C. 片偏移
D. 协议
答案:D

3、以下关于IPv4数据报分片基本方法的描述中,错误的是
A. IPv4数据报长度大于MTU时,就必须对其进行分片
B. DF值为0表示允许对IPv4数据报进行分片
C. 分片的MF值为1表示接收到的分片不是最后一个分片
D. 属于同一原始IPv4数据报的分片可以具有不同的标识
答案:D

八、网际控制报文协议ICMP

网际控制报文协议ICMP

为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。主机或路由器使用ICMP协议来发送差错报告报文和询问报文。ICMP报文被封装在IP数据报中发送,ICMP差错报告报文共有以下五种:分别是终点不可达、源点抑制、时间超过、参数问题、改变路由。

终点不可达

当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。
例子: 假设主机H1给H2发送IP数据报。H1会将IP数据报发送给路由器R1,由R1帮其转发。若R1的路由表中没有网络N3的路由记录、默认路由、主机H2的特定主机路由,则R1就不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为终点不可达。

源点抑制

当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
例子: H1给H2发送IP数据报。当该数据报传输到路由器R20时,由于R2拥塞,也就是R2比较繁忙。R2根据自己的丢包策略,丢弃了该数据报,并向发送该数据包的源主机H1发送ICMP差错报告报文,其类型为源点抑制。

又例如H1给H2发送IP数据报。当该数据报传输到H2时,由于H2拥塞就丢弃了该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为源点抑制。

时间超过

当路由器收到一个目的IP地址不是自己的IP数据报时,会将其生存时间TTL字段的值减1。若结果不为0,则将数据报转发出去。若结果为0,除丢弃该数据包外,还要向源点发送时间超过报文。
例子: 某个生存时间等于2的IP数据报传输到了路由器R1。R1将其生存时间减1后,结果是1。这表明该数据报的生存时间还没有结束,R1将其转发出去。当该数据报传输到路由器R2后,R2将其生存时间减1后,结果是0。这表明该数据报的生存时间结束了,R2丢弃该数据报,并向发送该数据包的源主机H1发送ICMP差错报告报文,其类型为时间超过。

另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文。

参数问题

当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段,发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
例子: H1给H2发送IP数据报。假设该数据报在传输过程中受到了干扰,其首部出现了误码。当该数据报传输到路由器R1后,R1检测出该数据报的首部出错,于是丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为参数问题。

改变路由

路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器,这样可以通过更好的路由。
例子: 假设我们给主机H1指定的默认网关是路由器R1,则H1要发往网络N2的IP数据包都会传输给R1,由其帮忙转发。当R1发现H1发往N2的数据报的最佳路由不应当经过R1,而是应当经过R4时,就用改变路由报文把这个情况告诉主机。于是,H1就在自己的路由表中添加一个项目,到达N2应经过路由器而似而不是默认网关R1。之后,H1要发往N2的IP数据包都会传输给R4,由其帮忙转发。

不应发送ICMP差错报告报文的情况

①对ICMP差错报告报文不再发送ICMP差错报告报文。
②对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。
③对具有多播地址的数据报都不发送ICMP差错报告报文。
④对具有特殊地址,例如127.0.0.0或0.0.0.0的数据报,不发送ICMP差错报告报文。

例题

【2010年题36】若路由器R因为拥塞丢弃IP分组,则此时R可向发出该IP分组的源主机发送的ICMP报文类型是
A. 路由重定向
B. 目的不可达
C. 源点抑制
D. 超时
答案:C

常见的两种ICMP询问报文

①回送请求和回答报文。ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达,以及了解其有关状态。
②时间戳请求和回答报文。ICMP时间戳请求报文是请求某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。这种询问报文用来进行时钟同步和测量时间。

利用ICMP协议的两个典型应用

分组网间探测PING(Packet InterNet Groper)
该应用用来测试主机或路由器之间的连通性。其应用层直接使用网际层的ICMP协议,而不通过运输层的TCP或UDP协议。所使用的ICMP报文类型为回送请求和回答。如下所示,这是在我的主机的Windows命令行中,使用ping命令来测试该主机与百度服务器的连通性。

跟踪路由(traceroute)
该应用用来测试IP数据报从源主机到达目的主机要经过哪些路由器。在该应用的Windows版本中,具体命令为tracert。其应用层直接使用网际层的ICMP协议。所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。在该用的Unix版本中,具体命令为traceroute。其在运输层使用udp协议,在网际层使用的ICMP报文类型只有差错报告报文。
如下所示,这是在我的主机的Windows命令行中,使用tracert命令来测试该主机与我校官方网站服务器之间要经过哪些路由器。

思考: tracert命令的实现原理是什么?
①假设主机H1想知道到达主机H2要经过哪些路由器。H1就给H2发送ICMP回送请求报文,该报文被封装在IP数据报中。IP数据报首部中生存时间字段TTL的值被设置为1。该IP数据报到达R1后,其生存时间减1,结果为0。R1丢弃该数据包,并向发送该数据包的源主机H1发送ICMP差错报告报文,其类型为时间超过。这样H1就知道了到达H2的路径中的第一个路由器。
②H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为2。经过R1转发后,该数据包的生存时间减少为1。该IP数据报到达R2后,其生存时间减1,结果为0。R2丢弃该数据包,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过。这样H1就知道了到达H2的路径中的第二个路由器。
③H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为3。经过R1和R2的转发后,该数据报到达主机H2,其生存时间减少为1。H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送请求回答报文的IP数据报。这样H1就知道已经跟踪到路径中的最后一站,也就是目的主机H2。

小测验

1、下列关于ICMP报文的说法中,错误的是
A. ICMP报文直接封装在链路层帧中发送
B. ICMP报文可用于报告IP数据报的传输错误
C. ICMP报文需要封装在IP数据报中发送
D. ICMP报文本身出错将不再处理
答案:A

2、以下关于ICMP差错报告报文的描述中,错误的是
A. 对于已经携带ICMP差错报告报文的IP数据报,不再产生ICMP差错报告报文
B. 对于已经分片的IP数据报,只对第一个分片产生ICMP差错报告报文
C. PING使用了ICMP差错报告报文
D. tracert使用了ICMP回送请求和回答报文以及差错报告报文
答案:C

3 、若某个路由器收到TTL值为1的IP数据报,则
A. 转发该IP数据报
B. 仅仅丢弃该IP数据报
C. 丢弃该IP数据报并向发送该IP数据报的源主机发送类型为终点不可达的ICMP差错报告报文
D. 丢弃该IP数据报并向发送该IP数据报的源主机发送类型为时间超过的ICMP差错报告报文
答案:D

九、虚拟专用网VPN与网络地址转换NAT

虚拟专用网VPN(Virtual Private Network)的基本工作原理

例子: 假设这是某机构部门A的局域网,这是该机构部门B的局域网。部门A的局域网位于北京,部门B的局域网位于上海。那么,如何才能让这两个专用网络可以通信呢?

①一种方法是租用电信公司的通信线路。这种方法简单方便,但是租金很高。

②另一种方法是利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的专用网又称为虚拟专用网。

问题:虚拟专用网中的各主机应该分配怎样的IP地址呢?
回答:由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是无需申请就可由本机构自由分配的专用地址,而不是需要申请的在因特网上使用的公有地址。我们可以在因特网数字分配机构IANA的官方网站查看IPv4地址空间中特殊地址的分配方案。

红色标注的这三个地址块中的地址就是无需申请的、可自由分配的专用地址,或称私有地址。

我们给部门A的专用网分配的私有地址的网络号为10.1.0.0,给部门B的专用网分配的私有地址的网络号为10.2.0.0。两个专用网中的主机所分配的私有地址如图所示。需要注意的是,私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。换句话说,私有地址只能用作本地地址,而不能用作全球地址。

在因特网中的所有路由器对目的地址是私有地址的IP数据报一律不进行转发。很显然,部门A和B各自至少需要一个路由器具有合法的全球IP地址。这样,它们各自的专用网才能利用公有的因特网进行通信。

假设部门A中的这台主机要给部门B中的另一台主机发送数据,它会将待发送数据封装成内部IP数据报发送给路由器R1。其首部中源地址字段的值为部门A中该主机的IP地址,目的地址字段的值为部门B中另一台主机的IP地址。

R1收到该数据报后,发现其目的网络必须通过因特网才能到达,就将该内部IP数据报进行加密,这样就确保了内部IP数据报的安全。然后重新添加上数据报的首部封装,成为在因特网上发送的外部数据报。其首部中源地址字段的值为路由器R1的全球地址,目的地址字段的值为路由器R2的全球地址。

路由器R2收到该外部IP数据报后去掉其首部,将其数据部分进行解密,恢复出原来的内部IP数据报。这样就可以从其首部提取出源地址和目的地址,根据目的地址将该内部IP数据报发送给相应的主机。

很显然,两个专用网内的主机间发送的数据包是通过了公用的因特网。但在效果上,就好像是在本机构的专用网上传送一样。数据报在因特网中可能要经过多个网络和路由器。但从逻辑上看,R1和R2之间好像是一条直通的点对点链路,因此也被称为IP隧道技术。

注: ①本例属于同一机构内不同部门的内部网络所构成的虚拟专用网,这就称为内联网VPN。
②有时一个机构的虚拟专用网需要某些外机构参加进来,这样的虚拟专用网又称为外连网VPN。
③在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源。这种虚拟专用网又称为远程接入VPN,相信很多同学寒暑假在家中要远程访问校园网内的某些资源时,就使用过远程接入VPN这种技术。

网络地址转换NAT(Network Address Translation)的基本工作原理

虽然英特网采用了无分类编址方式来减缓IP地址空间耗尽的速度,但是由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险仍然没有被解除。1994年提出了一种网络地址转换的方法,再次缓解IPv4地址空间即将耗尽的问题。NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
例子: 图中的专用网络使用私有网络号192.168.0.0,该网络中各主机的私有地址如图所示。那么,使用私有地址的主机如何才能与因特网上使用全球IP地址的主机进行通信呢?

回答: 这需要在专用网络连接到因特网的路由器上安装NAT软件,装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用私有地址的主机在和外界通信时,都要在NAT路由器上将其私有地址转换成全球IP地址。
具体工作流程如下:
假设使用私有地址的该主机要给因特网上使用全球IP地址的另一台主机发送IP数据报。该主机将数据报发送给NAT路由器,数据报首部中源地址字段的值为该主机的私有地址,目的地址字段的值为因特网上另一台主机的全球地址。

NAT路由器从自己的全球IP地址池中为该主机分配一个临时的全球IP地址172.38.1.5,并将IP数据报的源地址修改为该地址。然后将私有地址与全球地址的对应关系记录在NAT转换表中,之后就可以转发该IP数据报了。请注意,此时该IP数据报中的源地址和目的地址都是全球IP地址,如图所示。

因特网上的这台主机给源主机发回数据报,数据报的源地址和目的地址都是全球IP地址,如图所示。

NAT路由器收到该IP数据报后,在NAT转换表中进行查找,发现该数据报的目的地址所对应的私有地址为192.168.0.2,于是就将该数据包的目的地址修改为192.168.0.2,并将其发送给相应的主机。请注意,此时该IP数据报中的源地址为因特网上那台主机的全球IP地址,而目的地址为专用网络中这台主机的私有地址。

网络地址与端口号转换NAPT

如图所示,当专用网中的这两台使用私有地址的主机都要给因特网上使用全球地址的另一台主机发送数据报时,在NAT路由器的NAT转换表中就会产生两条记录,分别记录两个私有地址与两个全球地址的对应关系。这种基本转换方法存在这样一个问题:如果NAT路由器具有N个全球IP地址,那么至多只能有N个内网主机能够同时和因特网上的主机通信。

解决办法: 由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换。这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址一起进行转换的技术叫做网络地址与端口号转换NAPT(Network Address Translation)。
如图所示,这是本例中的NAPT路由器,这是它的全球IP地址,这是它的NAPT转换表中的部分内容。

实际上现在很多家用路由器都是这这种NAPT路由器。由于端口号的概念属于运输层,而我们的课程还没有进行到运输层,因此对该转换表中的内容不再解释。等我们学习了运输层的端口号概念后,相信大家很容易看懂该转换表的内容。

思考:

内网主机与外网主机间的通信是否能由外网主机首先发起呢?
回答: 不能。如果由外网主机首先发起,那么当NAPT路由器收到来自外网的IP数据报后,在NAPT转换表中找不到相应的纪录,也就无法把数据报转发给内网中的主机。因此,使用私有地址的主机不能直接充当因特网服务器。

对于一些点对点网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时也会遇到问题,需要网络应用自己使用一些特殊的NAT专业技术来解决问题。另外,由于NAT对外网屏蔽了内网主机的网络地址,因此能为内网主机提供一定的安全防护。还记得我们在本篇博客上面一节中介绍的ICMP协议的典型应用tracert吗?可以看到,其中有两个路由器使用了相同的IP地址。这很可能是内网出外网的路由器使用了NAT,并且内网中还有一个使用私有IP地址的路由器。

小测验

1、根据NAT协议,下列IP地址中不允许出现在因特网上的是
A. 192.172.56.23
B. 172.15.34.128
C. 192.168.32.17
D. 172.128.56.65
答案:C

2、为了解决IPv4地址耗尽的问题,可以采用以下一些措施,其中治本的是
A. 采用CIDR
B. 采用VPN
C. 采用NAT
D. 采用IPv6
答案:D

十、软件定义网络SDN

前言

软件定义网络SDN(Software Defined Network)的概念最早由斯坦福大学的Nick Mckeown教授于2009年提出。SDN最初只是学术界讨论的一种新型网络体系结构。近些年来,SDN发展快速,被不少企业相继采用。其中最成功的案例就是谷歌于2010到2012年间建立的数据中心网络B4。SDN是当前网络领域最热门和最具发展前途的技术之一,成为近年来的研究热点,这也是其新增为考研知识点的原因。

传统路由器的功能

①为主机间的通信提供转发服务。如图所示,源主机给目的主机发送分组,该分组需要经过多个路由器的转发,最终到达目的主机。

②路由选择。从源主机到达目的主机的路径可能不止一条,对于我们以前曾学习过的路由信息协议RIP,它会选择经过路由器数量少的这条路径。

因此,我们将路由器之间传送的信息种类总结如下
①主机之间的分组

②路由器之间的路由信息

路由器之间交互路由信息,并利用路由算法得出路由表,再根据路由表得出转发表。我们把路由器的网络层抽象地划分为两个层面:一个层面是控制层面,另一个层面是数据层面(或称为转发层面)。这里所谓的层面与计算机网络体系结构中的分层是类似的,都是抽象的概念。
----在控制层面中,每一个路由器无法独自创建出自己的路由表,路由器必须和相邻的路由器周期性的交换路由信息,然后才能够创建出自己的路由表。根据路由选择协议所使用的路由算法计算路由需要由软件来完成,这需要花费较多的时间,一般是秒数量级。
----在数据层面中,每一个路由器基于自己生成的转发表来转发分组。为了提高转发速率,现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒数量级。

在SDN体系结构中,路由器中的路由软件都不存在了。因此,路由器之间不再相互交换路由信息。在控制层面中,有一个在逻辑上集中的远程控制器,逻辑上集中的远程控制器在物理上可由不同地点的多个服务器组成。

远程控制器掌握各主机和整个网络的状态,它能够为每一个分组计算出最佳的路由,并为每一个路由器生成其正确的转发表。这样,路由器的工作就变得非常单纯了,也就是对收到的分组进行查表转发即可。

SDN这种新型网络体系结构的核心思想是:把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。

OpenFlow协议与SDN体系结构的关系

OpenFlow协议是一个得到高度认可的标准。在讨论SDN时,往往与OpenFlow一起讨论。OpenFlow协议可被看成是SDN体系结构中控制层面与数据层面之间的通信接口。如图所示,这是SDN体系结构中的控制层面和数据层面,OpenFlow协议是控制层面与数据层面之间的通信接口。OpenFlow协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制。OpenFlow协议的技术规范由非盈利性的产业联盟开放网络基金会ONF负责制定。ONF的任务是致力于SDN的发展和标准化,但并未规定必须使用OpenFlow。只不过大部分SDN产品采用了OpenFlow作为其控制层面与数据层面的通信接口。OpenFlow从2009年底发表的1.0版开始,每年都被更新,历经12次更新,到2015年3月发布了1.5.1版。目前较为成熟的是1.3版本。

数据层面

我们知道,传统意义上的数据层面的任务是根据转发表转发分组。转发分组分为以下两个步骤:
①进行匹配,即查找转发表中的网络前缀,进行最长前缀匹配。
②执行动作,也就是把分组从匹配结果指明的接口转发出去。
例子: 这是路由器R1的路由表。当R1收到某个去往该网络的分组时,首先进行匹配,也就是查找与该分组目的地址相匹配的路由条目。然后执行动作,也就是按照匹配的路由条目中的下一跳的指示进行转发。

上述这种匹配加动作的转发方式在SDN中得到了扩充,增加了新的内容,变成了广义的转发。
SDN的广义转发分为以下两个步骤:
①进行匹配。与传统匹配不同的是,能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配。
②执行动作。与传统动作不同的是,不仅可以转发分组,还可以负载均衡、重写IP首部(类似于NAT路由器中的地址转换)、人为的阻挡或丢弃一些分组(类似防火墙)。
在SDN的广义转发中,完成匹配加动作的设备并不局限在网络层工作,因此不再称为路由器,而称为OpenFlow交换机或分组交换机,或更简单地称为交换机。相应的,在SDN中取代传统路由器中转发表的是流表(Flow Table)。
----一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源IP地址和目的IP地址的一连串分组。
----OpenFlow交换机中的流表是由SDN远程控制器来管理的。SDN远程控制器通过一个安全信道,使用OpenFlow协议来管理OpenFlow交换机中的流表。
如图所示,这是SDN远程控制器和OpenFlow交换机,这是OpenFlow交换机中的安全信道和流表,SDN远程控制器使用OpenFlow协议通过安全信道来管理OpenFlow交换机中的流表。需要注意的是,尽管网络设备可以由不同厂商来生产,并可使用在不同类型的网络中,但是从SDN远程控制器看到的则是统一的逻辑交换功能,每个OpenFlow交换机必须有一个或多个流表。

如图所示,这是OpenFlow1.0版本的流表,每一个流表可以包含多个流表项。每个流表项包含三个字段。它们是首部字段值字段、计数器字段、动作字段。

首部字段值字段
首部字段值字段包含有一组字段,用来使入分组的对应首部与之匹配,因此又称为匹配字段。匹配不上的分组就被丢弃或被发送到SDN远程控制器做更多的处理。如图所示,Openflow 1.0版本中的首部字段值字段包含11个项目,涉及数据链路层、网际层、运输层三个层次的首部。很显然,OpenFlow中的匹配与以前介绍过的计算机网络体系结构分层处理的原则完全不同。在OpenFlow交换机中,既可以处理数据链路层的帧,也可以处理网际层的IP数据报,还可以处理运输层的TCP或UDP报文。

计数器字段
计数器字段是一组计数器,一个是记录已经与该流表项匹配的分组数量的计数器,另一个是记录该流表项上次更新到现在经历时间的计数器。
动作字段
动作字段是一组动作,当分组匹配某个流表项时,执行该流表项中动作字段指明的以下某个或多个动作,即:
----把分组转发到指明的端口。
----丢弃分组。
----把分组进行复制后,再从多个端口转发出去。
----重写分组的首部字段,包括数据链路层、网际层以及运输层的首部。

基于流表的 匹配+动作

如图所示,在这个简单的网络中,有H1~H6共6台主机,其IP地址标注在各自的旁边。还有S1~S3共3台OpenFlow交换机,每台交换机都有4个端口,其端口号标注在各自端口的旁边。另外还有一台SDN远程控制器来控制这些OpenFlow交换机的匹配加动作。

简单转发: 假设设定的转发规则是,H1或H2发往H3或H4的分组,其转发路径因为S1->S3->S2,如图所示。

根据这条转发规则,SDN远程控制器应该给OpenFlow交换机S1设置这样的流表项:
----在匹配中的源IP地址等于10.0.1.*,表明左起前3个十进制数分别为10.0.1的任何IP地址。主机H1和H2的IP地址都是其中的地址。同理,目的IP地址等于10.0.2.*,表明左起前3个十进制数分别为10.0.2的任何IP地址。主机H3和H4的IP地址都是其中的地址。
----在动作中的转发(3)表明,OpenFlow交换机S1应从自己的端口3转发所匹配的分组。

同理,通过SDN远程控制器给OpenFlow交换机S3设置流表项。与S1的流表相相比,S3的流表项中多了 入端口=1 的匹配条件,表明只有从S3自己端口1进入的分组才能与该流表项的后续项目进行匹配。

同理,通过SDN远程控制器给OpenFlow交换机S2设置流表项。

负载均衡

为了均衡链路S2到S3和链路S1到S3的通信量,制定了以下规则:凡是从H4发往H5或H6的分组,其转发路径应为S2->S3。凡是从H3发往H5或H6的分组,其转发路径应为S2->S1->S3,如图所示。

很显然,采用基于目的IP地址的传统转发方法是不能实现这种负载均衡的。但在本例中,只要在OpenFlow交换机S2的流表项中设置好合适的匹配项目即可。

防火墙

假设在OpenFlow交换机S2中设置防火墙。此防火墙的作用是仅仅接收来自于OpenFlow交换机S1相连的主机所发送的分组,而不管这些分组是从S2自己的哪个端口进来的。根据这样的规定,可以得出S2的流表项目。

注: 需要说明的是,为了简单起见,在上述例子的流表项中省略了计数器字段。尽管上述例子非常简单,但我们已经可以看出SDN中的这种广义转发的多样性和灵活性。

总结:SDN体系结构及其四个关键特征

SDN体系结构如下图所示:

四个特征如下所示:
基于流的转发。由SDN控制器控制的分组交换机分布在数据层面中,而分组的转发可以基于数据链路层、网络层和运输层协议数据单元PDU中的首部字段的值进行,这与传统路由器仅根据IP数据报的目的IP地址进行转发有着明显的区别。各分组交换机的流表中的流表项都是由SDN控制器进行计算、管理和安装的,这样SDN的转发规则都详细规定在各分组交换机的流表中。
数据层面与控制层面分离。在传统的转发设备路由器中,数据层面与控制层面都位于同一个设备中。但在SDN中,数据层面与控制层面是分离的,也就是二者不在同一个设备中。数据层面有许多相对简单而快速的分组交换机,这些分组交换机基于各自的流表执行 匹配+动作 的规则。控制层面则由若干服务器和相应的软件组成,这些服务器和软件计算并管理这些分组交换机中的流表。
位于数据层面分组交换机之外的网络控制功能。SDN中的控制层面是用各类软件实现的,而且这些软件还可以处于不同的机器上,并且还可能远离位于数据层面的分组交换器。SDN控制层面的软件实现包含两个构件,一个构件是SDN控制器,也就是网络操作系统。另一个构件是若干个网络控制应用程序。SDN控制器维护准确的网络状态信息,例如远程链路、分组交换机和主机的状态,并把这些信息提供给运行在控制层面的各种控制应用程序。另外,还会提供一些方法,使得这些控制层面的应用程序能够对数据层面中的分组交换机进行监视、编程和控制。
可编程的网络。通过在SDN控制层面中的一些网络控制应用程序,使得整个SDN网络成为可编程的网络。SDN控制器使用这些网络控制应用程序来控制数据层面中的各分组交换机。例如,路由选择网络控制应用程序能够确定源点和终点之间的端到端的路径。网络控制应用程序还可以决定哪些分组在进入某个分组交换机时必须被阻挡,也就是进行接入控制。另外,网络控制应用程序还可以配置分组交换机在转发分组时执行负载均衡的措施。
总结: 从SDN体系结构的四个关键特征可以看出:SDN把网络的许多功能都分离开了。数据层面的交换机、控制层面的的SDN控制器和许多网络控制应用程序,这些都是可以分开的实体,并且可由不同厂商和机构来提供,这与传统网络截然不同。在传统网络中,路由器或交换机是由单独的厂商提供的,其控制层面和数据层面以及协议的实现都是集成在一个设备里面的。

南/北向API

需要注意的是,SDN控制器与其下面的数据层面中的受控设备的通信接口称为南向API。SDN控制器与其上面的控制层面中的网络控制应用程序的接口称为北向API。在SDN体系结构中,SDN控制器是最复杂的。我们对其进行简要介绍。SDN控制器可划分成三个层次,分别是通信层网络范围的状态管理层到网络控制应用程序层的接口
----通信层是SDN控制器中的底层,其任务是通过南向API接口完成SDN控制器与位于数据层面中的受控的网络设备之间的通信。
----网络范围的状态管理层是SDN控制器的中间层。SDN控制层面若要做出任何最终的控制决策,例如在所有的分组交换机中配置流表以便进行端到端的转发或实现负载均衡或实现某种特殊的防火墙能力,就需要让控制器掌握全网的主机信息、链路信息、分组交换机信息以及其他受SDN控制器控制的设备的信息。
----到网络控制应用程序层的接口是SDN控制器的顶层。SDN控制器与网络控制应用程序的交互都需要通过北向API接口完成。该API接口允许网络控制应用程序对网络范围的状态管理层中的网络状态和流表进行读写操作。

目前已经出现了一些开源的SDN控制器,最有代表性的就是OpenDaylightt和ONOS。有兴趣的同学可访问相关的官方网站,这里就不再介绍了。

练习

1、下列有关SDN的描述中,正确的是 (C)
A. SDN是近年来出现的一种新型物理网络
B. SDN等同于OpenFlow
C. SDN将网络的控制层面和数据层面分开
D. OpenFlow交换机就是IP路由器

2、下列有关SDN的描述中,错误的是 (C)
A. SDN是近年来出现的一种新型网络体系结构
B. OpenFlow可被看作是SDN的控制层面与数据层面的通信接口
C. SDN远程控制器位于OpenFlow交换机中
D. OpenFlow交换机基于“流表”转发分组

3、下列各种首部中的字段,不能在OpenFlow1.0中匹配的是 (D)
A. 目的MAC地址
B. VLAN ID
C. 源IP地址
D. 窗口

计算机网络:P4.3-网络层(下)相关推荐

  1. 计算机网络笔记–7 网络层(下)

    计算机网络笔记–7 网络层(下) 文章目录 计算机网络笔记–7 网络层(下) 前言 路由算法和Internet路由 4.9路由算法 4.10 Internet 路由 前言 这是学习计算机网络课程时记录 ...

  2. 计算机网络04:网络层

    文章目录 4.1.网络层提供的两种服务 4.2.虚拟互联网 4.3.IP 地址(重点) 4.3.1.学习 IP 地址的预备知识 4.3.2.MAC 地址 4.3.3.IPV4 地址的组成 4.3.4. ...

  3. 计算机网络笔记Part4 网络层(Network Layer)

    本人计算机网络笔记总目录 计算机网络笔记Part1 概述 计算机网络笔记Part2 物理层(Physical Layer) 计算机网络笔记Part3 数据链路层(Data Link Layer) 计算 ...

  4. 计算机网络(四)_网络层

    相关博文: 计算机网络入门 计算机网络物理层 计算机网络-数据链路层 与网络层相关的IP地址与子网掩码单独抽出于下 IP地址 计算机网络-域名与IP地址详解 子网掩码与子网划分 计算机网络-子网掩码与 ...

  5. 计算机网络 自顶而下方法 原书第七版 英文参考答案(网盘)

    找了半天没有免费可用的,现在找到了上传贴在这里 计算机网络 自顶而下方法 原书第七版 英文参考答案(网盘) 链接 提取码:t5ua

  6. 计算机网络篇:网络层路由选择之汇集树产生

    计算机网络篇:网络层路由选择之汇集树产生 计算机网络篇:网络层路由选择之汇集树产生 总结 举个栗子 转载需注明出处 计算机网络篇:网络层路由选择之汇集树产生 总结 路由选择的核心是路由选择算法. 突出 ...

  7. 计算机网络 网络层(下) 慕课学习笔记

    5.14 链路状态路由选择 链路状态路由(LS)基本原理: 发现 它的邻居节点,了解它们的网络地址(发送hello报文) 设置 到它的每个邻居的成本度量 构造 一个分组LSP,包含它所了解到的上述所有 ...

  8. 计算机网络学习笔记--网络层知识点整理

    为什么要划分网络层? 不用的网络有不同的协议和标准,为了可以在不同网络之间互访,共享双方的资源,并且还要保持每个计算机网络本来的独立性,所以才划分出了网络层,并制定了专门的协议来负责网络间通信. 网络 ...

  9. 计算机网络基础学习笔记(下)

    学习视频 随看随记 ABCD类型地址的分类 根据地址左起第-个十进制数的值,可以判断出网络类别(小于127的为A类, 128 ~ 191 的为B类,192 ~ 223的为C类) ; 根据网络类别,就可 ...

  10. 面试-计算机网络-物理层-数据链路层-网络层-应用层-网络安全

    文章目录 ==总述== OSI的七层模型分别是?各自的功能是什么? 网络五层模型,每一层的职责? 每一层对应的网络协议有哪些?(网络五层体系结构看) TCP/IP的四层模型? ==物理层== ==数据 ...

最新文章

  1. 系统延时任务和定时任务
  2. Github基本操作的学习与温习
  3. python读取序列5之后的数据_Python 基本功: 5. 数据序列化
  4. Vue组件学习之组件自定义事件
  5. 2017.10.3 国庆清北 D3T2 公交车
  6. 国产机GSM系列手机常见芯片方案介绍
  7. OS - 计算机组成原理及CPU主频揭秘
  8. android设备当广告屏使用方法,Android手机与电视无线HDMI同屏器使用教程
  9. prometheus 监控告警安装与设置
  10. Latex-条目、编号、描述
  11. powershell自定义字体
  12. java重启tomcat
  13. pulp.apis.core.PulpSolverError: PuLP: cannot execute glpsol.exe的一种解决方案
  14. Selenium 自动化测试从零实战
  15. 土圭垚㙓数学课(二)视锥体八个顶点的计算方法
  16. 错误[error] 1366 解决方法
  17. Java线程生命周期及常用方法说明
  18. Java自定义注解参数ElementType.PARAMETER
  19. 机器学习之线性回归(Linear Regression)算法
  20. HCIP——NAT网络地址转换

热门文章

  1. Cousera吴恩达机器学习week5笔记
  2. 通过宠物商店理解java面向对象
  3. 百度百聘企业简单信息获取
  4. matlab斐波那契数列画图,斐波拉契数列 斐波那契数列 matlab程序
  5. oracle asm密码是什么,ASM有自己的参数、密码、alert、监听文件
  6. 图像处理保研面试_详解保研面试的那些事
  7. g代码解释程序 java_解析g代码c语言程序
  8. win10上Steam闪退
  9. 点量云流化具有哪些特色
  10. Cocos别踩白块儿案列1