IP协议

1. 网络层简介

  1. 网络层介于传输层和数据链路层之间,其主要作用是实现两个不同网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等。网络层负责在不同的网络之间(基于数据包的IP地址)尽力转发数据包,不负责丢包重传和接收顺序。

  2. 网络层是网络与网络之间通信的最底层,在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用。不同网络有者不同的网络层协议和地址规范,如果一个网络中的用户不能识别其他网络的通信协议和地址规范,那么这两个网络之间就不能进行数据通信,就好比不同国家有着不同的交通法规,属于不同的交警系统管理,不允许他国车辆随便出入一样。不同网络也有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信。

  3. 如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信,但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在 TCP/IP 协议体系中叫网际互连层。

注意:

  • 网络层解决的问题是,将数据从一台主机送到另一台主机,因此网络层解决的是主机到主机的问题
  • 一方传输层从上层拿到数据后,该数据贯穿网络协议栈进行封装和解包,最终到达对方传输层,此时对方传输层也会将数据向上交给对应的进程,因此传输层解决的是进程到进程的问题

2. IP协议

2.1 基本概念

IP协议全称为"网际互连协议(Internet Protocol)",IP协议是TCP/IP体系中的网络层协议。该协议是一个无连接的服务,负责在源地址和目的地址之间传送数据报,其主要功能就是把数据报在互连的网络上传送,将数据报在一个个模块间通过路由处理网络地址传送到目的地址。

(1)数据进行的网络传输一般都是跨网络的,而路由器就是连接多个网络的硬件设备,因此数据进行跨网络传输时一定会经过多个路由器:

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

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

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

(2)主机和路由器

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

2.2 IP协议的格式

