

**前引:**在Linux内核的网络子系统中,IP协议承担着"承上启下"的关键职责:向上接收传输层(TCP/UDP)的数据包,为其添加地址与路由信息;向下将数据包交付给链路层(以太网等),完成物理传输的适配。当一个数据包从应用层发出,它会先经过TCP封装,再进入IP层被打上"源IP""目的IP"的标签,随后通过路由表计算出最优路径,最终通过网卡发送出去。这个过程中,IP地址的分配、路由的选择、数据包的分片与重组,每一个环节都直接影响Linux网络的稳定性与性能。对于运维人员来说,理解IP协议是排查网络丢包、延迟问题的核心;对于开发人员来说,掌握IP协议的细节能让网络程序更适配Linux环境。本文将聚焦Linux场景下IP协议的核心机制,结合实际案例解析其应用与优化思路!
目录
【一】IP协议
在上面我们已经学习了应用层:HTTP、HTTPS协议。传输层:TCP、UDP协议。而传输层协议我们通过特性可以很清楚的知道它用于对数据的拿取和发送,相当于寄件人和收件人,那中间的快递员其实是网络层的IP协议,用户实现两台主机之间的数据传送!

【二】报文格式

(1)四位版本号
对于IPV4来说就是4
(2)四位首都长度
用来描述报头的单位,每个单位是4个字节
(3)8位服务类型
比如最大吞吐量、最小延迟、最高可靠性....一般只能选一个
(4)16位总长度
整个报文的大小,以字节为单位
(5)16位标识
"在IP分片详谈"
(6)3位标识
"在IP分片详谈"
(7)13位片偏移
"在IP分片详谈"
(8)8位生存时间
数据包的最大跳数,没经过一个路由器,减1,防止路由器错误占用网络资源
(9)8位协议
表示上层协议的类型,比如TCP协议、UDP协议...
(10)16位首部检验和
使⽤CRC进行校验,来鉴别头部是否损坏
【三】网段划分
(1)什么是网段划分
网段划分就是将一整个互联网划分为更小的网络区域,提高查询效率,方便管理,比如A区、B区、C区...再在每个区域在进行划分,形成许多的子网。比如A区.四栋.三楼.999------A区的四栋楼,三楼的999号房间
(2)如何进行"网段划分"
这里要引入两个概念:
网络位:保证相互连接的两个⽹段具有不同的标识(如A区、B区、C区...)
主机位:同⼀网段内,主机之间具有相同的⽹络号,但是必须有不同的主机号(如具体的房间号)
而划分网络位和主机位的就是"子网掩码",比如(255.255.255.0)
(3)如何计算网段
假设现在有一个IPV4地址:192.168.1.100 → 二进制是 11000000.10101000.00000001.01100100
而"子网掩码"前面连续的1对应网络位,后面连续的0对应主机位,比如:
255.255.255.0--->11111111.11111111.11111111.00000000--->前24位是网络位,后8位是主机位
它表示的含义是:IP地址(二进制)的前24位保持不变,后8位全变为0,例如:
11000000.10101000.00000001.01100100->11000000.10101000.00000001.00000000
**网段为**192.168.1.0同一个网络主机比如 192.168.1.5、192.168.1.200最后的网段都是192.168.1.0

【四】IP地址数量
我们知道IPV4是由32位二进制表示,那么一共有2^32个IP,但是网民却不止这么多,如何分配?
设备主机上网的时候再给它分配IP,该IP由它连接的路由器分配,因此每次分配的IP都是不同的
【五】私有和公网IP地址
(1)如何定义
公网IP:全球唯一的IP地址
私网IP:只在局域网内使用的IP地址,只要局域网不同(网段不同),可以使用同样的私有IP
RFC1918规定了用于组建局域⽹的私有IP地址:(该范围内都成为私有IP,其余的则称为公有IP)
10.*,前8位是⽹络号,共16,777,216个地址
172.16.*到172.31.*,前12位是⽹络号,共1,048,576个地址
192.168.*,前16位是⽹络号,共65,536个地址
(2)私有IP如何访问服务器
在前面我们已经有了网段的概念,一个网段相当于一个局域网(小的网络子网范围),这个网段的第一个IP通常是路由器,该网段内的全部主机网段和对应路由器的网段相同,路由器一般有两个IP地址(公网IP+私网IP),例如:路由器作为公网和私网的中间桥梁

