【Linux】IP协议

目录

一、IP协议的概念

二、IP协议的报头

(一)IP协议报文的封装、解包和分用

(二)8位生存时间

(三)IP分片

三、IP协议的网段划分

(一)为什么需要网段划分

(二)划分方法

1、基于IP地址分类的静态划分

2、动态子网划分CIDR

四、特殊的IP地址

五、解决IP地址的数量限制

六、公网IP与私有IP

(一)NAT技术

(二)NAPT技术

(三)NAT技术的缺陷

七、路由及路由表


一、IP协议的概念

        IP协议是互联网中的核心协议,属于TCP/IP体系中的网络层协议,其核心功能是是实现异构网络的互联互通,通过统一的规则解决不同物理网络之间的通信问题。

        IP地址为目标网络中的一台目标主机的逻辑地址,其主要解决异构网络中网络互联时的寻址问题。

二、IP协议的报头

版本:标识 IP 协议版本;

首部长度:标识 IP 首部长度(单位4字节),无选项时最小为5;

服务类型:定义数据报优先级和服务质量,如低延迟、高吞吐量;

总长度:整个IP数据包的总字节数;

标识:唯一标识数据报,用于分片重组;

标志:第一位保留、第二位DF用于表示是否禁止分片、第三位MF用于表示更多分片;

片偏移:分片数据在原数据包中的偏移量;

生存时间:限制数据包经过的最大路由器跳数;

协议:用于表示上层协议类型;

首部校验和:校验 IP 首部完整性;

源IP地址:发送方的 IPv4 地址;

目的IP地址:接收方的IPv4地址;

选项:可选扩展功能,现代网络极少使用;

数据:承载的上层协议数据;

(一)IP协议报文的封装、解包和分用

        当上层应用层的数据交付给网络层时,由操作系统在该数据前封装 IP 协议首部并填写相应的内容完成封装。

        当网络层收到数据链路层交付的数据时,首先会读取第1个字节的低4位获取4位首部长度字段,再读取IP协议首部中16总长度字段获取整个报文长度(暂不考虑IP分片),其中4位首部长度单位为4字节,而16位总长度字段单位为1字节。当获取到首部长度和总长度后即可获取数据长度,即可完成解包。

        通过IP协议首部的8位协议则可知道将数据交付给上层具体哪个协议进行数据处理。

(二)8位生存时间

        在网络传输中,报文一旦发出便不再受主机的控制,报文会在一一个个路由器中进行传递,而报文传输的路径选择也由路由器控制。因此如果某些网段中路由器出现些问题可能会导致报文传输出现环路转发等问题,如果没有生存时间字段,那么这条报文会一直在环路中转发,消耗网络资源。

        因此引入生存时间,实际是规定了IP数据报最大跳数,与时间无关,也就是经过路由器的最大个数,当该字段减少至0时会被路由器丢弃掉该报文.一般Linux下该字段默认值为64.

(三)IP分片

        在上节传输层我们提到TCP协议的滑动窗口中,并不是一股脑地把窗口内的数据一次性全部发送出去,因为下层数据链路层MAC帧的最大帧长度为1500字节,因此向下交付的数据不能过大。

        那么如果传输层依然向网络层发送了很大的数据段,而传输链路层的数据帧数据部分最长1500字节,那么中间的网络层应该如何做呢?

        面临以上情况,作为中间人的网络层实际采取的行为是:将上层交付的数据进行分片,当数据大小满足下层数据链路层的要求后即将数据交付给下层。

        那么IP协议如何将报文进行分片呢?

        除了将数据进行分割以外,还需要依靠IP数据报首部的16位标识、3位标志和13位片偏移字段。

        当传输层交付的数据过大需要进行分片时,IP层首先将数据进行分割并填写相应的报头信息,其中被原始的数据报分配唯一的标识位,所有分片继承该标识,除了最后一个分片外,其他分片的标志位中的MF = 1,最后的标识位置0。置1表示后续还有分片,而置0表示后续没有分片即该数据报为最后一个分片。在分片的同时也需要填写片偏移大小,该字段用于表示该数据报的数据原处分配前数据的起始位置,其中除了最后一个分片以外,其他的分片的偏移量必须是8的整数倍。