(1)IP协议的格式划分如下图:

  • 4位版本号:指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
  • 4位首部长度:表示IP报头的长度,以4字节为单位。
  • 8位服务类型:3位优先权字段(已弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量较为重要。
  • 16位总长度:IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
  • 16位标识:唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
  • 3位标志字段:第一位保留,表示暂时没有规定该字段的意义;第二位表示禁止分片,表示若报文长度超过MTU,IP模块就会丢弃该报文;第三位表示"更多分片",若报文没有进行分片,则该字段设置为0,若报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移:分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值×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报头的封装

(2)IP协议如何将报头与有效载荷进行分离?

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

  • 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小size。若size的值大于20字节,则需要继续从报文中读取size−20字节的数据,这部分数据就是IP报头中的选项字段。
  • 读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。IP协议通过这种"定长报头+自描述字段"的方式进行报头和有效载荷的分离
  • IP报头中的4位首部长度与TCP报头中的4位首部长度都以4字节为单位进行描述的,也恰好是报文的宽度。
  • 4位二进制的取值范围是0000 ~ 1111,因此IP报头的最大长度为15 × 4 = 60字节。基本报头的长度是20字节,所以选项字段的长度最多为40字节。若IP报头中不携带选项字段,那么IP报头长度就为20字节,此时报头中的4位首部长度字段所填的值就是20 ÷ 4 = 5,即0101。

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

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

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

(4)32位源IP地址和32位目的IP地址

  • IP报头中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址
  • 数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢趋近于目标主机。路由器在帮助数据进行路由转发时,会提取出该数据的IP报头中的目的IP地址,并以此作为数据路由转发的重要依据。
  • 当接收端收到了发送端发来的数据后,接收端可能也想要给发送端发送数据,因此发送端在发送数据时除了需要指明该数据的目的IP地址,还需要指明该数据的源IP地址,即发送端的IP地址。即便接收端收到数据后没有数据想要发送,但至少需要向发送端发送一个响应报文,表明发送端发送的数据已经被接收端可靠的收到了。

(5)8位生存时间

  • 报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机。如报文在路由时出现了环路路由的情况,或者目标主机已经异常离线了,此时这个报文就成了一个废弃的游离报文。
  • 为了避免网络中出现大量的游离报文,于是在IP的报头中就出现了一个字段:8位生存时间(Time To Live,TTL)。8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,生存时间就会减一,当生存时间减为0时该报文就被自动丢弃,在网络中消散。

3. 分片与组装

(1)IP能够将数据跨网络从一台主机送到另一台主机,而数据在进行跨网络传送时,需要经过一个个的路由器进行路由转发,最终才能到达目标主机。如要将数据从主机B跨网络传送到主机C,那么主机B需要先将数据交给路由器F,路由器F再将数据交给路由器G,…,最终由路由器D将数据交给主机C


IP进行数据跨网络传送的前提是,需要先将数据从一个节点传送到和自己相连的下一个节点,这个问题就是由IP网络层之下的数据链路层解决的,其中数据链路层最典型的代表协议就是MAC帧。而两个节点直接相连也就意味着这两个节点是在同一个局域网中的,因此要讨论两个相邻节点的数据传送时,实际讨论的就是局域网通信的问题。

(2)最大传输单元 MTU

  • MAC帧作为数据链路层的协议,会将IP传下来的数据封装成数据帧,然后发送到网络中。但MAC帧携带的有效载荷的最大长度是有限制的,即IP交给MAC帧的报文不能超过某个值,这个值就是最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节。
  • 使用ifconfig命令可以查看对应的MTU:


由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节。

(3)分片与组装

  • 若IP层要传送的数据大于1500字节,那么就需先在IP层对该数据进行分片,然后再将分片后的数据交给下层MAC帧进行发送::

  • 若发送数据时在IP层进行了分片,那么分片数据到达对端主机的IP层后就需先进行组装,然后再将组装好的数据交付给上层传输层:


注意:

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

(4)数据的分片和组装都在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协议自行完成的,传输层和链路层不必关心也不需要关心。

(5)分片的过程

①假设IP层要发送4500字节的数据,由于该数据超过了MAC帧规定的MTU(1500字节),因此IP层需先将该数据进行分片,然后再将一个个的分片交给MAC帧进行发送。IP报头若不携带选项字段,那么其大小就是20字节,假设IP层添加的IP报头的长度就是20字节,并按下列方式将数据分片后形成了四个分片报文:

分片报头 总字节数 IP报头字节数 数据字节数
1 1500 20 1480
2 1500 20 1480
3 1500 20 1480
4 80 20 60
  • 分片后的每一个分片数据都需要封装上对应的IP报头,因此4500字节的数据至少需要分为四个分片报文进行发送。
  • 分片报文到达对方的IP层后需要被重新组装起来**,因此IP层在对数据进行分片时需要记录分片的信息,而IP报头中的16位标识、3位标志和13位片偏移实际就是与数据分片相关的字段。**

②上述四个分片报文对应的16位标识相同,假设四个分片报文的16位标识都是123,则这四个报文对应的16位标识、3位标志中的"更多分片"和13位片偏移分别如下:

分片报头 总字节数 IP报头字节数 数据字节数 16位标识 “更多分片” 13位偏移量
1 1500 20 1480 123 1 0
2 1500 20 1480 123 1 185
3 1500 20 1480 123 1 370
4 80 20 60 123 0 555

13位片偏移中记录的字节数是当前分片在原数据开始处的偏移字节数的值÷8,如分片报文2在原始数据开始处的偏移字节数是1480,其对应的13位片偏移的值就是1480 ÷ 8 = 185。


(6)组装过程

①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位片偏移加上当前报文的数据字节数÷ 8所得到的值,就是下一个分片报文的所对应的13位片偏移。

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

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

(7)分片报文丢包的问题

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

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

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

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

(8)为什么不建议进行分片?

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

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

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

(9)如何尽可能避免分片?

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

  • TCP作为传输控制协议,需控制一次向下交付数据不能超过某一阈值,这个阈值被称为MSS(Maximum Segment Size,最大报文段长度)
  • 通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段长度MSS
  • MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20(减去TCP、IP两个报头的大小)。MTU的值一般是1500字节,因此MSS的值一般为1460字节

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

4. 网段划分

(1)IP地址的构成是由网络号和主机号两部分构成:

  • 网络号:保证相互连接的两个网段具有不同的标识
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

可以在IP地址的后面加一个 /,并在 / 后面加上一个数字,这就表示从头数到第几位为止属于网络标识

例如下图中路由器连接了两个网段。对于网络标识来讲,同一网段内主机的网络标识是相同的,不同网段内主机的网络标识是不同的。而对于主机标识来讲,同一网段内主机的主机标识是不同的,不同网段内主机的主机标识是可以相同的。


若在子网中新增一台主机,则这台主机的网络号和子网的网络号一致,但是主机号不能和子网中的其他主机重复。

(2)DHCP协议

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

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

(3)为什么要进行网段划分?

  • 当IP要将数据跨网络从一台主机发送到另一台主机时,不是直接将数据发送到目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。因此数据在路由时的第一目的并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络中找到目标主机。
  • 数据路由之所以不一开始就以找目标主机为目的,是因为这样效率太低了
  • 找主机的过程本质是排除的过程,若一开始就以找目标主机为目的,那么查找一次仅能排除一个主机。而若一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机,可以提高检索的效率。为了提高数据路由的效率,对网络进行了网段划分。

(4)网段划分

  • 过去曾经提出一种划分网络号和主机号的方案,即将所有IP地址分为五类:

  • A类:0.0.0.0到127.255.255.255
  • B类:128.0.0.0到191.255.255.255
  • C类:192.0.0.0到223.255.255.255
  • D类:224.0.0.0到239.255.255.255
  • E类:240.0.0.0到247.255.255.255

要判断一个IP地址是属于哪一类时,只需遍历IP地址前五个bit位,第几个bit位最先出现0值,那么这个IP地址对应就属于A、B、C、D、E类地址。

(5)子网划分

①但是随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址:

  • 例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机,A类地址的子网内的主机数更多。
  • 然而实际网络架设中,不会存在一个子网内有这么多的情况。因此大量的IP地址都被浪费掉了。

②针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)

  • 在原有的五类网络的基础上继续进行子网划分,这也意味着需要借用主机号中的若干位来充当网络号,此时为了区分IP地址中的网络号和主机号,于是引入了子网掩码(subnet mask)的概念。
  • 每一个子网都有各自的子网掩码,子网掩码实际就是一个32位的正整数,通常用一串"0"来结尾。
  • 将IP地址与当前网络的子网掩码进行"按位与"操作,就能够得到当前所在网络的网络号。

