admin管理员组

文章数量:1130349

IP协议

网络层与数据链路层有什么关系?

基本概念

IP协议格式

分卡与组装

网段划分

IP地址的构成

DHCP协议 

IP地址的分类 

IP分类的缺点 

无分类地址 CIDR

特殊的IP地址

IP地址的数量限制

私网IP地址和公网IP地址

路由

路由表生成算法

IP6基本认识

IPv4 首部与 IPv6 首部


以结合着我这篇博客一起看(9条消息) 【网络篇】第二篇——IP协议与MAC地址详解_接受平凡 努力出众的博客-CSDN博客

IP协议

IP在TCP/IP参考模型中处于第三层,也就是网络层

网络层的主要作用是:实现主机与主机之间的通信,也叫点对点通信。

网络层与数据链路层有什么关系?

有的小伙伴分不清 IP (网络层) 和 MAC (数据链路层)之间的区别和关系。 其实很容易区分,在上面我们知道 IP 的作用是主机之间通信用的,而 MAC 的作用则是实现「直连] 的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。 举个生活的例子,小林要去一个很远的地方旅行,制定了一个行程表,其间需先后乘坐飞机、地铁、公交车才能抵达目的地,为此小林需要买飞机票,地铁票等。 飞机票和地铁票都是去往特定的地点的,每张票只能够在某一限定区间内移动,此处的「区间内」就如同通信网络中数据链路。 在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。 整个旅游行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP ,行程的终点好比目的IP 地址。

 如果小林只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而没有行程表,恐怕也很难到达目的地。因为小林不知道该坐什么车,也不知道该在哪里换乘。

因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似, 计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。 还有重要一点,旅行途中我们虽然不断变化了交通工具,但是旅行行程的起始地址和目的地址始终都没变。其实,在网络中数据包传输中也是如此, IP 地址和目标 IP 地址在传输过程中是不会变化的,只有 MAC 地址和目标 MAC 一直在变化。

基本概念

网络层解决的问题。

TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的则传输层之下的网络层和链路层。

  • 双方在进行网络通信时,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,而是需要传输层将数据继续向下进行交付,在网络层和链路层经过数据封装后再通过网络发送到对方主机,对方主机收到数据后也同样需要在链路层和网络层进行数据解包,此时对方的传输层才拿到了发送过来的数据,然后再继续将该数据向上进行交付。

网络通信的过程,就像两个人在送互相送数据,这两个人分别在两栋楼的四楼,如果一个人要将数据交给对方,那么这个人就必须先从四楼走到一楼,然后再在路上经过路径选择到达对方楼下,最后再上到四楼将数据交给对方。

其中,送数据的这个人从四楼下来的过程就是数据封装的过程,这个人在路上经过路径选择到达对方楼下的过程就是数据路由的过程,而这个人再上到四楼将数据交给对方的过程就是数据解包的过程。 

 而网络层要解决的问题就是,将数据从一台主机送到另一台主机,也就是数据的路由。

前提是保证数据可靠的从一台主机发送到另一台主机 

当双方进行基本TCP网络通信时候,要保证将数据可靠的从一台主机送到另一台主机,前提是对方主机要成功接收到发送方发送的数据,要是发送方连将数据发送给对方的能力都没有,那就更不用谈可靠的数据送给对方主机了。

  • 送方有将数据送到对方主机的能力,并不意味着发送方每次发送的数据都能够成功的发送到对方,但如果发送方连将数据发送给对方的能力都没有,那发送方基本就不可能将数据发送给对方。
  • 一旦发送方有了将数据发送给对方的能力,就算发送方某次发送的数据没有成功到达对方,此时上层TCP由于没有收到对应数据的应答,此时上层TCP会要求进行数据重发,直到数据成功发送到对方主机为止。

也就是说,在网络层有能力将数据送到对方主机的情况下,虽然网络层不能保证每次都能将数据发送成功到对端主机上,1但在TCP提供的可靠性传输的保证下,最终网络层一定能够将数据发送到对端主机。

总结:

  • 网络层解决的是主机到主机的问题。
  • 传输层解决的是进程到进程的问题。

路径选择 

数据进行的网络传输一般都是跨网络的,而路由器就是连接多个网络的硬件设备,因此数据在进行跨网络传输时一定需要经过多个路由器。

数据路由就像我们旅游一样,当确定了要到达的目标主机后,就需要寻找最短的路径到达该目的地。

  • 目的地的确定是非常重要的,因为目的地直接决定了数据路由时的路径选择,这也是跨网络找到目标主机的根本。
  • 只有数据经过了较为正确的路径选择,最终才可能慢慢趋近于目标网络或目标主机。

确定数据路由的目的地后,数据就可以在网络中进行路由了,但数据在路由时无法自行进行路径选择,因为这个数据本身是“不认识路”的,因此数据在路由的过程中需要不断“找路人问路”,而这里所谓的“路人”就是网络当中的一台台路由器。

网络当中的路由器是“认识路的”,它们将自己的“认路经验”都记录到路由表当中,因此路由器可以通过查路由表找到去特定点的最短路径。因此数据在路由时,会不断通过路由器来进行路径选择,以此来一步步靠近目标网络或目标主机。

主机和路由器 

  • 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
  • 路由器:既配有IP地址,又能进行路由控制。实际现在主流的路由器已经不仅仅具有路由的功能了,它甚至具备某些应用层的功能。
  • 节点:主机和路由器的统称。

IP协议格式

IP协议格式如下:

  • 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
  • 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
  • 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
  • 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
  • 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
  • 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
  • 选项字段:不定长,最多40字节。

IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。

IP如何将报头与有效载荷进行分离?

IP分离报头与有效载荷的方法与TCP是一模一样的,当IP从底层获取到一个报文后,虽然IP不知道报头的具体长度,但IP报文的前20个字节是IP的基本报头,并且这20字节当中涵盖4位首部长度。

因此IP是这样分离报头与有效载荷的:

  • 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小size.
  • 如果size的值大于20字节,则需要继续从报文当中读取s i z e − 20 size-20size−20字节的数据,这部分数据就是IP报头当中的选项字段。
  • 读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。

IP就是通过这种“定长报头+自描述字段”的方式进行报头和有效载荷的分离的。但需要注意的是,IP报头当中的4位首部长度描述的基本单位与TCP报头当中的4位首部长度一样,都是以4字节为单位进行描述的,这也恰好是报文的宽度。

4位二进制的取值范围是0000 ~ 1111,因此IP报头的最大长度为15 × 4 = 60 15\times 4=6015×4=60字节,因为基本报头的长度是20字节,所以IP报头中选项字段的长度最多是40字节。如果IP报头当中不携带选项字段,那么IP报头的长度就是20字节,此时报头当中的4位首部长度字段所填的值就是20 ÷ 4 = 5 20\div 4=520÷4=5,即0101

IP如何决定将有效载荷交付给上层的哪一个协议? 

基于IP协议的传输层协议不止一种,因此当IP从底层获取到一个报文并对其进行解包后,IP需要知道应该将分离后得到的有效载荷交付给上层的哪一个协议。

在IP报头当中有一个字段叫做8位协议,该字段表示的就是上层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的。该字段是发送方的IP层从上层传输层获取到数据后填充的,比如是上层TCP交给IP层的数据,那么该数据在封装IP报头时的8位协议填充的就是TCP对应的编号。

32位源IP地址和32位目的IP地址 

IP报头当中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址。

数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢趋近于目标主机。路由器在帮助数据进行路由转发时,会提取出该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。