此时假设路由器的主机7想访问百度的服务器(假设180.101.49.11:80),会执行:
(1)主机7先到达自己子网内的路由器,由路由器分配私网端口(192.168.144.2:9000)
(2)随即利用路由器的NAT技术,将主机7的IP改为路由器的公网IP,再分配公网端口
(这里为什么要分配两次端口?确保主机在私网和公网内各自具有唯一性)
(3)再在路由器内形成一张映射表,记录主机7的两种修改信息+目的地址,例如:
| 内网地址(私有 IP: 端口) | 公网地址(路由器 WAN 口 IP: 端口) | 目的服务器地址 |
|---|---|---|
| 192.168.1.100:5000 | 202.103.15.6:6000 | 180.101.49.11:80 |
(4)此时再通过中间其它路由器的传递(发现不是访问自己的就继续传)
(5)到达目的服务器后,带着数据包返回(此时目的地址反向,是对应主机的公网地址)
(6)找到自己的路由器,经过映射表将公网地址换成原来的私网地址端口,完成数据的来回访问

【六】IP分片和组装
(1)为什么要分片
因为报文还要经过下面的数据链路层,其中存在最大尺寸MTU限制(以太网中为1500字节),因此经过数据链路层的报文大小不能超过MTU,即对于大"重量"的数据,分片是必须的!
(2)如何进行分片