③此时一个网络就被更细粒度的划分成了一个个更小的子网,通过不断的子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用IP地址的个数也就越来越少,这也就避免了IP地址被大量浪费的情况

  • 例如在某一子网中将IP地址的前24位作为网络号,那么该网络对应的子网掩码的32个bit位中的前24位就为1,剩下的8个比特位为0,将其用点分十机制表示即255.255.255.0
  • 假设该子网中有一台主机对应的IP地址是192.168.128.10,将这个IP地址与该网络对应的子网掩码进行"按位与"后得到192.168.128.0,这就是这个子网对应的网络号。
  • 实际在用子网掩码与子网中主机的IP地址进行"按位与"操作时,本质就是保留了主机IP地址中前24个bit位的原貌,将剩下的8个比特位的值清0了而已,也就是将主机号清0了,所以"按位与"后的结果就是该网络对应的网络号。

注意:子网划分不是只能进行一次,可以在划分出来的子网的基础上继续进行子网划分。

因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,也意味着IP地址中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了。

5. 特殊IP地址

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

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

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

(2)本机环回的目的

  • 本机环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络中,相当于本机环回时不会将数据写到网卡上。
  • 本机环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常。

(3)本机环回的基本原理:

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

6. IP地址的数量限制

(1)IP地址数量不足的问题

  • IP地址(IPv4)是一个4字节32位的正整数,因此一共有个IP地址,即将近43亿个IP地址。但TCP/IP协议规定,每个主机都要有一个IP地址。
  • 现在全世界人口已经有70多亿了,电脑、手机等都需要IP地址。随着科技的发展,智能手表、智能冰箱、智能洗衣机等设备若要入网也是需要IP地址的。并且IP地址并不是按照主机台数来配置的,因此一个主机可能需要多个IP地址,更别谈还有很多组网的路由设备也需要IP地址,以及一些特殊的IP地址不能使用的问题。
  • 43亿个IP地址其实早就不够用了,因此才提出了CIDR的方案对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费。
  • CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址的绝对上限并没有增加。