当接收端收到了发送端发来的数据后,接收端可能也想要给发送端发送数据,因此发送端在发送数据时除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址,也就是发送端的IP地址。即便接收端收到数据后没有数据想要发送给发送端,但至少接收端需要向发送端发送一个响应报文,表明发送端发送的数据已经被接收端可靠的收到了,因此发送出去的数据除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址。
理解socket编程:

  • 在进行socket编程的时候,当一端想要发送数据给另一端时,必须要指明对端的IP地址和端口号,也就是发送数据的目的IP地址和目的端口号。
  • 其中这里的IP地址就是给网络层的IP用的,用于数据在网络传输过程中的路由转发,而这里的端口号就是给传输层的TCP或UDP用的,用于指明该数据应该交给上层的哪一个进程。
  • 发送数据时我们不需要指明发送数据的源IP地址和源端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时操作系统会自行填充上对应的源IP地址和源端口号。

 8位生存时间

报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机,比如报文在路由时出现了环路路由的情况,或者目标主机已经异常离线了,此时这个报文就成了一个废弃的游离报文。

为了避免网络当中出现大量的游离报文,于是在IP的报头当中就出现了一个字段,叫做8位生存时间(Time To Live,TTL)。8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动丢弃,此时这个报文就会在网络中消散。
 

分卡与组装

数据链路层解决的问题

IP能够将数据跨网络从一台主机送到另一台主机,而数据在进行跨网络传送时,需要经过一个个的路由器进行路由转发,最终才能到达目标主机。

比如要将数据从主机B跨网络传送到主机C,那么主机B需要先将数据交给路由器F,路由器F再将数据交给路由器G,…,最终由路由器D将数据交给主机C。

因此IP进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,这个问题实际就是由IP之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。

而两个节点直接相连也就意味着这两个节点是在同一个局域网当中的,因此要讨论两个相邻节点的数据传送时,实际讨论的就是局域网通信的问题。

最大传输单元 MTU

MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限制的,也就是说IP交给MAC帧的报文不能超过某个值,这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节。

在Linux下使用ifconfig命令可以查看对应的MTU。

 由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节,这里所说的数据包括IP的报头和IP的有效载荷。

分片与组装

 如果IP层要传送的数据超过了1500字节,那么就需要先在IP层对该数据进行分片,然后再将分片后的数据交给下层MAC帧进行发送。

如果发送数据时在IP层进行了分片,那么当这些分片数据到达对端主机的IP层后就需要先进行组装,然后再将组装好的数据交付给上层传输层。

 注意:

  • 数据的分片不是经常需要做的,实际在网络通信过程中不分片才是常态,因为数据分片会存在一些潜在的问题,比如分片可能会增加丢包的概率。
  • 数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
  • 分片数据的组装只会发生在目的端的IP层。
  • 在分片的数据中,每一个分片在IP层都会被添加上对应的IP报头,而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头。

数据的分片和组装都是由IP层完成的

数据的分片和组装都是在IP层完成的,上层的传输层和下层的链路层并不关心。

传输层只负责为数据传送提供可靠性保证,比如当数据传送失败后,传输层的TCP协议可以组织进行数据重传。

  • 当TCP将待发送的数据交给IP后,TCP并不关心该数据是否会在IP层进行分片,即TCP并不关心数据具体的发送过程。
  • 当TCP从IP获取到数据后,TCP也不关心该数据是否在IP层经过了组装。

而链路层的MAC帧只负责,将数据从一个节点传送到和自己相连的下一个节点。

  • 当IP将待发送的数据交给MAC帧后,MAC帧并不知道该数据是IP经过分片后的某个分片数据,还是一个没有经过分片的数据,MAC帧只知道它一次最多只能发送MTU大小的数据,如果IP交给MAC帧大于MTU字节的数据,那MAC帧就无法进行发送。
  • 当MAC帧从网络中获取到数据后,MAC帧也不关心这个数据是否需要进行组装,MAC帧只需要将该数据的MAC帧报头去掉后直接上交给上层IP就行了,而至于该数据的组装问题则是IP需要解决的。

因此,数据的分片和组装完全是由IP协议自己完成的,传输层和链路层不必关心也不需要关心

分片的过程

假设IP层要发送4500字节的数据,由于该数据超过了MAC帧规定的MTU,因此IP需要先将该数据进行分片,然后再将一个个的分片交给MAC帧进行发送。

IP报头如果不携带选项字段,那么其大小就是20字节,假设IP层添加的IP报头的长度就是20字节,并按下列方式将数据分片后形成了四个分片报文:

分片报文总字节数IP报头字节数数据字节数
11500201480
21500201480
31500201480
4802060

需要注意的是,分片后的每一个分片数据都需要封装上对应的IP报头,因此4500字节的数据至少需要分为四个分片报文进行发送。

分片报文到达对方的IP层后需要被重新组装起来,因此IP层在对数据进行分片时需要记录分片的信息,而IP报头当中的16位标识、3位标志和13位片偏移实际就是与数据分片相关的字段

  • 16位标识:唯一标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片报文的16位标识是相同的。
  • 3位标志:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移:分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。

因此上述四个分片报文对应的16位标识都是一样的,假设四个分片报文的16位标识都是123,则这四个报文对应的16位标识、3位标志中的“更多分片”和13位片偏移分别如下:

片报文总字节数IP报头字节数数据字节数16位标识“更多分片”13位片偏移
1150020148012310
215002014801231185
315002014801231370
48020601230555

 需要注意的是,13位片偏移当中记录的字节数是当前分片在原数据开始处的偏移字节数的值÷ 8 \div 8÷8得到的,比如分片报文2在原始数据开始处的偏移字节数是1480,其对应的13位片偏移的值就是1480 ÷ 8 = 185 1480\div 8=1851480÷8=185。

 组装的过程

 MAC帧交给IP层的数据可能来自世界各地,这些数据可能是经过分片后发送的,也可能是没有经过分片直接发送的,因此IP必须要通过某种方式来区分收到的各个数据。

  •  IP报头当中有32位源IP地址,源IP地址记录了发送端所对应的IP地址,因此通过IP报头当中的32位源IP地址就可以区分来自不同主机的数据。
  • IP报头当中有16位标识,未分片的数据各自的16位标识都是不同的,而由同一个数据分片得到的各个分片报文所对应的16位标识都是相同的,因此通过IP报头当中16位标识就可以判断哪些报文是没有经过分片的独立报文,哪些报文是经过分片后的分片报文

因此IP可以通过IP报头当中的32位源IP地址和16位标识,将经过分片的数据各自聚合在一起,聚合在一起后就可以开始进行组装了。

对于各个分片报文来说

  • 第一个分片报文中的13位片偏移的值一定为0。
  • 最后一个分片报文中的“更多分片”标志位一定为0。
  • 对于每一个分片报文来说,当前报文的13位片偏移加上当前报文的数据字节数 ÷ \div÷ 8所得到的值,就是下一个分片报文的所对应的13位片偏移。
     

根据分片报文的这三个特点就能够将分片报文合理的组装起来。

  • 先找到分片报文中13位片偏移为0的分片报文,然后提取出其IP报头当中的16位总长度字段,通过计算即可得出下一个分片报文所对应的13位片偏移,按照此方式依次将各个分片报文拼接起来。
  • 直到拼接到一个“更多分片”标志位为0的分片报文,此时表明分片报文组装完毕。

分片报文丢包的问题

 分片后的报文在网络传输过程中也可能会出现丢包问题,但接收端有能力判断是否收到了全部分片报文,比如假设某组分片报文对应的16位标识值为x:

  • 如果分片报文中的第一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16位标识为x,并且13位片偏移为0的分片报文。
  • 如果分片报文中的最后一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16为标识为x,并且“更多分片”标志位为0的分片报文。
  • 如果分片报文中的其它分片报文丢包了,那么接收端在进行分片报文的组装时就会找不到对应13位片偏移为特定值的分片报文。

需要注意的是,未分片报文的“更多分片”标志位为0,最后一个分片报文的“更多分片”标志位也为0,但当接收端只收到分片报文中的最后一个分片报文时,接收端不会将其识别成一个未分片的报文,因为未分片的报文所对应的13位片偏移的值也应该是0,而最后一个分片报文所对应的13位片偏移的值不为0。

