网络层-network layer(下):网络互连、子网掩码计算方法、Ipv4报头解析
第五章 网络层-Network Layer(下)
上一章讲了网络层的任务、提供的两种服务、五个重要的路由算法、以及网络层的拥塞控制和服务质量问题。这一部分主要讲一讲网络互连问题和Internet的网络层。(包括IP协议、ip地址、ip报头格式等等问题)
5.5 网络互连
在这一部分,我们将主要讨论多个相同或者不同的网络,是怎么相互连接,形成简单的互联网(internet)的。
5.5.1 连接方式
如上图。处于最左边的源机器,如果想要与最右边的目标机器通信,需要经过如下几个步骤。
首先,源机器的传输层将数据与目标的IP地址(后面会讲到),一起封装进源机器的MAC层网络内(这是一个802.11无线局域网)。之后,802.11的MAC层会根据之前学过的种种协议,将这个数据帧发送至该网络下的路由器处。这个网络的路由器收到数据帧后,去掉帧头帧尾,解析其需要发送到的目标IP地址,再通过网络层协议(这些协议使用了我们之前学到的种种路由算法),寻找一条合适的路径到达目标机器所在的路由器处。最后,这个路由器再根据目标机器处网络的相关协议(例如这里是802.3以太网)将数据包送至目标机器。并在解析后到达目标机器的传输层。
总的来讲,虽然源机器和目标机器处于不同类型的MAC层网络下,但是通过网络层的路由器和路由算法,两台机器的相互通信成为了可能。
5.5.2 隧道
隧道技术的存在允许了连接两种不同类型的网络(而不仅仅是MAC层)。例如上图中,巴黎和伦敦所在的网络都是IPv6协议的,但是两个之间的路由器却全部使用了IPv4协议。在下一章中我们会讲到,IPv4与IPv6具有不同的寻址方式和报文格式,因此不能简单的相互传输数据。而使用隧道技术可以解决数据包在这两个网络上传输的问题。如图中所绘制的,在IPv4网络内传送时,数据包又被包裹进一个IPv4的数据包内。
这一过程就好比汽车被装进火车里运送一样。如果读者还有疑虑的地方,有关IPv4和IPv6的内容将在下一节详细讲到。
5.5.3 数据包分段
在网络层传送数据包的过程中,还会遇到各种各样的具体问题。以下是数据包分段技术的描述、使用原因应用。
a. 使用原因: 由于硬件条件、政治因素等考虑,有些网络的尺寸太小,无法传输过大的数据包(就好比火车轨道标准不同的问题)。
b. 分类(2):
- 透明分段:
这幅图片很形象地解释了透明分段的特点。在透过某个小容量网络前,数据包会背分割成小段,而一旦度过了这部分“狭小地区”,数据包又会被重新组合。这样一来,后续的router其实并不知道发生过分段。
缺点:出口router\'必须知道是否接收了全部分段
- 非透明分段:
非透明分段与之相反,即:数据包在分段之后不再被组装回去,一直到他们到达了目标机器才会进行组装。
缺点:1、增加了开销,因为每次分段后需要添加额外的报头;2、增加了丢包的风险
c. 应用:路径MTU发现(path MTU discovery)
路径MTU发现技术被用来解决数据包分段过程中产生的一些缺点。
- 采用策略使得在网络层中避免分段
- 每个数据包在内容中专门标注出是否允许拆分
- 如果router接收到的仍然太大且不能拆分,那么会选择:1、丢弃这个包/2、生成一个报错数据发回。
如图,一个数据包在不同的网络需求下重试了多次。
5.6 Internet的网络层
恭喜!你终于读到了整个网络层的最后一节。在之前的内容里,我们讲解了网络层是如何把不同的底层网络连接起来,并使用路由算法寻找到一条合适的数据发送路线的。同时我们也研究了网络层怎样应对拥塞、提升服务质量等实际问题。下面会简单介绍一下现实生活中的一个实际例子,因特网的网络层。(就像介绍802.11和以太网的MAC层一样)
在设计之初,因特网的网络层即有以下几个原则:
5.6.1 IPv4协议
IPv4的全称叫做Internet Protocol version 4。介绍这一部分之前,我们先从介绍IP数据报本身的格式开始
上图是一个IPv4协议的头。一个典型的IPv4报头共有32Bit*(5+n)大小,当然这个长度不是一定的,后面还有一个字段可以增加(这里请读者们注意,不要把报头的大小和地址长度搞混了。地址长度是32位)。下面分别来介绍一下其中重点字段的含义。
首先是版本字段。该字段记录了数据报属于哪个版本。不同版本的数据包拥有不同的分配方式、长度,因此标注版本是很重要的。这里顺便提以下,除了IPv4,还有一个经典的版本就是IPv6。两者有很大一点不同在于IPv6的地址长度不同,因此可以提供更多的地址空间。在IPv4刚刚诞生的时间里,地址还很充裕。但是随着互联网规模的不断扩大,可用的地址会越来越小,最终耗尽(读者可以联想以下北京的房价升高的原因)。因此,更换成空间更加充裕的IPv6协议是一个很棒的发展方向,尽管也有其它技术能够利用短缺的地址空间(之后会一一看到)
之后需要特别提及的一个字段是标识字段(identification):这个部分的作用是表示新到达的分段属于哪个数据报。因此同一个数据报所含的分段具有同样的标识值。如果有同学已经想不起来数据报是什么,需要重新回到本章第一节再读一读。
DF的含义是“不分段(Dont Fragment)”:这是针对路由器的一条命令。这个字段被用在路径MTU发现的过程之中。如果一个数据报的DF位表示它不能被分段,且不符合路由器的流量限制,那么路由器会返回一个报错信息。
MF“更多的段”(More Fragments)同样只有一位,且也与分段有关。在一个数据报被拆分出的诸多小段中,除了最后一段之外都需要设置这一位以提示接收方什么时候全部分段都已经全部到达。
最后一个需要特别提及的字段是分段偏移量(Fragment Offset):这一字段指明了当前段在所有分段中的位置,以帮助接收方重组。由于这个字段的长度只有13位,所以一个数据报最多拥有8192个分段。同时,除了最后一个段以外,其它所有段的长度必须是8字节的倍数,并小于最大长度。
MF、Fragment Offset、identification三个字段共同合作,实现了在上一章中所讲的分段技术。
5.6.2 IP地址(重点)
IP地址长度
IPv4一个非常明显的特征在于其地址长度。IPv4具有32位的地址长度,而IPv6的地址长度是128位。这一点请各位当作常识记住。
网络接口与IP地址
每一个IP地址并不指向一台真正的主机,而是指向一个网络接口。只不过,大部分情况下,我们的电脑只存在于一个网络之下,所以只有一个IP地址(如果主机同时接入了两个网络,那么就会有两个地址)。同时,因为一个路由器具有多个接口,所以具有多个ip地址。
IP地址的书写方式
在IPv4中,一个地址具有32位长度。这代表着一个地址是由32个二进制比特位组成的。但是在寻址的时候,尤其对于人类来讲,我们使用的更多是点分十进制表示法:一个地址32bit---》4byte--》四个十进制数使用小数点作为间隔,分开表示。
例如一个32位的地址(由于实在是太长了,这里用16进制表示:80D00297),我们按照字节进行划分,得到80.D0.02.97,再把每一部分换成十进制表示,得到了点分十进制表示法为:128.208.2.151。
子网:前缀、子网掩码与子网划分
介绍子网之前,首先介绍一下前缀(prefix):前面讲到,ip地址具有天然的层次性。因此当我们想要分配一片连续的地址时,可以获得相同的高位,同时在低位连续(想象一下电话号码:6315-4210到4220可能属于同一个公司或机构)。这时,这快连续的地址空间就被称作前缀。
上图中的prefix部分标注出了前缀的长度:L位。因此一共有32-L位可以供主机使用。当机器(比如路由器)想要获知这一信息的时候,往往采用的是子网掩码(subnet mask)技术。子网掩码是一串与ip地址长度等长的比特。其网络位全部为1,主机位全部为0。在路由器收到这一串比特流后,会将其与IP地址进行AND操作,这样就可以很快的提取出ip地址的网络部分。
现在问题将变得更加复杂。
为了避免冲突,网络地址管理由一个称为ICANN的机构统一负责。现在的问题是,当对网络地址空的需求时动态问题时,该怎样分配处合理的空间(比如同一机构,在申请完成自己地址空间的之后几年又需要新的地址,且最好可以连续)。问题的解决方案是子网划分:在内部将一个网络块划分成几个部分供多个内部网络使用,但对外部世界仍然像单个网络一样。
上图很好的描述了这种情况:一个学校的电子工程、计科、艺术系三个学院都需要各自的ip地址空间。使用子网划分的方式,我们可以把校园网分成三个网络。图片1最右边连接至Internet的位置(一号路由器处)表示,整个学校分到了16位的网络位和16位的主机位(写在ip地址最后的/16表示16位 网络位 )。在此基础上,EE分得了14位主机位;计科分得了15位主机位;而艺术系只有13位主机位。将一个大型网络分割,得到的结果就称为子网。
现在我们将之前学到的关于子网掩码的知识应用于此,把它扩充完整。由于引入了真正的子网概念(而不仅仅是前缀)这时的情况会更加复杂一点。我们还是用原来的图片进行说明。
橙色的区域就属于子网的部分。只不过,对于每一个路由器来讲,他们并不需要知道其中属于公司的网络前缀是多少,属于子网的部分又有多大,因此子网掩码只标识出了当前网络下的主机位。下面介绍一下子网掩码具体是怎么工作的。
我们还是使用之前的例子。假如1号路由器收到一个入境数据包,上面的目标地址表示这个包需要发送到128.208.2.151处,1号路由器该如何决定到底是发向2号、3号还是4号路由器呢?(这里我们可以先预先判断一下,既然第三个字节是2,那么该包应该是属于EE的)
这时我们将使用子网掩码进行运算。当数据包到达时,路由器会查看他的目标地址,并检查属于哪个子网。为了查看他是否属于计算机科学系,需要首先将目标地址与计科的掩码做and运算:
ip地址(点分十进制) | ip地址(后16位)(二进制) | |
---|---|---|
入境数据包 | 128.208.2.151 | 0000 0010 1001 0111 |
CS子网掩码 | 255.255.128.0 | 1000 0000 0000 0000 |
入境数据包与CS掩码AND操作 | 128.208.0.0 | 0000 0000 0000 0000 |
进行完AND操作后,路由器会把结果与该地区的前缀进行比较(例如对于计科,前缀就是128.208后面一个1),如果结果不匹配,那么说明这个数据包不属于这个网络。总结一下,步骤就是:掩码+目标AND操作,之后再同前缀比较。其中,前缀与掩码为1的部分同长。子网掩码储存在路由器、交换机等设备的路由表中。
读者可以自己用EE的掩码和前缀试一试。
分类&特殊地址
人们把32位的地址长度分成了以下几类地址。(A类、B类、C类...等等)这种方法被称为:分类寻址。
除此之外,还有一部分IP地址有着特殊的含义和功能。如0.0.0.0只在主机启动的时候使用;127.xx.xx.xx保留给回环测试使用(即:发送到该ip地址的数据包没有被真正的放在网络上,但会像入境数据包一样在本地处理)。如果各位有过调试本地服务器的经历,这一点应该并不陌生。
NAT网络地址转换(可以解决地址匮乏问题!!!!)
当数据包离开时,NAT盒子把内部ip转化成真实的ip地址,并使用端口号来标识不同的本地机器。(端口号在传输层的载荷上有对应标记)。
具体做法是:把源地址用真实ip地址代替,而原端口用一个索引值代替。在NAT盒子内部存在一个映射表,标记了索引值指向的内部的IP地址以及原来的发送接口。
5.6.3 IPv6协议(可以解决地址匮乏问题!!!!)
对于IPv6,读者需要掌握,其地址有128位(16byte)。
5.6.4 Internet控制协议(3)
这一部分将介绍一些Internet网络层的辅助控制协议。
- ICMP:Internet控制消息协议。用于返回错误消息
- ARP:地址解析协议。用于通过ip地址查找对应的mac地址
当网络上一台机需要请求一个ip地址的时候,他会广播这个地址到链路上的所有机器。网络上的所有机器在收到之后都检查自己的地址。如果一样,那么就以自己的以太网地址作为回答。
在机器运行了ARP之后,会把结果缓存起来,以便之后的通信使用。(这一点有点类似于DNS)
- DHCP:动态主机配置协议。用于广播一个数据包以请求ip地址(可以解决地址匮乏问题!!!!)
5.6.5 OSPF内部网关路由协议
OSPF的全称是open shortest path first,即开放最短路优先。OSPF是一个相当出色且广泛使用的域内路由算法,意味着这是一个适用于同一个运营网络或组织内部的路由协议。OSPF将整个网络抽象到一个有向图中来表示,之后,使用了链路状态方法(泛洪发送数据,并计算)来计算最短路径
5.6.6 BGP外部网关路由协议(Border Gateway Protocal)
相比于OSPF,BGP解决的是域间的路由问题
域内与域间问题的一个明显区别是:域内路由只需要考虑如何把数据包发送给接收方,而域间则需要同时考虑政治方面的因素
最后需要知道,BGP是距离矢量协议的一种形式(或者说,使用了距离矢量路由)
5.7 常见问题FAQ
internet/Internet/因特网/互联网,都有什么区别?
internet(互联网)是一个通用名词,它泛指由多个计算机网络互连而成的网络。而 Internet(因特网)是一个专有名词,指当前全球最大的、开放的、由众多网络互连而成的特定计算机网络(采用tcp/ip)协议族。 因特网是最大的互联网。
到此为止,网络层的所有知识点就告一段落了。我们已经学习完毕了计算机网络中内容最多的一章。
在下一章将学习传输层的内容。这一部分描述了两个相当著名的协议:UDP与TCP协议,同时我们还会继续讨论拥塞控制等话题。传输层(上)
主贴连接:>点击这里<