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

【Linux网络】IP 协议详解:结构、地址与交付机制全面解析

IP协议的概念

IP协议:粗略的认为数据从主机A跨网络到主机B的能力,其中进行涉及到链路层的我们先不进行考虑,后续在进行将数据链路层知识模块进行完善细节后,在进行重构IP协议是如何具备数据从主机A跨网络到主机B的能力。

协议报头

协议报头各个字段之间的含义

  • 4位版本

只有IPV4和IPV6两种,但是IPV4和IPV6是互相不兼容的,一般进行使用IPV4的,二进制表示为0100

  • 4位首部长度

4位首部长度进行存储的是IP报头的长度,0000~1111,但是单位是以4字节为单位的,也就是说IP报头的长度是[ 0 , 60]。假如IP报头是以标准长度20字节为单位的,4位首部长度的值就是20/4=5,换成二进制是0101。

  • 8位服务类型

后面进行考虑

  • 16位总长度

用于记录IP协议报头(报文+有效载荷)的长度,表示整个 IP 数据报的总长度(包括报头和数据部分),单位为 字节。最大值为65535.

  • 8位协议

对于发送方:用于记录上层用的协议类型

对于接收方:进行匹配上层对应协议进行处理

  • 32位目的IP地址

既然通过IP协议就将数据从主机A进行跨网络进行传输到主机B,在进行将数据传输到指定主机是通过路由器的跳转进行的,路由器进行跳转时需要进行知道最终的目的地才能进行确定跳转路线,32位目的地址中存的信息就是进行最后跳转的网络的IP地址,通过进行找到目的IP地址才能在目的IP地址的网络中进行找到对应的主机,本质上目的IP地址是在帮我们进行缩小范围找到最后的目的主机。

  • 32位源IP地址

数据在网络中进行传输,需要进行知道数据的来源,当接收方主机进行接收到数据,需要进行知道是谁给我发的数据。

  • 8位生存时间

网络可能存在路由环路或错误配置,导致数据包在网络中无限转发。生存空间通过设定“最大跳数”强制终止此类数据包。限制数据包经过的路由器数量,避免过度占用网络资源。发送方为数据包设置初始TTL值(如Windows默认128,Linux默认64,路由器可能设为255)。逐跳递减:每经过一个路由器(即一跳),TTL值减1。

  • 16位标识(id):

唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个 id都是相同的.

  • 3位标志字段:

第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记.

  • 13位分片偏移:

是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片 在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报 文的长度必须是8的整数倍(否则报文就不连续了).

,关于分片

分片与组装  -- IP分片和组装不是主流情况

自己IP层进行分片,组装由对方的IP层进行组装

IP层是要将数据进行交给数据链路层的,但是通过数据链路层的以太网帧格式,进行接收网络层的数据必须是[ 46 , 1500 ]范围的,如果数据超过1500字节需要对数据进行切片,如果数据不超过46字节需要进行填充.

如何进行分片

将IP协议进行接收到传输层的数据进行分片,每个报文都要进行封装上IP报头

数据链路层是如何进行得知收到的数据是否是进行切片处理过的?

TCP报头中的3位标志中的第三个标志位用于进行记录,根据第三个标志位中的更多标志位是1,代表这是进行分片过的报文片段;如果更多分片是0,并且该片偏移大于0,代表是分片,否则不是.

如何进行判断分片是否丢失

当前其实位置+偏移量=下一个报文进行填充的偏移量

假如数据已经进行分片了,如何进行确定分片的顺序?

首先先进行确认哪个是第一个,哪个是最后一个,第一个标记为中的第三位是0并且偏移量为0,代表这个分片就是第一个分片,同样是第一个标记位中的第三位如果是1,则是分片中的最后一个,剩下的进行按照偏移量进行升序排序即可

如何进行确保合起来的报文时正确的

TCP/IP都有校验和0

通过上面进行分析

分片好吗?对tcp和udp包括IP本身有什么影响?

不好,进行分片会进行增加丢包率,每个报文在经过传输的过程中丢包概率是一定的,分片越多丢包率会越高.

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

通过四位首部长度进行计算出报头数据的大小,实现将报头数据和有效载荷的分离。

如何进行交付?