因此只有当一个报文的13位片偏移为0,并且该报文的“更多分片”标志位也为0时,该报文才会被识别成一个没有被分片的独立报文,否则该报文就会被识别成一个分片报文。

为什么不建议进行分片?

 虽然传输层并不关心IP层的分片问题,但分片对传输层也是有影响的。

  • 如果一个数据在网络传输过程中没有经过分片,那么只要接收端收到了这一个报文,我们就可以认为该数据被对方可靠的收到了。
  • 而如果一个数据在网络传输过程中进行了分片,那么只有当接收端收到了全部的分片报文并将其成功组装起来,这时我们才认为该数据被对方可靠的收到了。但如果众多的分片报文当中有一个报文出现了丢包,就会导致接收端就无法将报文成功组装起来,这时接收端会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。
  • 假设在网络传输时丢包的概率是万分之一,如果将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加传输层重传数据的概率

需要注意的是,只要分片报文当中的某一个出现了丢包,此时传输层都需要将数据整体进行重传,因为传输层并不知道底层IP对数据进行了分片,当传输层发送出去的数据得不到应答时传输层就只能将数据整体进行重传,因此数据在发送时不建议进行分片。

如何尽可能避免分片?

 实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。

  • 因此TCP作为传输控制协议,它需要控制一次向下交付数据不能超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。
  • 通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段长度MSS。

MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。

所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的,如果数据在传输过程中进入到了一个MTU较小的网络,那么该数据仍然可能需要在路由器中进行分片。

网段划分

IP地址的构成

IP地址分为两个部分,网络号和主机号

1.网络号:保证相互连接的网段具有不同的标识

2.主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

3.不同的子网其实就是把网络号相同的主机放在一起

4.如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是这个主机号必须不能和子网中的其他主机重复。

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.

那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.

有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便。

一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器

DHCP协议 

实际手动管理IP地址是一个非常麻烦的事情,当子网中新增主机时需要给其分配一个IP地址,当子网当中有主机断开网络时又需要将其IP地址进行回收,便于分配给后续新增的主机使用。

  • 因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。
  • DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
  • DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。

当我们连接WiFi时需要输入密码,本质就是因为路由器需要验证你的账号和密码,如果验证通过,那么路由器就会给你动态分配了一个IP地址,然后你就可以基于这个IP地址进行各种上网动作了。

先找目标网络,再找目标主机 

当IP要将数据跨网络从一台主机发送到另一台主机时,其实不是直接将数据发送到了目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。

因此数据在路由时的第一目的并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络当中找到目标主机。

数据路由时之所以不一开始就以找目标主机为目的,因为这样效率太低了。

  • 找主机的过程本质是排除的过程,如果一开始就以找目标主机为目的,那么在查找的过程中一次只能排除一个主机。
  • 而如果一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机,这样就可以大大提高检索的效率。

因此,为了提高数据路由的效率,我们对网络进行了网段划分。

IP地址的分类 

过去曾经提出一种划分网络号和主机号的方案,就是把所有IP地址分为五类,如下图所示:

 上图中黄色部分为分类号,用以区分 IP 地址类别。

其中对于 A B C 类主要分为两个部分,分别是 网络号和主机号 。这很好理解,好比小林是 A 小区 1栋 101 号,你是 B 小区 1 101 号。 我们可以用下面这个表格, 就能很清楚的知道 A B C 分类对应的地址范围、最大主机个数。

 ABC 分类地址最大主机个数是如何计算的呢?

 最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:

为什么要减 2 呢? 因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。

主机号全为 1 指定某个网络下的所有主机,用于广播; 主机号全为 0 指定某个网络 因此,在分配过程中,应该去掉这两种情况 广播地址用于什么? 广播地址用于在 同一个链路中相互连接的主机之间发送数据包 学校班级中就有广播的例子,在准备上课的时候,通常班长会喊: 上课, 全体起立! ,班里的同学听到这句话是不是全部都站起来了?这个句话就有广播的含义。 当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下: 10101100.00010100.00000000.00000000 将这个地址的 主机部分全部改为 1 ,则形成广播地址: 10101100.00010100. 11111111.11111111 再将这个地址用十进制表示,则为 172.20.255.255 广播地址可以分为本地广播和直接广播两种。
  • 在本网络内广播的叫做本地广播 。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255 。因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上。
  • 在不同网络之间的广播叫做直接广播 。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24 , 从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。) 。

 什么是 DE 类地址?

D 类和 E 类地址是没有主机号的,所以不可用于主机 IP D 类常被用于 多播 E 类是预留的分类, 暂时未使用。

 多播地址用于什么?

多播用于 将包发送给特定组内的所有主机。 还是举班级的栗子,老师说: 最后一排的同学,上来做这道数学题。 ,老师指定的是最后一排的同学,也就是多播的含义了。 由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。 多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
  • 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的。
  • 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet
  • 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效。

IP分类的缺点 

1.同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开 发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性

2.ABC类有个尴尬处境,就是不能很好的与现实网络匹配

  • C 类地址能包含的最大主机数量实在太少了,只有 254 个,估计一个网吧都不够用。
  • B 类地址能包含的最大主机数量又太多了, 6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
这两个缺点,都可以在 CIDR 无分类地址解决。
  • 引入一个额外的子网掩码来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串0来结尾
  • 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

无分类地址 CIDR

正因为 IP 分类存在许多缺点,所以后面提出了无分类地址的方案,即 CIDR 这种方式不再有分类地址的概念, 32 比特的 IP 地址被划分为两部分,前面是 网络号 ,后面是 主机号
怎么划分网络号和主机号的呢?

表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于网络号 x 的范围是 0 ~ 32 ,这就使得 IP 地址更加

具有灵活性。 比如 10.100.122.2/24 ,这种地址表示形式就是 CIDR /24 表示前 24 位是网络号,剩余的 8 位是主机号。

 

还有另一种划分网络号与主机号形式,那就是 子网掩码 ,掩码的意思就是掩盖掉主机号,剩余的就是网络号 将子网掩码和 IP 地址按位计算 AND ,就可得到网络号。

 

 为什么要分离网络号和主机号?

 因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。

路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

 怎么进行子网划分?

在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是分子网

子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址 。形式如下:
  •  未做子网划分的 ip 地址:网络地址+主机地址
  • 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
假设对 C 类地址进行子网划分,网络地址 192.168.1.0 ,使用子网掩码 255.255.255.192 对其进行子网划分。 C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知 8 位主机号中借用 2 位作为子 网号

由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00011011,具体划分如下图:

 

 

划分后的 4 个子网如下表格:

 需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的基础上继续进行子网划分。因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络当中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了。

特殊的IP地址

并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就是具有特殊用途的。

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 2^{主机号位数}-2.

本机环回基本原理

 本机环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本机环回时不会将数据写到网卡上面。

本机环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常。

本机环回的基本原理:

  • 当数据到达IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将该数据放入到IP输入队列当中,然后再由IP输入函数读取上去
  • 而IP输入函数将数据读取上去的本应该是链路层交付上来的数据,因此该数据后续就会被当作从网络中读取上来的数据看待,各层协议会对该数据依次进行解包和分用。
  • 如果不是环回程序的话,那么接下来就会判断该数据对应的目的IP地址是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将该数据放入到IP输入队列当中,等待IP输入函数将其读走。
  • 只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP获取该数据目的主机的以太网地址并进行后续数据发送的操作。

loopback设备:

IP地址的数量限制

IP协议使用IP地址来标识网络中的节点,分为IPv4和IPv6。虽然一直在推行IPv6,但目前主流还是IPv4。