例如:IP层收到数据3000字节,假定MTU(MAC帧最大长度)为1500字节,那么IP应该进行分片呢?

        首先MTU是指得是MAC帧的数据部分最大为1500字节,而其数据 = IP首部 + IP数据,假定IP首部就为20字节,那么第一片IP数据报数据部分最大为1480字节,剩余1520字节,同样的,数据部分最高1480字节,因此第二片数据大小也为1480字节,剩余40字节为第三片数据部分大小。因此分片后的第一片MAC帧数据大小为1500字节(20+1480),第二片也同样为1500字节(20+1480),最后的大小为60字节(20+40)。

        那么如何确认收到的报文是不是被分片后的报文?如何确定收到的报文是否完整呢?假如接受完整了那么如何将所有的IP分片组装起来呢?

        当收到一个报文时,查看标志位的MF是否为1,若为1则说明该报文进行过分片操作并不是完整报文,若为0则需要查看该报文的偏移量,若偏移量不为0则说明该报文是被分片后的最后一个IP报文,若为0则说明该报文本身是个完整的报文;

        当收到报文时,通过以上步骤即可验证该报文是否被分片,若没有进行分片该报文本身就是一个完整报文,若该报文进行过分片,需等到最后一个报文的到达。偏移量为数据处原始数据的起始地址,其中偏移量以8字节为单位,也就是IP报文起始地址(偏移量 * 8) + IP报文的数据部分长度 = 下一片IP报文的起始地址。因此当收到最后一个报文后,只需要将各个报文按偏移量大小进行排序,验证各个相邻报文之间的是否连续即可判断收到的所有分片报文是否完整。

        再保证收到的分片报文完整后,只需要按照偏移量大小排序后进行解包组装后交付上层即可。

三、IP协议的网段划分

        IP地址共32位,分为两个部分,网络号和主机号。

网络号:保证相互连接的两个网段具有不同的标识;

主机号:在同一网段内,主机之间的网络号相同,因此必须需要不同的主机号用于标识主机

(一)为什么需要网段划分

        现如今入网的主机非常多,如果不进行子网划分的话,我们只能通过遍历去寻找目标主机,非常困难,进行网段划分将大型网络拆分为多个较小且相互逻辑隔离的子网,通过查询子网的网络号可以快速识别目标主机是否在该子网内,便于查找。此外进行网段划分也能提高IP地址的利用率,方便管理。

(二)划分方法

1、基于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

        该方法为传统方法,随着互联网的发展,这种划分的方案的局限性就体现提出来了。例如当选用B类地址时,主机号为8位,也就是一个子网内最多可以有2^16 - 2个主机(主机号全0为网络号,全1为广播地址),但实际在使用时一个子网内可能并没有这么多台主机从而导致了大量的IP地址被浪费掉,因此引入了新方案——动态子网划分。

2、动态子网划分CIDR

        引入一个额外的子网掩码来区分网络号和主机号。

  • 子网掩码是一个32位的正整数,通过用一串“0”来结尾;
  • 将IP地址和子网掩码进行按位与操作得到的结果就是网络号;
  • 使用该方法进行划分便与静态划分无关。

        通过子网掩码灵活定义网络号和主机号的边界。

        对于一个子网来说,子网掩码二进制位下最低位的1及其以前为该子网的网络号,最低位的1以后为主机号。

        IP地址 & 子网掩码 = 该地址的网络号。

        例如IP地址为 140.252.20.68,子网掩码为255.255.255.0,因此该地址的网络号为140.252.20.0。

        在IP报文传输的过程中,可以通过该报文的目的IP地址与路由器中各个条目的子网掩码相与快速得出该报文的发送路径,通过以上操作可以得到该目的IP地址的网络号,若与条目中的网络号相同则确定了该报文的发送路径,在实际中若多个条目符合以上要求则选择最长掩码条路作为选择的路径。

四、特殊的IP地址

  • 将IP地址中的主机地址全部设置为0,即可得到该主机所在网段的网络号;
  • 将IP地址中的主机地址全部设置为1,即可得到该主机所在网段的广播地址,用于给同一个链路中互相相连的所有主机发送数据包;
  • 127.*的IP地址用于本地环回测试,通常是127.0.0.1

五、解决IP地址的数量限制

        IP地址是一个4字节32位的正整数,即使全部都作为IP地址,那么也只有2^32次方个IP地址,而想接入网络就必须拥有IP地址,随着互联网的发展,IP地址出现了不够用的问题。因此还需要采取一些措施:相比于静态划分IP地址,动态划分IP地址一定程度上缓解了IP地址不够用的问题,但仅是如此IP地址的使用依然很紧张,

  • 动态分配IP地址:只给接入网络的设备分配地址,也就是当一台设备离线以后IP地址被回收。因此同一台设备每次接入互联网中,得到的IP地址不一定相同;
  • NAT技术:利用公网IP和私有IP大大缓解了IP地址不够用的问题;
  • IPv6:以上我们提到的IP地址是IPv4地址,而IPv4使用16字节128位来表示IP地址,IP地址并不是IPv4的简单升级,这是两个互不相干的协议,彼此不兼容。

