mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

请添加图片描述


半桔个人主页

个人专栏: 《网络编程》《手撕面试算法》《C++从入门到入土》

我们大部分时间都在害怕失败与拒绝,但后悔或许才是最该害怕的事。 -特雷弗·诺亚-

前言

在互联网时代,数据的高效传输依赖IP协议这一网络层核心基石。

IP协议的运行涉及多个关键环节:

  1. IP报头字段为数据包提供路由与传输的控制信息;
  2. 路由器如同网络“枢纽”,建立不同网络的互联互通;
  3. 网段划分平衡了IP地址管理与通信性能;
  4. IP分片发送则应对了跨网传输的MTU(最大传输单元)差异障碍。

本文围绕这些核心主题展开,助力读者清晰理解IP协议的工作机制与网络通信的技术逻辑。

一. IP的报头字段

在网络协议栈中:传输层保证了数据传输的可靠性,像TCP协议中通过种种策略来保证数据可靠的传输,而网络层给出了一种能力,让操作系统能够将数据发送到网络中,从A主机送到B主机上。

下面我们先介绍以下IP报头中的各个字段:
以下是报头的示意图:
请添加图片描述

首先介绍几个先对不太主要的字段:

  1. 4位版本号:用来表示采用的IP协议是哪一个版本的,现在主流的就是IPv4和IPv6,对于IPv4要填写0100(二进制),对于IPv6要填写0110;
  2. 8位服务类型:表示数据传输时,选择的路径方式:最小延迟,最大吞吐量,最小成本,最高可靠性;
  3. 8位生存时间:表示要将报文送到目标主机需要的最大报文跳数;依据该字段可以保证数据包不会因为一些原因,像硬件异常,软件故障,路由器配置错误等原因,导致报文在网络中无限转发;
  4. 16位首部(头部)校验和:用来检验接收到的IP报文是否完整。

接下来就是,IP报头中通过什么字段保证报头与有效载荷进行分离的:

  1. 4位首部长度(报头长度):表示报头 + 选项以及后面填充字段的总长度,单位是4字节
  2. 16位总长度:表示整个报文的总大小;

通过固定长度 + 自描述字段来让IP报文的报头与有效载荷进行分离。

IP报头怎么知道将自己的有效载荷交给上层的哪一个协议?

  1. 8位协议号:用来表示将自己的有效载荷将给上层的哪一个协议。

源IP和目的IP就不用说了。

关于第二行中的三个字段,在后面“IP分片发送”中进行介绍。

二. 路由器的作用

在进行跨网段传输的过程中,路由器是不可缺少的,也是家庭联网的必备设备;下面对路由器的特性进行以下详细介绍。

  • IP地址包含两个部分:网络号 + 主机号;

网络号:保证相连的两个网段具有不同的标识;
主机号:保证在同一个局域网中的主机(联网设备)具有唯一的标识。

路由器的作用的负责连接两个或多个相邻的子网

  1. 路由器本质上也是子网中的一台主机,也需要进行IP地址的配置,路由器一般是一个子网中的第一台联网设备,因此其IP地址形式上是:网络号.1
  2. 路由器要能够连接两个甚至多个子网,说明路由器一定包含两个或多个IP地址(许可简单理解为路由器中有多个网卡);
  3. 路由器不仅仅能对IP报文从一个局域网转发到另一个局域网,并且路由器还负责对子网的构建工作
    关于这三点,在后续内容中会详细解释其原因。

三. 网段划分

在前面我们说过IP地址 = 网络号 + 主机号;

  • 不同的子网其实就是把网络号相同的主机放到一起;
  • 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复;

经过合理设置主机号和网络号,就能够保证在相互连接的网络中,每台主机的IP地址都不相同。

但是手动管理子网内的IP,是一个相当麻烦的事情,有一种工艺叫做DHCP,能够自动的给子网内新增主机节点分配IP 地址,避免了手动管理 IP的不便。一般的路由器都带有 DHCP 功能。因此路由器也可以看做一个DHCP 服务器。

那么IP地址是如何进行划分的呢,那些位标识网络号,那些位又表示主机号???

对于IP的划分早期是采用分类划分的方法:
请添加图片描述

哪一类IP地址。就是直接将IP地址划分为5类,将每类的网络号和主机号的区域直接定义出来,再通过IP地址前面二进制中第一个为0的位置来看