IPv4使用32位二进制,分为A、B、C类(D类和E类有特殊用途,不用于标识网络中的节点),共计大约37亿多个可用单播地址。听上去很多,但是Internet发展太快了,早在2011年,IANA就宣布IPv4地址耗尽。

等等,既然2011年IPv4地址就没了,那怎么直到现在,大家都还在高高兴兴地用着IPv4地址呢?

CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

1.动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的

2.NAT技术(后面重点介绍)

3.IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

私网IP地址和公网IP地址

A B C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。
  • 10.*,前8位是网络号,共16,777,216个地址。
  • 172.16.*到172.31.*,前12位是网络号,共1,048,576个地址。
  • 192.168.*,前16位是网络号,共65,536个地址。
平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的。 就像每个小区都有自己的楼编号和门牌号,你小区家可以叫 1 101 号,我小区家也可以叫 1 101 ,没有任何问题。但一旦出了小区,就需要带上中山路 666 号(公网 IP 地址),是国家统一分配的,不能两个小区都叫中山路 666 所以,公有 IP 地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买一个公有 IP ,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一。 我们连接云服务器时,连接的这个IP地址就是云服务器的公网IP地址。

我们可以通过ifconfig命令来查看我们这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的就是我这台机器的网络接口,可以看到我的私网IP地址是10.0.20.12.

 公有 IP 地址由谁管理呢?

 私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN 组织管理,中文叫「互联网名称与数字地址分配机构」。

IANA ICANN 的其中一个机构,它负责分配互联网 IP 地址,是按州的方式层层分配。
  •  ARIN 北美地区
  • LACNIC 拉丁美洲和一些加勒比群岛
  • RIPE NCC 欧洲、中东和中亚 AfriNIC 非洲地区 APNIC 亚太地区
其中,在中国是由 CNNIC 的机构进行管理,它是中国国内唯一指定的全局 IP 地址管理的组织。

 我们为什么要给运营商交钱?

 我们享受的是互联网公司提供服务,但为什么需要向运营商交钱呢?

  • 实际网络通信的基础设施都是运营商搭建的,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器。
  • 因为运营商为我们提供了通信的基础设施,所以我们交网费实际就相当于购买入网许可一样。
  • 没有运营商提供的这些基础设施,就不会诞生所谓的互联网公司,因为互联网公司是诞生在网络通信基础之上的。

也就是说,用户上网的数据首先必须经过运营商的相关网络设备,然后才能发送到互联网公司对应的服务器。因此所谓的网段划分、子网划分等工作实际都是运营商做的。

数据是如何发送到服务器的

 路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。

我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。

我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。

NAT(网络地址转换)

IPv4协议中, IP地址数量不充足的问题;

NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;

  • NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;

  • 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
  • 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
  • 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
  • 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
  • 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).

 两个主机如何跨网络通信呢?

NAT IP转换过程 

 电脑产生http报文,向下交给传输层TCP协议。TCP封装时,源端口在49152~65535间随机选择一个,如60128,目的端口为80。

 TCP封装后,交给网络层IP协议,IP封装源地址为内网电脑的私网地址192.168.1.10,目的地址为公网服务器的地址98.76.54.32,协议号为6。

  链路层的封装和前面文章所述一样,这里我们省略。这个报文发到NAT设备后,NAT设备将源地址修改为12.34.56.78,做好记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,然后将报文发到公网。

 公网根据报文中的目的地址98.76.54.32,将报文准确送达服务器。

服务器返回的信息,数据是这样封装的:

 

源和目的端口号、IP地址互换位置,公网会根据目的地址12.34.56.78,把报文送达NAT设备。NAT根据记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,把目的地址12.34.56.78换回192.168.1.10,然后根据内网地址192.168.1.10把报文送达电脑。

但这样的转换方式并不妥当,因为一个内网地址需要对应转换为一个外网地址,内网电脑数量多就会消耗大量外网地址,并没有起到节省地址的作用。

因此,我们所使用的NAT,叫做NAPT(Network Address Port Translation,网络地址端口转换)

NAPT

NAT只转换IP封装中的IP地址,而NAPT则把传输层的端口号和IP地址一起转换,可以实现一个公网地址的复用。

假设内网有两台电脑,地址分别为192.168.1.10和192.168.1.20,NAT设备地址和服务器地址和上例相同。假设两台电脑同时访问外网服务器,电脑A发出的报文封装是:

 电脑B发出的报文封装是:

两个数据报文到达NAT设备后,NAT设备做个记录: 

然后,NAT把电脑A的报文修改为:

 而电脑B的报文也被NAT修改为:

可以看到,NAT把两台内网电脑发出去的报文转换后,仅传输层的源端口号不同,IP的封装完全相同。这样一来,就可以实现同一个公网地址被不同内网电脑重复使用,只需通过端口号区别开就可以。外网返回的数据报文回到NAT设备后,NAT根据之前记录的信息再转换回内网地址和内网端口号,即可把报文送达不同的内网电脑。

为什么私网IP不能出现在公网当中?

  • 不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机。
  • 但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用私网IP,因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,缓解了IP的不足。
  • 此外,我们不能直接使用公网IP还有一个原因就是,因为我们的数据包必须要经过运营商的路由器,如果我们发送的数据直接到了公网,那也就意味着我们再也不用交网费了,这是不现实的。

两个局域网当中的主机不能不跨公网进行通信

  • 两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。
  • 即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
  • 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了。

所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。

但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

路由

IP地址的网络地址这一部分是用于进行路由控制。

路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在主机和路由器上都会有各自的路由器控制表。

在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器,如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

下面以下图的网络链路作为例子说明:

1. 主机 A 要发送一个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10 ,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 的网络地址,于是包被转发到默认路由(路由器 1

2. 路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹 配到了,于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2 3. 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 2 10.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机
路由查询的具体过程

 每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表。

  • Destination代表的是目的网络地址。
  • Gateway代表的是下一跳地址。
  • Genmask代表的是子网掩码。
  • Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
  • Iface代表的是发送接口。

当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的FlagsUG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。

环回地址是不会流向网络

 环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址.

计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址 。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

路由表生成算法

路由可分为静态路由和动态路由:

  • 静态路由:是指由网络管理员手工配置路由信息。
  • 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。

路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。

IP6基本认识

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 IPv4 地址就已经被分配完了。 但是 IPv6 的地址是 128 位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每 粒沙子都能被分配到一个 IP 地址。 IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。 但是因为 IPv4 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,还需要网络运营商对现有的设备进行升级,所以这可能是 IPv6 普及率比较慢的一个原因。
IPv6 的亮点
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。
  • IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
  • IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路 由器负荷,大大 提高了传输的性能
  • IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大 提升了安全性

 IPv6 地址的标识方法

 IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。

IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。

 如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 「::」隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。

 IPv6 地址的结构

 IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。

IPv6 的地址主要有以下类型地址:
  • 单播地址,用于一对一的通信
  • 组播地址,用于一对多的通信
  • 任播地址,用于通信最近的节点,最近的节点是由路由协议决定 没有广播地址

 

IPv6 单播地址类型  

 对于一对一通信的 IPv6 地址,主要划分了三类单播地址,每类地址的有效范围都不同。

  • 在同一链路单播通信,不经过路由器,可以使用 链路本地单播地址 IPv4 没有此类型
  • 在内网里单播通信,可以使用 唯一本地地址 ,相当于 IPv4 的私有 IP 在互联网通信,可以使用 全局单播地址 ,相当于 IPv4 的公有IP

 

IPv4 首部与 IPv6 首部

IPv4 首部与 IPv6 首部的差异如下图:

IPv6 相比 IPv4 的首部改进:

  •  取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
  • 取消了分片/重新组装相关字段.   分片与重组是耗时的过程, IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
  • 取消选项字段.   选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节

IP协议

网络层与数据链路层有什么关系?

基本概念

IP协议格式

分卡与组装

网段划分

IP地址的构成

DHCP协议 

IP地址的分类 

IP分类的缺点 

无分类地址 CIDR

特殊的IP地址

IP地址的数量限制

私网IP地址和公网IP地址

路由

路由表生成算法

IP6基本认识

IPv4 首部与 IPv6 首部


以结合着我这篇博客一起看(9条消息) 【网络篇】第二篇——IP协议与MAC地址详解_接受平凡 努力出众的博客-CSDN博客

IP协议

IP在TCP/IP参考模型中处于第三层,也就是网络层

网络层的主要作用是:实现主机与主机之间的通信,也叫点对点通信。

网络层与数据链路层有什么关系?

有的小伙伴分不清 IP (网络层) 和 MAC (数据链路层)之间的区别和关系。 其实很容易区分,在上面我们知道 IP 的作用是主机之间通信用的,而 MAC 的作用则是实现「直连] 的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。 举个生活的例子,小林要去一个很远的地方旅行,制定了一个行程表,其间需先后乘坐飞机、地铁、公交车才能抵达目的地,为此小林需要买飞机票,地铁票等。 飞机票和地铁票都是去往特定的地点的,每张票只能够在某一限定区间内移动,此处的「区间内」就如同通信网络中数据链路。 在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。 整个旅游行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP ,行程的终点好比目的IP 地址。

 如果小林只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而没有行程表,恐怕也很难到达目的地。因为小林不知道该坐什么车,也不知道该在哪里换乘。