在IP协议中"16位标识""3位标志""13位片偏移"是用来完成分片的:
16位标识:给所有被分片的数据包标上相同的编号,用来表示来自同一个数据包
3位标识:表示是否参与分片,是否后面还有分片(表示是否是分片数据包的最后一个分片)
13位片偏移:当前分片在被分片数据包中的位置(比如1480,从原始数据的1480字节开始)
注意:每个被分片的小数据包都有和原数据包核心信息一样的报头
既然MTU最大限制为1500,除去报头(20),那么有效载荷为1480
(3)如何进行组装
当对方主机接收到不同的报文之后,可以通过上面三个报文信息来对报文分片报文进行排序:
(1)将报文中16位标识相同的报文弄在一起
(2)13位片偏移的大小可以确定分片报文的顺序
(3)3位标识可以判断当前是否是最后一个分片
(4)分片丢包
如果被分片的报文存在丢失的情况,即组装不完整,那么整个报文(该报文的所有分片)就会被丢弃,此时出现报文丢包,超时重传直接重新传送该报文
(5)分片与上下层协议
数据链路层具备MTU的最大数据包限制,那么中间的IP协议夹在传输层之间,肯定是要和上面沟通每次传下来的报文的,同时对方传数据也会贯穿整个协议,因此简单总结:
数据链路层:规定报文的最大MTU
IP协议:避免报文超过最大MTU,即保底的方案
TCP协议:在三次握手时和对方商议(网络情况、最大MTU、窗口...)动态绝对报文大小,尽量 减少分片,这里要引入MSS协议:协商单个报文的最大长度(不算IP、TCP报头)
【七】MAC帧(以太网)
MAC帧是数据链路层的**"传输单元"**,对上面的报文执行最后的包装(不是协议)
(1)MAC帧结构
我们介绍几个重要的组成:
目的 MAC 地址:接收方的物理地址(在传输过程中不断变化)
源 MAC 地址:发送方的物理地址(在传输过程中不断变化)
数据字段:上层的数据包
(2)作用
含目的地址的报文,会被当前局域网的所有主机拿到,但为什么只会给确定主机?
因为MAC帧的包装,当其它主机看到该报文时,会查看里面的MAC地址,当该报文的"目的MAC地址"和自己的"MAC地址"不一样,就会主动抛弃,实现快速辨别的效果!
(3)整个传输过程
首先MAC帧的数据包经过上下层的贯穿协议会直达路由器A,中间局域网的主机不会接收,因为目的MAC地址是自己的路由器A,此时MAC帧包装的IP数据包被路由器获取
再去除外层的MAC帧拿到IP数据包,NAT转换:替换里面的IP为自己的公网IP,分配公网端口
该路由器再根据目的IP查看路由表,确定下一跳(路由器),该路由器A再通过ARP协议由该路由器A通过公网向已经确定的下一跳路由器B发送请求,让路由器B告诉路由器A自己的MAC地址
此时路由器A再重新封装MAC帧,源MAC地址为自己,目的MAC地址为路由器B的,再转交给网络
当经过多个路由器到达最后一个路由器C,去除MAC帧,找到了该数据包的目的IP网段,路由器C再通过ARP协议询问当前内的百度服务器,百度服务器回复路由器C,C再重新封装MAC帧,目的MAC地址为百度服务器的,源MAC地址为路由器C,数据变完成了发送!
注意:路由器也可以理解为一个主机,也在执行操作系统上下层协议
什么是ARP协议
解决的问题:数据从应用层贯穿数据链路层才能经过网卡这些硬件发送,中间需要很多路由器运输,而MAC帧又是数据链路层的,需要不断更新源MAC地址和目的MAC地址,中间是无法跨越的
ARP协议怎么实现跨网段传输
ARP协议只能在同一个网段中使用,ARP协议可以快速在当前局域网内实现获取对方的MAC地址,在本地局域网自然可以使用ARP协议。那么在公网中呢?**公网又是一个局域网,被逐渐分层,**中间由运营商控制(路由器的公网IP又在一个局域内)
ARP"欺骗"原理
当路由器A收到目标路由器B的ARP应答(其中就包含了B的MAC地址)之后,只要ARP的格式正确和目的主机是自己,就不会去验证真实性 ,此时A为了下次快速的获取MAC的地址,会将这些信息缓存下来,形成ARP缓存,如果多次收到同样的ARP应答,会更新ARP缓存表。
此时如果中间设备伪造ARP应答给路由器A(知道对方的IP即可),随后将原来路由器B的MAC地址换成自己的"我是路由器B,我的MAC地址是..",此时A在发送数据时,本来发给B的数据包就直接发给了中间人,形成"截胡"。
【八】正/反向代理服务器与内网穿透
(1)正向代理服务器

原理:客户端发送请求给代理服务器(包括给客户端分配IP),代理服务器再将请求交给真正的服务端,服务器请求再通过代理服务器转交给客户端,例如:校园网
特点:隐藏客户端真实IP、限制某些资源的访问、客户端访问信息公开给中间的服务器
(2)反向代理服务器

原理:客户端通过互联网正常发送请求,只是在目标服务器前面出现了又一个中间服务器,用来收集客户端请求再转交给真正的目标服务器,同理再通过中间服务器返回或者真正服务器直接返回
特点:负载均衡、隐藏后端的服务器,防止被攻击
(3)如何区分正反代理
(1)正向代理:服务对象是客户端,客户端知道代理的存在
(2)反向代理:服务对象是服务端,客户端不知道代理的存在
(4)内网穿透

解决问题:只有客户端主动向服务器发送请求,服务端才可以和客户端之间实现通信,即服务端 在无客户端主动发送请求的条件下,NAT会直接拦截服务端的请求,因为内网IP在外 网设备看来是不认识它的;而内网穿透就是实现双向通道,帮外网设备找到内网设备
原理:首先我们要明白,私网客户端在公网的身份是:该路由器的公网IP+分配端口
那么私网设备A通过这个B在公网的这个身份**(长链接)**,不就可以访问到B吗?
所以内网穿透本质是私网设备主动访问中间公网服务器,这样公网服务器就知道了私网设备的身份,那如果中间公网服务器再把双方的公网身份告诉对方,私网设备A不就可以直接和私网设备B通信!私网设备主动访问公网设备------>获取公网身份------>私网设备通过公网身份实现交流