六、公网IP与私有IP

        公网IP指的是在互联网(公网)上全局唯一的IP地址,一般用于直接连接互联网的设备;私网IP用于局域网内的设备通信,由路由器或网络管理员分配,仅在网络内部唯一。
        如果一个机构内部组建局域网,那么这个网络内部的私有IP地址只用于局域网内通信,无法直接连接至公网上的设备。因此需要一个设备完成公网IP和私有IP的转换——NAT技术,一般这个设备都是路由器。

        一般私有IP需要遵循以下规则:

1、10.*,前8位是网络号,共16,777,216个地址 (企业级路由器使用)

2、172.16.到172.31.,前12位是网络号,共1,048,576个地址 (企业级路由器使用)

3、192.168.*,前16位是网络号,共65,536个地址(家用路由器使用)

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

 

  1. 不同的网段之间的转发全靠路由器,所有路由器这种设备隶属于多个网段。路由器也相当于一台主机,拥有独立的IP地址,并且一个路由器可以拥有多个IP地址;
  2. 子网(局域网)内的主机号不能重复;
  3. 在一个子网中,管理子网中的IP设备通常时路由器,通过DHCP,路由器可以给子网内的新增主机节点分配IP地址;

(一)NAT技术

        在上一小节我们提到了IPv4地址数量不足的情况,而NAT技术就是解决IP地址不够用的主要手段,这是路由器的一个重要功能。

  • NAT技术能够将私有IP对外通信时转为全局IP,也就是一种将私有IP和全局IP相互转化的技术方法;
  • 全局IP要求唯一,但是不同局域网中可以出现相同的私有IP,但在同一局域网内私有IP唯一。

        下图是私有IP转换为公网IP进行通信的过程:

        在局域网中,作为公网入口的路由器,其WAN口通过ISP(互联网服务提供商)分配的公网IP地址与外部网络通信,而LAN口则通过私有IP地址(如192.168.x.x)管理内部网络设备,并通过NAT技术实现内外网数据转换。

        客户端根据本地路由表规则,将所有目标IP不属于局域网(如10.0.0.0/24)的数据包直接发送至默认网关(即NAT路由器的LAN口IP)。NAT路由器收到局域网中需要发送的数据包后,基于目标IP查询路由表,确认需通过WAN口转发后,会将该数据包的源IP地址替换为NAT路由器的WAN口IP地址并发送数据包。由此便完成了私有IP到公网IP的转换,也完成了局域网向公网中设备的通信。

        以上的过程是局域网中的主机向公网中的设备进行通信时的地址转换,那么公网中的设备如何向局域网中的主机发送数据呢?NAT路由器收到公网的数据包如何知道该数据包是发送给局域网中的哪一台主机呢?因此还需要NAPT技术。

(二)NAPT技术

        当局域网内的多台主机通过NAT路由器向公网上的服务器发送数据后,那么对于服务器回送的数据中,其目前IP地址都是NAT路由器的WAN口地址,NAT路由器如何区分这些数据包是发送给局域网中的哪台主机呢?因此仅仅靠IP地址替换是无法完成公网IP和私有IP的相互转换的。

        因此引入了NAPT技术,使用IP地址+端口号来建立映射关系。

        相较于NAT技术,实际NAT路由器还会维护一张互为键值的转换表,其是私有IP与端口和公网IP和与端口的相互映射。

        当局域网中多台主机需要与公网上的设备进行通信时,多态主机的数据包经过NAT路由器时,路由器基于目标IP查询路由表,确认需通过WAN口转发后,执行NAT转换并发送数据包。NAT路由器不仅仅只替换数据包的源IP地址,还会将数据包的端口号替换随机一个端口号并记录映射关系。而对于公网服务器回送的数据包,通过查询NAT表再将目的IP地址和目的端口号还原为局域网内IP地址和端口号后再发送给局域网内的主机,完成公网IP和私有IP的相互转换。

(三)NAT技术的缺陷

无法从NAT外部向内部服务器建立连接;

转换表的生成、维护和销毁都需要额外开销;

通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开。

七、路由及路由表

        路由是指数据报从源地址到目的地址传输路径选择的过程,其本质是网络层的寻址和转发机制。路由器通过分析数据包中的目的IP地址,结合路由表动态选择最优路径,将数据包逐跳转发至目的网络和主机。

        因此IP数据报的发送路径实际是由路由表决定的,在Linux环境下可以使用route命令查看路由表。