因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似, 计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。 还有重要一点,旅行途中我们虽然不断变化了交通工具,但是旅行行程的起始地址和目的地址始终都没变。其实,在网络中数据包传输中也是如此, IP 地址和目标 IP 地址在传输过程中是不会变化的,只有 MAC 地址和目标 MAC 一直在变化。

基本概念

网络层解决的问题。

TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的则传输层之下的网络层和链路层。

  • 双方在进行网络通信时,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,而是需要传输层将数据继续向下进行交付,在网络层和链路层经过数据封装后再通过网络发送到对方主机,对方主机收到数据后也同样需要在链路层和网络层进行数据解包,此时对方的传输层才拿到了发送过来的数据,然后再继续将该数据向上进行交付。

网络通信的过程,就像两个人在送互相送数据,这两个人分别在两栋楼的四楼,如果一个人要将数据交给对方,那么这个人就必须先从四楼走到一楼,然后再在路上经过路径选择到达对方楼下,最后再上到四楼将数据交给对方。

其中,送数据的这个人从四楼下来的过程就是数据封装的过程,这个人在路上经过路径选择到达对方楼下的过程就是数据路由的过程,而这个人再上到四楼将数据交给对方的过程就是数据解包的过程。 

 而网络层要解决的问题就是,将数据从一台主机送到另一台主机,也就是数据的路由。

前提是保证数据可靠的从一台主机发送到另一台主机 

当双方进行基本TCP网络通信时候,要保证将数据可靠的从一台主机送到另一台主机,前提是对方主机要成功接收到发送方发送的数据,要是发送方连将数据发送给对方的能力都没有,那就更不用谈可靠的数据送给对方主机了。

  • 送方有将数据送到对方主机的能力,并不意味着发送方每次发送的数据都能够成功的发送到对方,但如果发送方连将数据发送给对方的能力都没有,那发送方基本就不可能将数据发送给对方。
  • 一旦发送方有了将数据发送给对方的能力,就算发送方某次发送的数据没有成功到达对方,此时上层TCP由于没有收到对应数据的应答,此时上层TCP会要求进行数据重发,直到数据成功发送到对方主机为止。

也就是说,在网络层有能力将数据送到对方主机的情况下,虽然网络层不能保证每次都能将数据发送成功到对端主机上,1但在TCP提供的可靠性传输的保证下,最终网络层一定能够将数据发送到对端主机。

总结:

  • 网络层解决的是主机到主机的问题。
  • 传输层解决的是进程到进程的问题。

路径选择 

数据进行的网络传输一般都是跨网络的,而路由器就是连接多个网络的硬件设备,因此数据在进行跨网络传输时一定需要经过多个路由器。

数据路由就像我们旅游一样,当确定了要到达的目标主机后,就需要寻找最短的路径到达该目的地。

  • 目的地的确定是非常重要的,因为目的地直接决定了数据路由时的路径选择,这也是跨网络找到目标主机的根本。
  • 只有数据经过了较为正确的路径选择,最终才可能慢慢趋近于目标网络或目标主机。

确定数据路由的目的地后,数据就可以在网络中进行路由了,但数据在路由时无法自行进行路径选择,因为这个数据本身是“不认识路”的,因此数据在路由的过程中需要不断“找路人问路”,而这里所谓的“路人”就是网络当中的一台台路由器。

网络当中的路由器是“认识路的”,它们将自己的“认路经验”都记录到路由表当中,因此路由器可以通过查路由表找到去特定点的最短路径。因此数据在路由时,会不断通过路由器来进行路径选择,以此来一步步靠近目标网络或目标主机。

主机和路由器 

  • 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
  • 路由器:既配有IP地址,又能进行路由控制。实际现在主流的路由器已经不仅仅具有路由的功能了,它甚至具备某些应用层的功能。
  • 节点:主机和路由器的统称。

IP协议格式

IP协议格式如下:

  • 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
  • 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
  • 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
  • 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
  • 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
  • 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
  • 选项字段:不定长,最多40字节。

IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。

IP如何将报头与有效载荷进行分离?

IP分离报头与有效载荷的方法与TCP是一模一样的,当IP从底层获取到一个报文后,虽然IP不知道报头的具体长度,但IP报文的前20个字节是IP的基本报头,并且这20字节当中涵盖4位首部长度。

因此IP是这样分离报头与有效载荷的:

  • 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小size.
  • 如果size的值大于20字节,则需要继续从报文当中读取s i z e − 20 size-20size−20字节的数据,这部分数据就是IP报头当中的选项字段。
  • 读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。

IP就是通过这种“定长报头+自描述字段”的方式进行报头和有效载荷的分离的。但需要注意的是,IP报头当中的4位首部长度描述的基本单位与TCP报头当中的4位首部长度一样,都是以4字节为单位进行描述的,这也恰好是报文的宽度。

4位二进制的取值范围是0000 ~ 1111,因此IP报头的最大长度为15 × 4 = 60 15\times 4=6015×4=60字节,因为基本报头的长度是20字节,所以IP报头中选项字段的长度最多是40字节。如果IP报头当中不携带选项字段,那么IP报头的长度就是20字节,此时报头当中的4位首部长度字段所填的值就是20 ÷ 4 = 5 20\div 4=520÷4=5,即0101

IP如何决定将有效载荷交付给上层的哪一个协议? 

基于IP协议的传输层协议不止一种,因此当IP从底层获取到一个报文并对其进行解包后,IP需要知道应该将分离后得到的有效载荷交付给上层的哪一个协议。

在IP报头当中有一个字段叫做8位协议,该字段表示的就是上层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的。该字段是发送方的IP层从上层传输层获取到数据后填充的,比如是上层TCP交给IP层的数据,那么该数据在封装IP报头时的8位协议填充的就是TCP对应的编号。

32位源IP地址和32位目的IP地址 

IP报头当中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址。

数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢趋近于目标主机。路由器在帮助数据进行路由转发时,会提取出该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。

当接收端收到了发送端发来的数据后,接收端可能也想要给发送端发送数据,因此发送端在发送数据时除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址,也就是发送端的IP地址。即便接收端收到数据后没有数据想要发送给发送端,但至少接收端需要向发送端发送一个响应报文,表明发送端发送的数据已经被接收端可靠的收到了,因此发送出去的数据除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址。
理解socket编程:

  • 在进行socket编程的时候,当一端想要发送数据给另一端时,必须要指明对端的IP地址和端口号,也就是发送数据的目的IP地址和目的端口号。
  • 其中这里的IP地址就是给网络层的IP用的,用于数据在网络传输过程中的路由转发,而这里的端口号就是给传输层的TCP或UDP用的,用于指明该数据应该交给上层的哪一个进程。
  • 发送数据时我们不需要指明发送数据的源IP地址和源端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时操作系统会自行填充上对应的源IP地址和源端口号。

 8位生存时间