对于发送方来所通过8位协议进行标识网络层上方的传输层使用的什么协议对于数据进行封装,对于接收方来收,网络层进行去掉报头并进行分析报头,通过8位协议决定交给传输层的相对应的协议进行处理。

网段划分

IP=目标网络+目标主机

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

通过类比的方式进行介绍网段划分,下面的类比只是为了进行搭建框架,实际网络要比下面方式复杂的多

子网划分是什么?

故事情景引入

当张三捡到了一个钱包,钱包中只有一张破烂不堪的学生证,有效信息只有学号,张三想要进行通过自己进行查找到这个人是十分困难的,见人就问你的学号是不是xxxxxxx,询问两周无果后,张三脑袋一亮,想到了自己是有学院群的,学员群中的群主是该学院的学生会主席,张三直接将学号信息进行丢到学院群中,该学院的学生会主席看到了,进行分析学号数据,一看这不是电子信息工程学院的学生卡吗?将学号信息直接进行发送到各个学院的部长群,电子信息工程学院中的部长一看,这不是我们学院的人吗,然后将学号信息进行发送到对应的学院群,就找到了该丢失钱包的粗心学生。

进行建模:

上述每个学院的群称为局域网,每一个学院中的个体就相当于一台主机,每个学生会主席就充当路由器的身份,校学生会的群进行充当公网。这样就进行了简单的网络划分,称为子网划分。进行网络划分的一个重要优势就是进行查找某一个具体的个体可以通过排除批量数据的方法进行定位。

为什么要进行子网划分?

在计算机中,每一台主机也要隶属一个子网,为了方便进行通信时定位主机。

如何进行子网划分?

老方案 IP资源浪费

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同. 那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情. 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便. 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.

过去曾经提出一种划分网络号和主机号的方案, 把所有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

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就 分配完了, 而A类却浪费了大量地址; 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多. 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.

新方案

各个区域先进性申请,然后再区域内再进行通过运营商再进行分配

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号; 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾; 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号; 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关,这里的无关是相当于之前进行划分的类别的“子网掩码”是固定的,但是通过引入真正的子网掩码后,通过调整1的个数就可以进行比特位级别的子网划分,使得分配更加的灵活,提高的IP地址的利用率。

一般在一个子网中,管理子网中的IP的设备通常都是路由器,目标网络和子网掩码,子网中的主机都是由路由器进行管理,目标网络和子网掩码其实都是再路由器内进行配置的。

子网掩码是如何 进行子网划分的?

特殊IP地址

将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;

  • 当设备无法通过DHCP获取IP时(如无路由器环境),自动分配临时地址。

  • 仅限同一物理链路内的通信(如两台电脑直连传文件)。

127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

IP地址不够问题

IP地址的理论上限和实际情况

理论总量:IPv4为32位地址,总数为 232≈43232≈43 亿。

实际可用量更少

特殊类IP地址存在的影响

特殊类IP是不用于全球公网路由的地址段。它们的核心用途是满足特定场景的内部通信需求,而非直接访问互联网。

实际可用公网IPv4地址约 37亿,但因历史分配和区域划分(如A/B/C类地址),利用率更低。

IP地址分配机制的影响 

按网卡而非主机分配:一台主机若有多个网卡(如服务器、路由器),每个接口均需独立IP

路由器通常需多个公网IP

广域网,局域网,公网,内网区分与联系

一、按覆盖范围划分:广域网(WAN) vs 局域网(LAN)

特性广域网(WAN)局域网(LAN)
覆盖范围大范围(跨城市、国家、全球)小范围(家庭、办公室、校园等)
传输介质光纤、卫星、运营商专线等网线、Wi-Fi、蓝牙等
所有权由ISP(互联网服务商)或企业联合管理由单一组织或个人管理
典型应用互联网、企业跨区域网络、云服务家庭网络、办公室文件共享、本地打印服务
延迟与带宽高延迟、带宽成本高低延迟、带宽成本低

联系
局域网(LAN)是广域网(WAN)的组成部分。例如,家庭路由器连接的设备组成一个LAN,再通过路由器的WAN口接入ISP的广域网,最终连接互联网。


二、按访问权限划分:公网(Public Network) vs 内网(Private Network)

