当前位置: 首页 > news >正文

【网络编程】详解 IP 协议:报头字段、路由器功能、网段划分和分片传输


请添加图片描述


半桔:个人主页

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

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

文章目录

  • 前言
  • 一. IP的报头字段
  • 二. 路由器的作用
  • 三. 网段划分
  • 四. IP分片发送

前言

在互联网时代,数据的高效传输依赖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地址划分为5类,将每类的网络号和主机号的区域直接定义出来,再通过IP地址前面二进制中第一个为0的位置来看是哪一类IP地址。

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

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

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

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

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

请添加图片描述

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

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

上述的方法减少了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滑动窗口中的分段发送。

http://www.dtcms.com/a/469816.html

相关文章:

  • 大模型微调 SFTTrainer 数据处理与训练器配置解析(116)
  • gtest简单应用
  • 访答知识库,企业知识库,访答浏览器,Al编辑器,RAG,Pdf转word。个人知识库,访答RAG,云知识库,私有知识库……
  • 通过企业画册宣传_网络网站建设_新闻媒体合作等方式_企业营销网站制作
  • BERT相关知识自测
  • 【完整源码+数据集+部署教程】 真菌孢子图像分割系统源码&数据集分享 [yolov8-seg-convnextv2等50+全套改进创新点发刊_一键训练
  • 遵义市网站制作如何申请域名网站注册
  • GitHub 热榜项目 - 日榜(2025-10-11)
  • MySQL数据库之DBA命令
  • 4.打造个人Z-Library镜像
  • CoRL-2025 | 物体相对控制赋能具身导航!ObjectReact:学习用于视觉导航的物体相对控制
  • 长春seo网站优化做企业网站接单
  • word超链接网站怎么做网站建设网页设计网站模板
  • spring boot 整合 activiti 教程
  • 免费网站电视剧下载不支持下载的视频怎么保存下来
  • 接口自动化测试流程、工具与实践
  • 【C++继承】深入浅出C++继承机制
  • Mysql杂志(三十一)——Join连接算法与子查询、排序优化
  • HashMap - 底层原理
  • Python第二次作业
  • Vspy使用教程
  • 通用网站模板网站备案要幕布照
  • 网站三要素关键词 描述怎么做青海项目信息网官网
  • JavaScript学习笔记(二十八):JavaScript性能优化全攻略
  • mooc自动互评脚本笔记---2025年10月11日
  • 什么是语言模型
  • 免费网站正能量不用下载网站程序是什么?
  • 海外住宅IP的分类方式
  • wpf之ToggleButton控件
  • 【传奇开心果系列】基于Flet框架实现的文件选择文件保存和目录选择的样例自定义模板特色和实现原理深度解析