报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机,比如报文在路由时出现了环路路由的情况,或者目标主机已经异常离线了,此时这个报文就成了一个废弃的游离报文。

为了避免网络当中出现大量的游离报文,于是在IP的报头当中就出现了一个字段,叫做8位生存时间(Time To Live,TTL)。8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动丢弃,此时这个报文就会在网络中消散。
 

分卡与组装

数据链路层解决的问题

IP能够将数据跨网络从一台主机送到另一台主机,而数据在进行跨网络传送时,需要经过一个个的路由器进行路由转发,最终才能到达目标主机。

比如要将数据从主机B跨网络传送到主机C,那么主机B需要先将数据交给路由器F,路由器F再将数据交给路由器G,…,最终由路由器D将数据交给主机C。

因此IP进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,这个问题实际就是由IP之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。

而两个节点直接相连也就意味着这两个节点是在同一个局域网当中的,因此要讨论两个相邻节点的数据传送时,实际讨论的就是局域网通信的问题。

最大传输单元 MTU

MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限制的,也就是说IP交给MAC帧的报文不能超过某个值,这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节。

在Linux下使用ifconfig命令可以查看对应的MTU。

 由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节,这里所说的数据包括IP的报头和IP的有效载荷。

分片与组装

 如果IP层要传送的数据超过了1500字节,那么就需要先在IP层对该数据进行分片,然后再将分片后的数据交给下层MAC帧进行发送。

如果发送数据时在IP层进行了分片,那么当这些分片数据到达对端主机的IP层后就需要先进行组装,然后再将组装好的数据交付给上层传输层。

 注意:

  • 数据的分片不是经常需要做的,实际在网络通信过程中不分片才是常态,因为数据分片会存在一些潜在的问题,比如分片可能会增加丢包的概率。
  • 数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
  • 分片数据的组装只会发生在目的端的IP层。
  • 在分片的数据中,每一个分片在IP层都会被添加上对应的IP报头,而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头。

数据的分片和组装都是由IP层完成的

数据的分片和组装都是在IP层完成的,上层的传输层和下层的链路层并不关心。

传输层只负责为数据传送提供可靠性保证,比如当数据传送失败后,传输层的TCP协议可以组织进行数据重传。

  • 当TCP将待发送的数据交给IP后,TCP并不关心该数据是否会在IP层进行分片,即TCP并不关心数据具体的发送过程。
  • 当TCP从IP获取到数据后,TCP也不关心该数据是否在IP层经过了组装。

而链路层的MAC帧只负责,将数据从一个节点传送到和自己相连的下一个节点。

  • 当IP将待发送的数据交给MAC帧后,MAC帧并不知道该数据是IP经过分片后的某个分片数据,还是一个没有经过分片的数据,MAC帧只知道它一次最多只能发送MTU大小的数据,如果IP交给MAC帧大于MTU字节的数据,那MAC帧就无法进行发送。
  • 当MAC帧从网络中获取到数据后,MAC帧也不关心这个数据是否需要进行组装,MAC帧只需要将该数据的MAC帧报头去掉后直接上交给上层IP就行了,而至于该数据的组装问题则是IP需要解决的。

因此,数据的分片和组装完全是由IP协议自己完成的,传输层和链路层不必关心也不需要关心

分片的过程

假设IP层要发送4500字节的数据,由于该数据超过了MAC帧规定的MTU,因此IP需要先将该数据进行分片,然后再将一个个的分片交给MAC帧进行发送。

IP报头如果不携带选项字段,那么其大小就是20字节,假设IP层添加的IP报头的长度就是20字节,并按下列方式将数据分片后形成了四个分片报文:

分片报文总字节数IP报头字节数数据字节数
11500201480
21500201480
31500201480
4802060

需要注意的是,分片后的每一个分片数据都需要封装上对应的IP报头,因此4500字节的数据至少需要分为四个分片报文进行发送。

分片报文到达对方的IP层后需要被重新组装起来,因此IP层在对数据进行分片时需要记录分片的信息,而IP报头当中的16位标识、3位标志和13位片偏移实际就是与数据分片相关的字段

  • 16位标识:唯一标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片报文的16位标识是相同的。
  • 3位标志:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移:分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。

因此上述四个分片报文对应的16位标识都是一样的,假设四个分片报文的16位标识都是123,则这四个报文对应的16位标识、3位标志中的“更多分片”和13位片偏移分别如下:

片报文总字节数IP报头字节数数据字节数16位标识“更多分片”13位片偏移
1150020148012310
215002014801231185
315002014801231370
48020601230555

 需要注意的是,13位片偏移当中记录的字节数是当前分片在原数据开始处的偏移字节数的值÷ 8 \div 8÷8得到的,比如分片报文2在原始数据开始处的偏移字节数是1480,其对应的13位片偏移的值就是1480 ÷ 8 = 185 1480\div 8=1851480÷8=185。

 组装的过程

 MAC帧交给IP层的数据可能来自世界各地,这些数据可能是经过分片后发送的,也可能是没有经过分片直接发送的,因此IP必须要通过某种方式来区分收到的各个数据。

  •  IP报头当中有32位源IP地址,源IP地址记录了发送端所对应的IP地址,因此通过IP报头当中的32位源IP地址就可以区分来自不同主机的数据。
  • IP报头当中有16位标识,未分片的数据各自的16位标识都是不同的,而由同一个数据分片得到的各个分片报文所对应的16位标识都是相同的,因此通过IP报头当中16位标识就可以判断哪些报文是没有经过分片的独立报文,哪些报文是经过分片后的分片报文

因此IP可以通过IP报头当中的32位源IP地址和16位标识,将经过分片的数据各自聚合在一起,聚合在一起后就可以开始进行组装了。

对于各个分片报文来说

  • 第一个分片报文中的13位片偏移的值一定为0。
  • 最后一个分片报文中的“更多分片”标志位一定为0。
  • 对于每一个分片报文来说,当前报文的13位片偏移加上当前报文的数据字节数 ÷ \div÷ 8所得到的值,就是下一个分片报文的所对应的13位片偏移。
     

根据分片报文的这三个特点就能够将分片报文合理的组装起来。

  • 先找到分片报文中13位片偏移为0的分片报文,然后提取出其IP报头当中的16位总长度字段,通过计算即可得出下一个分片报文所对应的13位片偏移,按照此方式依次将各个分片报文拼接起来。
  • 直到拼接到一个“更多分片”标志位为0的分片报文,此时表明分片报文组装完毕。

分片报文丢包的问题

 分片后的报文在网络传输过程中也可能会出现丢包问题,但接收端有能力判断是否收到了全部分片报文,比如假设某组分片报文对应的16位标识值为x:

  • 如果分片报文中的第一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16位标识为x,并且13位片偏移为0的分片报文。
  • 如果分片报文中的最后一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16为标识为x,并且“更多分片”标志位为0的分片报文。
  • 如果分片报文中的其它分片报文丢包了,那么接收端在进行分片报文的组装时就会找不到对应13位片偏移为特定值的分片报文。

需要注意的是,未分片报文的“更多分片”标志位为0,最后一个分片报文的“更多分片”标志位也为0,但当接收端只收到分片报文中的最后一个分片报文时,接收端不会将其识别成一个未分片的报文,因为未分片的报文所对应的13位片偏移的值也应该是0,而最后一个分片报文所对应的13位片偏移的值不为0。