特性公网(Public Network)内网(Private Network)
IP地址全球唯一的公有IP(如8.8.8.8私有IP(如192.168.x.x10.x.x.x
访问权限可被全球设备直接访问仅限内部设备访问,需NAT/代理访问公网
管理主体ISP或互联网管理机构分配由本地网络管理员分配
安全性暴露风险高,需防火墙保护天然隔离,安全性较高
典型场景互联网网站、云服务器家庭内网、企业内部办公网

联系

  • 内网通过NAT(网络地址转换)与公网互联。例如,家庭路由器将内网的私有IP(如192.168.1.100)转换为公网IP访问互联网。

  • 公网是多个内网互联的桥梁,广域网(WAN)通常依赖公网基础设施。

私有IP地址和公网IP地址

10.*,前8位是网络号,共16,777,216个地址

172.16.到172.31.,前12位是网络号,共1,048,576个地址

192.168.*,前16位是网络号,共65,536个地址

  • Class A10.0.0.0 ~ 10.255.255.255(支持超大型内网,如企业集团)。

  • Class B172.16.0.0 ~ 172.31.255.255(中型网络,如学校、分支机构)。

  • Class C192.168.0.0 ~ 192.168.255.255(小型网络,如家庭、办公室)。

包含在以上这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

数据从局域网通过路由器进行内网的层层传递,将数据进行交给服务器,但是进行发送数据的主机是使用的私有IP进行的,也就是说源IP地址是私有IP,服务端将数据进行处理后,由于不知道源IP在哪,无法将数据进行返回。

解决上述窘境

数据通过路由器进行路由时通过改变数据的源IP,将源IP改成路由器的LAN口IP,当服务器收收到数据时,就知道将消息进行处理过后应该交给哪个路由器,这种称为源IP WAN口替换技术

补充:

这里需要解释运营商的资源分配策略,企业用户通常需要固定公网IP来托管服务,而普通家庭用户可能不需要,因此运营商优先将公网IP分配给有需求的客户,降低成本。

在进行发送过程中,通过路由器进行路由向目标主机进行数据的路由是怎么做到的?

数据包交给统一子网下的路由器,路由器根据目的IP进行遍历路由器表,将目的IP和依次和每个条目的子网掩码进行按位与,然后与同一条目Destination进行比较,如果相同则直接通过相对应的接口进行交给对应的路由器,如果不同,则继续进行遍历,直至遍历到最后,Destination为default是,路由器直接将这个数据包进行交给默认网关,默认网关就是设备发送数据到外部网络时的第一跳,通常是路由器的内网IP地址,由另一个路由器进行上述操作知道进行找到目的网络。

http://www.xdnf.cn/news/1111465.html

相关文章:

  • 算法第三十一天:贪心算法part05(第八章)
  • Qt 多线程编程:单例任务队列的设计与实现
  • 【数据结构初阶】--顺序表(二)
  • 【读书笔记】《C++ Software Design》第一章《The Art of Software Design》
  • 【一起来学AI大模型】RAG系统组件:检索器(LangChain)
  • Python 实战:构建可扩展的命令行插件引擎
  • 试用了10款翻译软件后,我只推荐这一款!完全免费还超好用
  • 挖矿病毒判断与处理 - 入门
  • DBeaver连接MySQL8.0报错Public Key Retrieval is not allowed
  • Redis集群会有写操作丢失吗?为什么?
  • 1. 好的设计原则
  • C++法则21:避免将#include放在命名空间内部。
  • 箭头函数(Arrow Functions)和普通函数(Regular Functions)
  • 【JVM|类加载】第三天
  • 《汇编语言:基于X86处理器》第7章 整数运算(3)
  • AI:机器人未来的形态是什么?
  • 商业智能(BI)系统深度解析
  • 希尔排序和选择排序及计数排序的简单介绍
  • 【学习笔记】Nginx常用安全配置
  • QWidget的属性
  • 华为业务变革项目IPD基本知识
  • 前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)
  • 一文理解缓存的本质:分层架构、原理对比与实战精粹
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • 多模态大模型》多模态基础模型》多模态对齐、融合和表示
  • 27. 移除元素
  • 浅谈 Python 中的 yield——yield的返回值与send()的关系
  • 关于数字签名
  • 容器化改造避坑指南:传统应用迁移K8s的10个关键节点(2025实战复盘)
  • 【Go + Gin 实现「双 Token」管理员登录】