[X@VM-8-8-centos ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.0.8.0        0.0.0.0         255.255.252.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0
  • Destination:目标网络或主机的地址;
  • Gateway:数据包转发至的下一跳地址;
  • Genmask:子网掩码;
  • Flags:路由状态标志;
  • Metric:路由的优先级数据,数值越小优先级越高;
  • Ref:路由引用次数(Linux未使用)
  • Use:路由被查找的次数;
  • Iface:数据包发出的网络接口。

下面是简化后的路由表:

目的网络子网掩码下一跳地址物理接口
192.168.32.0255.255.255.19210.1.1.1eth1
192.168.32.0255.255.255.010.1.1.2eth2
192.168.32.0255.255.224.010.1.1.3eth3
0.0.0.0/0默认路由203.0.113.1eht0

        当我们收到一个目的IP位 192.16.32.100 的数据包。

将目的IP与每个路由条路的掩码进行按位与运算:

        1、255.255.255.192 & 192.16.32.100 = 191.168.32.64 不符合条目的目的网络;

        2、255.255.255.0 & 192.16.32.100 = 192.168.32.0 符合条目的目的网络;

        3、255.255.224.0 & 192.16.32.100 = 192.168.32.0 符合条目的目的网络;

        因为条目2和3都可以满足条件,但条目2的掩码长度更长,因此选择条目2的物理接口作为发送接口。

        路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由),例如距离向量算法, LS算法, Dijkstra算法等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41712.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作,帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现: 甲骨文是我国目前已知的最早成熟的文字系统,它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值,不仅对中国文…

【深度学习的数学】导数

导数的定义。好像是从极限开始的。比如说,函数f(x)在点xa处的导数,就是当h趋近于0时,[f(ah) - f(a)]除以h的极限,对吧?公式应该是这样的:f’(a) lim_{h→0} [f(ah) - f(a)] / h。这个极限如果存在的话&…

word文件转换为Markdown格式

目录 一、前言1.1、poi-ooxml、docx4j、aspose-words对比二、poi-ooxml技术实现一、前言 顺应时代技术的变更及高效协同理念的影响,非结构化信息展示、存储、应用等也由传统文档向在线协同文档的演变,类似腾讯在线文档。   目前大多数在线文档支持的是Markdown格式,因此这…

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline:端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE(Variational AutoEncoder)图像尺寸与 UNet 和 VAE 的关系EMA(Exponential Moving…

langserve搭建方法

文章目录 安装 langserver安装 langchain-cli创建langserve脚手架使用poetry管理包 安装 langserver pip install langserve安装 langchain-cli pip install langchain-cli创建langserve脚手架 langchain app new 项目名后续交互界面全回车,接着cd到 项目名 目录…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机(链路层)mac地址表的数据转发路由器(网络层) ip路由表的数据转发 隔离广播域…

mysql高级,mysql体系结构,mysql引擎,存储过程,索引,锁

1.mysql体系结构 1) 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作…

Unity高清渲染管线

Unity高清渲染管线——1 unity高清渲染管线是渲染管线的一种,在看完《创造高清3D虚拟世界》这本书的前两章以及第三张第二小节后终于对unity的高清渲染管线也是有了一个初步的认知,以下是我个人理解仅作参考: unity高清渲染管线项目模板比起…

Python基础语法元素(学习笔记)

实例1:温度转换 # TempConvert.py #为单行注释 多行注释为: 这里写内容 TempStr input("请输入带有符号的温度值:") if TempStr[-1] in [F,f] :C (eval(TempStr[0:-1])-32)/1.8print("转换后的温度是{:.2f}C".format(C)) e…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持,其中包括两个重要的函数:std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具,而 TensorBoardX 是其社区驱动的替代品,支持 PyTorch 等其他框架。以下是它…

flutter-实现瀑布流布局及下拉刷新上拉加载更多

文章目录 1. 效果预览2. 结构分析3. 完整代码4. 总结 1. 效果预览 在 Flutter 应用开发中,瀑布流布局常用于展示图片、商品列表等需要以不规则但整齐排列的内容。同时,下拉刷新和上拉加载更多功能,能够极大提升用户体验,让用户方…

【day2】数据结构刷题 栈

一 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

YAML是什么?

YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析: 1. 定义与历史演变 全称与定位: YAML的全称最初为“Yet…

熔断降级(Sentinel解决)

问题概述 在微服务架构中一定要预防微服务雪崩问题,微服务雪崩问题就是指在微服务架构中,当一个服务出现故障时,由于服务之间的依赖关系,故障可能会传播到其他服务,从而导致了大规模的服务失败,系统无法正…

反序列化漏洞

前提概要 本文章主要用于分享反序列化漏洞基础学习,以下是对反序列化漏洞的一些个人解析,请大家结合参考其他文章中的相关信息进行归纳和补充。 反序列化漏洞描述 反序列化漏洞是指程序在对输入的字节流进行反序列化时,因缺乏充分的验证和过…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…

STM32学习笔记之存储器映射(原理篇)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…