因此只有当一个报文的13位片偏移为0,并且该报文的“更多分片”标志位也为0时,该报文才会被识别成一个没有被分片的独立报文,否则该报文就会被识别成一个分片报文。

为什么不建议进行分片?

 虽然传输层并不关心IP层的分片问题,但分片对传输层也是有影响的。

  • 如果一个数据在网络传输过程中没有经过分片,那么只要接收端收到了这一个报文,我们就可以认为该数据被对方可靠的收到了。
  • 而如果一个数据在网络传输过程中进行了分片,那么只有当接收端收到了全部的分片报文并将其成功组装起来,这时我们才认为该数据被对方可靠的收到了。但如果众多的分片报文当中有一个报文出现了丢包,就会导致接收端就无法将报文成功组装起来,这时接收端会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。
  • 假设在网络传输时丢包的概率是万分之一,如果将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加传输层重传数据的概率

需要注意的是,只要分片报文当中的某一个出现了丢包,此时传输层都需要将数据整体进行重传,因为传输层并不知道底层IP对数据进行了分片,当传输层发送出去的数据得不到应答时传输层就只能将数据整体进行重传,因此数据在发送时不建议进行分片。

如何尽可能避免分片?

 实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。

  • 因此TCP作为传输控制协议,它需要控制一次向下交付数据不能超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。
  • 通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段长度MSS。

MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。

所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的,如果数据在传输过程中进入到了一个MTU较小的网络,那么该数据仍然可能需要在路由器中进行分片。

网段划分

IP地址的构成

IP地址分为两个部分,网络号和主机号

1.网络号:保证相互连接的网段具有不同的标识

2.主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

3.不同的子网其实就是把网络号相同的主机放在一起

4.如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是这个主机号必须不能和子网中的其他主机重复。

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.

那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.

有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便。

一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器

DHCP协议 

实际手动管理IP地址是一个非常麻烦的事情,当子网中新增主机时需要给其分配一个IP地址,当子网当中有主机断开网络时又需要将其IP地址进行回收,便于分配给后续新增的主机使用。

  • 因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。
  • DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
  • DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。

当我们连接WiFi时需要输入密码,本质就是因为路由器需要验证你的账号和密码,如果验证通过,那么路由器就会给你动态分配了一个IP地址,然后你就可以基于这个IP地址进行各种上网动作了。

先找目标网络,再找目标主机 

当IP要将数据跨网络从一台主机发送到另一台主机时,其实不是直接将数据发送到了目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。

因此数据在路由时的第一目的并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络当中找到目标主机。

数据路由时之所以不一开始就以找目标主机为目的,因为这样效率太低了。

  • 找主机的过程本质是排除的过程,如果一开始就以找目标主机为目的,那么在查找的过程中一次只能排除一个主机。
  • 而如果一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机,这样就可以大大提高检索的效率。

因此,为了提高数据路由的效率,我们对网络进行了网段划分。

IP地址的分类 

过去曾经提出一种划分网络号和主机号的方案,就是把所有IP地址分为五类,如下图所示:

 上图中黄色部分为分类号,用以区分 IP 地址类别。

其中对于 A B C 类主要分为两个部分,分别是 网络号和主机号 。这很好理解,好比小林是 A 小区 1栋 101 号,你是 B 小区 1 101 号。 我们可以用下面这个表格, 就能很清楚的知道 A B C 分类对应的地址范围、最大主机个数。

 ABC 分类地址最大主机个数是如何计算的呢?

 最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:

为什么要减 2 呢? 因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。

主机号全为 1 指定某个网络下的所有主机,用于广播; 主机号全为 0 指定某个网络 因此,在分配过程中,应该去掉这两种情况 广播地址用于什么? 广播地址用于在 同一个链路中相互连接的主机之间发送数据包 学校班级中就有广播的例子,在准备上课的时候,通常班长会喊: 上课, 全体起立! ,班里的同学听到这句话是不是全部都站起来了?这个句话就有广播的含义。 当主机号全为 1 时,就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下: 10101100.00010100.00000000.00000000 将这个地址的 主机部分全部改为 1 ,则形成广播地址: 10101100.00010100. 11111111.11111111 再将这个地址用十进制表示,则为 172.20.255.255 广播地址可以分为本地广播和直接广播两种。
  • 在本网络内广播的叫做本地广播 。例如网络地址为 192.168.0.0/24 的情况下,广播地址是 192.168.0.255 。因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上。
  • 在不同网络之间的广播叫做直接广播 。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24 , 从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。) 。

 什么是 DE 类地址?

D 类和 E 类地址是没有主机号的,所以不可用于主机 IP D 类常被用于 多播 E 类是预留的分类, 暂时未使用。

 多播地址用于什么?

多播用于 将包发送给特定组内的所有主机。 还是举班级的栗子,老师说: 最后一排的同学,上来做这道数学题。 ,老师指定的是最后一排的同学,也就是多播的含义了。 由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。 多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
  • 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的。
  • 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet
  • 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效。

IP分类的缺点 

1.同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开 发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性

2.ABC类有个尴尬处境,就是不能很好的与现实网络匹配

  • C 类地址能包含的最大主机数量实在太少了,只有 254 个,估计一个网吧都不够用。
  • B 类地址能包含的最大主机数量又太多了, 6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
这两个缺点,都可以在 CIDR 无分类地址解决。
  • 引入一个额外的子网掩码来区分网络号和主机号
  • 子网掩码也是一个32位的正整数,通常用一串0来结尾
  • 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

无分类地址 CIDR

正因为 IP 分类存在许多缺点,所以后面提出了无分类地址的方案,即 CIDR 这种方式不再有分类地址的概念, 32 比特的 IP 地址被划分为两部分,前面是 网络号 ,后面是 主机号
怎么划分网络号和主机号的呢?

表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于网络号 x 的范围是 0 ~ 32 ,这就使得 IP 地址更加

具有灵活性。 比如 10.100.122.2/24 ,这种地址表示形式就是 CIDR /24 表示前 24 位是网络号,剩余的 8 位是主机号。

 

还有另一种划分网络号与主机号形式,那就是 子网掩码 ,掩码的意思就是掩盖掉主机号,剩余的就是网络号 将子网掩码和 IP 地址按位计算 AND ,就可得到网络号。

 

 为什么要分离网络号和主机号?

 因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。

路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。

 怎么进行子网划分?

在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是分子网

子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址 。形式如下:
  •  未做子网划分的 ip 地址:网络地址+主机地址
  • 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)
假设对 C 类地址进行子网划分,网络地址 192.168.1.0 ,使用子网掩码 255.255.255.192 对其进行子网划分。 C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知 8 位主机号中借用 2 位作为子 网号

由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00011011,具体划分如下图:

 

 

划分后的 4 个子网如下表格:

 需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的基础上继续进行子网划分。因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络当中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了。

特殊的IP地址

并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就是具有特殊用途的。

  • 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
  • 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 2^{主机号位数}-2.

本机环回基本原理

 本机环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本机环回时不会将数据写到网卡上面。

本机环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常。

本机环回的基本原理:

  • 当数据到达IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将该数据放入到IP输入队列当中,然后再由IP输入函数读取上去
  • 而IP输入函数将数据读取上去的本应该是链路层交付上来的数据,因此该数据后续就会被当作从网络中读取上来的数据看待,各层协议会对该数据依次进行解包和分用。
  • 如果不是环回程序的话,那么接下来就会判断该数据对应的目的IP地址是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将该数据放入到IP输入队列当中,等待IP输入函数将其读走。
  • 只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP获取该数据目的主机的以太网地址并进行后续数据发送的操作。

loopback设备:

IP地址的数量限制

IP协议使用IP地址来标识网络中的节点,分为IPv4和IPv6。虽然一直在推行IPv6,但目前主流还是IPv4。