对于IPv4使用4个字节也就是32个比特位来表示一个IP地址,最多可以又43亿多个IP地址,在当今社会中这种数量的IP地址是不够用的,缘于每一个联网设备都要求分配一个IP地址。

在上图中将,网络号与主机号分配死,就会导致一个子网在选择了IP类型后,其中的联网设备的个数就是确定的了,如果子网中设备增加就需要重建子网,如果子网中的主机号比较少,使用不完IP地址就会导致IP地址被浪费,现在IP地址就不够用,还有浪费这是不可容忍的。

此时就出现了另一种划分方式,是对上面划分方式的一种优化:

引入子网掩码来区分网络号和主机号。

子网掩码:是一个32位的整数,通常用一串"0"结尾。
将IP地址和子网掩码进行“按位与”操作得到网络号,具体操作看下图:

请添加图片描述

经过子网掩码就可以实现将:网络号与主机号进行分离。子网掩码行对IP地址进行任意划分,这也就可以实现对一个子网中的主机的个数进行任意划分,根据子网中主机的个数动态的划分IP地址,减少IP地址的浪费。

1;就是一般子网掩码的写法是:ip/n表示子网掩码的前n个比特位

上述的方法减少了IP地址的浪费,但是43亿的IP地址随着社会的发展,联网设备越来越多还是不够用,因此我们需考虑如何克服IP地址不足的问题:

  1. IPv4地址不足关键是因为利用的比特位比较少,可以采用IPv6用128个比特位来表示一个IP地址,我国的IPv6技术在全球上是最领先的;但基于IPv4使用时间比较长,有很大区域/国家并没有转而使用IPv6;
  2. 动态分配IP地址:只给接入网络的设备给出IP地址,对于没有接入网路的设备不献出IP地址;
  3. NAT技术,关于NAT工艺,将在后面的内容链路层的文章中详细介绍。

四. IP分片发送

  • 在局域网通信中,大家主机在进行发送,其他主机也有可能在进行发送,这就有可能导致数据碰撞,导致素材丢失或数据不完整。而如果一个报文越大,发送主句碰撞的几率就越大;
  • 我们的IP保证向下交互,交给数据链路层,由数据链路层进行发送。

因此数据链路层就要求:上层不能给我交互太大的报文

因此要是网络层,TCP,UDP交给IP传输层的数据包太大,IP层要进行分片发送。对方的IP层接收到报文后,再进行组装,组装完成后交给上层。

如果IP层进行分片,对方IP层怎么知道,那些IP分片属于一个IP报文???

此时就必须IP报头中特定字段的实现:

  1. 16位标识:对每一个不同的IP报文进行编号,16位标识一样的分片属于同一个IP报文;

说对方怎么将其组装起来???就是每一个IP分片在网络中传输的速度是不一样的,那么对方怎么知道分片的先后顺序,也就

  1. 13位片偏移:当前分片对于整个IP报文起始位置的偏移量。

IP报文的最后一个分片???就是对方接收到多个IP分片,能够对其进行排序了,但是怎么知道后面还有没有报文,换句话说就是对方IP层,怎么知道哪一个

  1. 3位标识:第一位已经被废弃了,不进行利用;第二位标识该报文是否进行了分片,即是一整个报文,还是一个报文的一部分,0标识是;第三位,结束标识,只是报文是最后一个小包,0标识是。

怎么报文所有小包聚集在一起,即如果中间有一个小包丢失了,对方IP网络层知道吗???

  1. 第一个报文丢失:所有小包中没有片偏移为0的报文;
  2. 中间位置丢失:在将小包进行排序完的时候,比较所有小包的和(除去最后一个小包)与最后一个小包的片偏移量是否一样,假设不一样,则由丢失;
  3. 最后一个报文丢失:所有接收到的报文中没有3位标识的第三位位0的。

尽管IP可以对IP报文进行分片,但是我们并不建议这种分片的执行。

因为倘若一个分片丢失了,要对所有的分片进行重发,这样就一定会导致对于对方本来已经接收到的资料也要进行重发,使得效率降低。

因此我们一般建议不再网络层进行分片,而是在传输层就对要发送的数据进行分片划分操作,比如TCP滑动窗口中的分段发送。

posted on 2025-11-06 14:54  mthoutai  阅读(7)  评论(0)    收藏  举报