(2)解决IP地址不足有以下几种方式:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备。
  • NAT技术:能够让不同局域网中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
  • IPv6:IPv6用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版,其是互不相干的两个协议,彼此并不兼容,因此目前IPv6还没有普及。

7. 私网IP地址与公网IP地址

(1)若一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址:

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址

包含以上范围当中的,都被称为私网IP,其余的则被称为公网IP(或全局IP)

①连接云服务器时,连接的IP地址即是公网IP:

②可以使用ifconfig命令来查看博主这台机器的私网IP,其中网络接口lo(loop)代表的是本地环回,而eth0代表的就是博主机器的网络接口,可以看到私网IP地址是10.0.8.2:

由于使用的是腾讯云,因此这里的10.0.8.2是这台云服务器在腾讯内部的私网IP,可以看到这个IP正好在第一种私网IP范围内。

(2)数据是如何发送到服务器的?

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

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

LAN口的IP地址被称为LAN口IP,即子网IP;WAN口的IP地址被称为WAN口IP,即外网IP。

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址可以重复。
  • 每一个家用路由器,本身也是运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP。
  • 若希望自行实现的服务器程序,能够在公网上被访问,就需要把程序部署在一台具有外网IP的服务器上。

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

(3)为什么私网IP不能出现在公网中?

  • 不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机。
  • 但由于IP地址不足的原因,不能让主机直接使用公网IP,而让主机使用私网IP,因为私网IP可以重复也意味着可以在不同的局域网使用相同的IP地址,缓解了IP地址的不足。

(4)两个局域网中的主机进行通信必须通过公网

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

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

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

8. 路由

(1)数据"问路"过程是怎么样的?

  • 数据在路由的过程中,实际就是一跳一跳"问路"的过程。所谓"一跳"就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。


IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。

路由器的查找结果可能有以下三种:

  • 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
  • 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
  • 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。

(2)路由表查询的具体过程

每个路由器内部会维护一个路由表,可以使用route命令查看云服务器上对应的路由表:

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

(3)IP数据到达目的地址的具体过程:

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

9. 路由表生成算法

(1)路由可分为静态路由和动态路由:

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

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

相关推荐

  1. <span style='color:red;'>IP</span><span style='color:red;'>协议</span>

    IP协议

    2024-04-14 23:42:02      67 阅读
  2. <span style='color:red;'>ip</span> <span style='color:red;'>协议</span>

    ip 协议

    2024-04-14 23:42:02      29 阅读
  3. <span style='color:red;'>IP</span><span style='color:red;'>协议</span>

    IP协议

    2024-04-14 23:42:02      31 阅读
  4. 网络协议学习——IP协议

    2024-04-14 23:42:02       38 阅读
  5. TCP/IP协议

    2024-04-14 23:42:02       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 23:42:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 23:42:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 23:42:02       82 阅读
  4. Python语言-面向对象

    2024-04-14 23:42:02       91 阅读

热门阅读

  1. UE5+GIS技术应用场景介绍

    2024-04-14 23:42:02       33 阅读
  2. 7天八股速记之C++后端——Day 2

    2024-04-14 23:42:02       30 阅读
  3. leetcode热题HOT 207. 课程表(拓扑排序)

    2024-04-14 23:42:02       40 阅读
  4. 树莓派4B开发板安装Anaconda虚拟环境

    2024-04-14 23:42:02       34 阅读
  5. 博士找教职--经验贴

    2024-04-14 23:42:02       31 阅读
  6. 【备忘】composer国内镜像列表

    2024-04-14 23:42:02       37 阅读
  7. Linux下静态库与动态库使用总结

    2024-04-14 23:42:02       36 阅读
  8. RLHF实践问题记录

    2024-04-14 23:42:02       41 阅读
  9. Rust---模式(Pattern)匹配

    2024-04-14 23:42:02       29 阅读