IPv4使用32位二进制,分为A、B、C类(D类和E类有特殊用途,不用于标识网络中的节点),共计大约37亿多个可用单播地址。听上去很多,但是Internet发展太快了,早在2011年,IANA就宣布IPv4地址耗尽。

等等,既然2011年IPv4地址就没了,那怎么直到现在,大家都还在高高兴兴地用着IPv4地址呢?

CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:

1.动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的

2.NAT技术(后面重点介绍)

3.IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

私网IP地址和公网IP地址

A B C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。
  • 10.*,前8位是网络号,共16,777,216个地址。
  • 172.16.*到172.31.*,前12位是网络号,共1,048,576个地址。
  • 192.168.*,前16位是网络号,共65,536个地址。
平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的。 就像每个小区都有自己的楼编号和门牌号,你小区家可以叫 1 101 号,我小区家也可以叫 1 101 ,没有任何问题。但一旦出了小区,就需要带上中山路 666 号(公网 IP 地址),是国家统一分配的,不能两个小区都叫中山路 666 所以,公有 IP 地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买一个公有 IP ,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一。 我们连接云服务器时,连接的这个IP地址就是云服务器的公网IP地址。

我们可以通过ifconfig命令来查看我们这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的就是我这台机器的网络接口,可以看到我的私网IP地址是10.0.20.12.

 公有 IP 地址由谁管理呢?

 私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN 组织管理,中文叫「互联网名称与数字地址分配机构」。

IANA ICANN 的其中一个机构,它负责分配互联网 IP 地址,是按州的方式层层分配。
  •  ARIN 北美地区
  • LACNIC 拉丁美洲和一些加勒比群岛
  • RIPE NCC 欧洲、中东和中亚 AfriNIC 非洲地区 APNIC 亚太地区
其中,在中国是由 CNNIC 的机构进行管理,它是中国国内唯一指定的全局 IP 地址管理的组织。

 我们为什么要给运营商交钱?

 我们享受的是互联网公司提供服务,但为什么需要向运营商交钱呢?

  • 实际网络通信的基础设施都是运营商搭建的,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器。
  • 因为运营商为我们提供了通信的基础设施,所以我们交网费实际就相当于购买入网许可一样。
  • 没有运营商提供的这些基础设施,就不会诞生所谓的互联网公司,因为互联网公司是诞生在网络通信基础之上的。

也就是说,用户上网的数据首先必须经过运营商的相关网络设备,然后才能发送到互联网公司对应的服务器。因此所谓的网段划分、子网划分等工作实际都是运营商做的。

数据是如何发送到服务器的

 路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。

我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。

我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。

NAT(网络地址转换)

IPv4协议中, IP地址数量不充足的问题;

NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;

  • NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
  • 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
  • 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;

  • 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
  • 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
  • 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
  • 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
  • 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).

 两个主机如何跨网络通信呢?

NAT IP转换过程 

 电脑产生http报文,向下交给传输层TCP协议。TCP封装时,源端口在49152~65535间随机选择一个,如60128,目的端口为80。

 TCP封装后,交给网络层IP协议,IP封装源地址为内网电脑的私网地址192.168.1.10,目的地址为公网服务器的地址98.76.54.32,协议号为6。

  链路层的封装和前面文章所述一样,这里我们省略。这个报文发到NAT设备后,NAT设备将源地址修改为12.34.56.78,做好记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,然后将报文发到公网。

 公网根据报文中的目的地址98.76.54.32,将报文准确送达服务器。

服务器返回的信息,数据是这样封装的:

 

源和目的端口号、IP地址互换位置,公网会根据目的地址12.34.56.78,把报文送达NAT设备。NAT根据记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,把目的地址12.34.56.78换回192.168.1.10,然后根据内网地址192.168.1.10把报文送达电脑。

但这样的转换方式并不妥当,因为一个内网地址需要对应转换为一个外网地址,内网电脑数量多就会消耗大量外网地址,并没有起到节省地址的作用。

因此,我们所使用的NAT,叫做NAPT(Network Address Port Translation,网络地址端口转换)

NAPT

NAT只转换IP封装中的IP地址,而NAPT则把传输层的端口号和IP地址一起转换,可以实现一个公网地址的复用。

假设内网有两台电脑,地址分别为192.168.1.10和192.168.1.20,NAT设备地址和服务器地址和上例相同。假设两台电脑同时访问外网服务器,电脑A发出的报文封装是:

 电脑B发出的报文封装是:

两个数据报文到达NAT设备后,NAT设备做个记录: 

然后,NAT把电脑A的报文修改为:

 而电脑B的报文也被NAT修改为:

可以看到,NAT把两台内网电脑发出去的报文转换后,仅传输层的源端口号不同,IP的封装完全相同。这样一来,就可以实现同一个公网地址被不同内网电脑重复使用,只需通过端口号区别开就可以。外网返回的数据报文回到NAT设备后,NAT根据之前记录的信息再转换回内网地址和内网端口号,即可把报文送达不同的内网电脑。

为什么私网IP不能出现在公网当中?

  • 不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机。
  • 但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用私网IP,因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,缓解了IP的不足。
  • 此外,我们不能直接使用公网IP还有一个原因就是,因为我们的数据包必须要经过运营商的路由器,如果我们发送的数据直接到了公网,那也就意味着我们再也不用交网费了,这是不现实的。

两个局域网当中的主机不能不跨公网进行通信

  • 两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。
  • 即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
  • 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了。

所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。

但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

路由

IP地址的网络地址这一部分是用于进行路由控制。

路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在主机和路由器上都会有各自的路由器控制表。

在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器,如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

下面以下图的网络链路作为例子说明:

1. 主机 A 要发送一个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10 ,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 的网络地址,于是包被转发到默认路由(路由器 1

2. 路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹 配到了,于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2 3. 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 2 10.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机
路由查询的具体过程

 每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表。

  • Destination代表的是目的网络地址。
  • Gateway代表的是下一跳地址。
  • Genmask代表的是子网掩码。
  • Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
  • Iface代表的是发送接口。

当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的FlagsUG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。

环回地址是不会流向网络

 环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址.

计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址 。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。

路由表生成算法

路由可分为静态路由和动态路由:

  • 静态路由:是指由网络管理员手工配置路由信息。
  • 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。

路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。

IP6基本认识

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 IPv4 地址就已经被分配完了。 但是 IPv6 的地址是 128 位的,这可分配的地址数量是大的惊人,说个段子 IPv6 可以保证地球上的每 粒沙子都能被分配到一个 IP 地址。 IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。 但是因为 IPv4 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,还需要网络运营商对现有的设备进行升级,所以这可能是 IPv6 普及率比较慢的一个原因。
IPv6 的亮点
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。
  • IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
  • IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路 由器负荷,大大 提高了传输的性能
  • IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大 提升了安全性

 IPv6 地址的标识方法

 IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。

IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。

 如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 「::」隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。

 IPv6 地址的结构

 IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。

IPv6 的地址主要有以下类型地址:
  • 单播地址,用于一对一的通信
  • 组播地址,用于一对多的通信
  • 任播地址,用于通信最近的节点,最近的节点是由路由协议决定 没有广播地址

 

IPv6 单播地址类型  

 对于一对一通信的 IPv6 地址,主要划分了三类单播地址,每类地址的有效范围都不同。

  • 在同一链路单播通信,不经过路由器,可以使用 链路本地单播地址 IPv4 没有此类型
  • 在内网里单播通信,可以使用 唯一本地地址 ,相当于 IPv4 的私有 IP 在互联网通信,可以使用 全局单播地址 ,相当于 IPv4 的公有IP

 

IPv4 首部与 IPv6 首部

IPv4 首部与 IPv6 首部的差异如下图:

IPv6 相比 IPv4 的首部改进:

  •  取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
  • 取消了分片/重新组装相关字段.   分片与重组是耗时的过程, IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
  • 取消选项字段.   选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节

本文标签: 详解协议网络IP