
- 🏠 博客主页:小谢同学的小破站
- ✍️ 本文由 小谢同学的小破站 原创,首发于 CSDN💻
- ☕ Java学习专栏:java
- 📗 MySQL专栏:MySQL
- 🧩 数据结构与算法:Java 数据结构与算法
- 🌐C语言专栏: C语言
- 👍 欢迎点赞👍 收藏⭐ 留言📝,发现错误欢迎指正!
- ✨ 脚踏实地,持续深耕,奔赴自己的目标✨
-- -- -- -- -- 💫分割线💫----------
IP协议
- [1. 认识IP协议](#1. 认识IP协议)
- [1.1 IP协议结构](#1.1 IP协议结构)
- [1.2 IP协议的核心特性](#1.2 IP协议的核心特性)
- [2. IP协议的问题以及解决办法](#2. IP协议的问题以及解决办法)
- [2.1 解决方案1:动态规划分配IP地址](#2.1 解决方案1:动态规划分配IP地址)
- [2.2 解决方案2:.NAT网络地址转换](#2.2 解决方案2:.NAT网络地址转换)
- [2.3 面试高频考点](#2.3 面试高频考点)
前言:
这里是小谢同学的 IP协议的学习记录,整理IP协议相关内容。笔记用于自我复盘巩固,有错误欢迎大家指出,专栏还有 Java、网络、C 语言系列笔记欢迎翻阅.
1. 认识IP协议
IP(Internet Protocol,网际协议)工作在TCP/IP 五层模型‑网络层 ,是整个互联网路由转发的基石。IP协议负责把数据包从源主机,跨越多个路由器转发到目标主机,解决跨局域网的数据传输问题。
1.1 IP协议结构

解释:
默认的首部长度为:
20
- 四位版本号(version): 分为
IPv4与IPv6,IPv4值为4,IPv6值为6- 4位首部长度(IHL): 首部长度占:
4bit,单位为:4字节;
- 最小首部长度:
无选项时,首部20字节->20/4 = 5- 最大首部长度:4 位二进制最大可以表示的数字:15(2^4-1 = 15) 而
2. 首部长度这个字段占4bit但是单位是 4 字节规定:首部长度数值 × 4 = IP 首部字节数 ;所以最大长度为:15×4 = 60
- 8 位 服务类型 TOS:用来标记数据包想要的传输优先级,
使用4位TOS字段和一位保留字段:延时、吞吐量、可靠性,成本(只有一个是1,另外3个是0)但是现在已经很少使用了;
- 注意:每一位上为1时: 延时为:代表最小延时;吞吐量:最大吞吐量;可靠性:最高可靠性;成本:最小成本
- 16位总长度: 整个IP数据包的总字节大小(首部+数据)最大值为
65532字节,以太网一般单帧限制在1500字节,超过了就要进行分片(也就是拆包和组包)- 16位标识: 同一个数据包拆包出来的身份标识,接收方使用身份标识来判断这些数据是否属于同一个包
- 3位标志位:第一位:保留(意思是现在不用,但是还没想好说不定以后会用到) ,第二位为1:标识禁止分片,这时候如果报文长度超过了MTU,IP模块就会丢弃报文 ,第三位表示"更多分片",如果分片了最后一个分片位置置为1,其他为0,类似于结束标识(如C语言中的"\0")
那么IP协议是如何拆包组包的?
- 假设发送前的数据很大,此时就会触发
分片,此时16位标识就相当于ID告诉对方我是同一个数据的
- 进过不断的传输过程中,就可能出现了数据传输顺序的错误
- 此时接收方:就能通过相同的
标识来确定不同的分片是否为同一个数据,通过13位片偏移来确定数据不同分片原来的一个位置
- 此时就能通过
标识,片偏移,标志位来保证拆包组包过程中不会发生数据的错误
- 8位TTL(生存时间Time‑To‑Live): 数据包最多可以经过多少个路由器 。每经过一台路由器让
TTL‑1。
- 衍生出新的问题->如果8位生存时间只有32或者64再或者128,那么这个TTL传输的次数够吗?
答案:够的,此处涉及到一个
社会科学->六度空间理论六度空间理论: 六度空间理论认为,世界上任意两个人之间最多只需通过六个人就能建立联系。
也就是说,理论情况下,一个人大概会有100多个朋友,我可以通过这些朋友的朋友的朋友的朋友来联系到世界首富;
真实情况下,我的能量比较小,根本联系不到,但是
计算机网络这个层次上可以联系到"世界首富"
此时8位TTL生存时间是足够的
- 8位协议Protocol: IP 上层是什么协议,会告诉目标主机,把 IP 的数据交给谁处理。
- 16 位 首部检验和: 只会校验IP头部,不会管后面数据的校验,
路由器进行转发时,每次转发TTL都会减1,所以,每次进过下一跳都必须重新计算校验和- 32 位 源 IP 地址: 发送这个数据包主机的 IPv4 地址。
- 32 位 目的 IP 地址: 数据包最终要送到哪里的 IPv4 地址,路由器就是读取这个字段查路由表转发。
- IP地址描述了当前这个地址是什么样子的,
32位整数,会分成4个部分中间采用 . 来进行分割(每个部分的取值0-255)例如:192.168.100.55
- 选项: 可选字段,长度可变。一般很少用,只要有选项,IP 首部长度就大于 20 字节。
- 数据: IP 数据包的载荷。存放 TCP/UDP/ICMP 等上层协议报文。
1.2 IP协议的核心特性
IP 五大核心特性:
- 无连接(Connectionless):IP协议发送数据之前不需要和对方建立连接
- 不可靠(Unreliable):传输过程中可能出现丢包现象,IP协议本身没有重传机制,也没有超时重试,不能确保传输过程中不出现丢包现象;
- 基于数据报(Datagram)传输: P 传输的最小单位叫 IP 数据报 ,每个报文自带完整的头部信息(源 IP、目的 IP)。路由器会以单个数据报为单位进行转发
- 支持分片(Fragmentation):
链路层一次能传输的数据长度是有限的(MTU 最大传输单元,以太网一般 1500 字节)。超过就会触发拆包和组包机制;- 独立路由选择: IP数据包经过路由器转发过程中每一个的IP数据包的路径都是
不一样的,也会出现后发先至的问题,接收方依靠片偏移来确定IP数据包在原数据里的具体位置,进行组包.
2. IP协议的问题以及解决办法
IP地址设置的初衷:为了区分设备,期望每一个设备都有和别人不一样的IP地址- 32位数字表示的范围:
0-42亿,移动互联网之前,这个数量数量是足够的,但是移动互联网开启之后,大概现在人手会有一台手机,甚至两台,这个数量远远超过了表示范围,此时就面临着IP地址不够用的问题 ; 甚至冰箱都能进行联网
2.1 解决方案1:动态规划分配IP地址
第一种解决方案:动态规划分配IP地址(已经在使用,但是效果比较有限)
动态分配 IP :设备在开机的时候,不会自带固定 IP ,会主动向局域网内的
DHCP 服务器申请一个空闲的 IP 地址;服务器从预先准备好的IP 地址池中挑一个分配给它。此时就能节省一大部分的设备,暂时不需要分配IP地址;
工作流程(DHCP 四步握手)
- DHCP Discover(发现) 😗*:主机刚接入网络的时候,不知道DHCP服务在哪,会进行
广播发送请求,询问服务器"有没有DHCP服务器,我像要一个IP"- DHCP Offer(提供) :DHCP 服务器收到广播请求,如果有就会从 IP 池选出一个空闲 IP,回复给主机。注意:
IP 只是预留,还没正式给到手上。- DHCP Request(请求) :主机选中其中一台服务器给出的 IP,再次广播告知服务器:我就要这个 IP 了。
- DHCP Ack(确认) :服务器最后会发确认报文,IP 正式分配成功,同时会附带
租期信息。
- 租期:租期未结束,客户端主动续约,会延长使用时间,会继续沿用当前IP;租期结束:
IP就会回收,设备必须重新申请IP
2.2 解决方案2:.NAT网络地址转换
第二种解决方案: NAT网络地址转换(核心方案)
NAT网络地址转换: NAT 设备(通常是路由器)维护一张地址转换表 ,记录着「内网 IP + 端口」与「公网 IP + 端口」的映射关系。
两个核心概念:
- 内网:处在路由器 NAT 的后方、会受路由器管控的本地网络。(内网设备使用私有 IP 地址 ,私有 IP 只能在局域网内部通信,不能直接在互联网上路由,公网上的服务器无法主动找到你的内网 IP。)
- 就像家里的WiFi,手机,电脑等电子产品连接到的网络,路由器分配给他们的
192.168.1.2、192.168.1.3,此时这些设备就属于在内网;内网IP网段:
10.0.0.0 ~ 10.255.255.255172.16.0.0 ~ 172.31.255.255192.168.0.0 ~ 192.168.255.255
- 外网:路由器以外、运营商主干互联网。(外网设备使用公网 IP 地址 。公网 IP 是
全网唯一的地址,可以在整个互联网路由,互联网上任意主机都能够定位到这个 IP。)
- 百度服务器
180.101.49.11、你家路由器从运营商拿到的 IP 地址,就属于外网 IP。外网网段:
内网以外的IP内网和外网的边界:路由器的 NAT 网关,路由器 LAN 口一侧 → 内网 ;路由器 WAN 口一侧 → 外网(互联网)
转化流程:
数据出站(内网 → 外网)
- 内网主机(如
192.168.1.100:5000)发数据包到外网- 经过 NAT 路由器时,路由器把源 IP 替换成自己的公网 IP(如
202.100.1.1)- 同时在转换表中记录映射:
192.168.1.100:5000 ↔ 202.100.1.1:6000- 外网服务器看到的请求来源是公网 IP,不知道内网真实地址
数据入站(外网 → 内网)
外网服务器回复数据包到
202.100.1.1:6000NAT 路由器查转换表,发现
6000端口对应内网192.168.1.100:5000把目的 IP 替换成内网 IP,转发给对应主机
注意:如果接收方和发送方端口号一致时,端口号也会发送地址转换;
关键:NAT 靠端口号 来区分同一公网 IP 下的不同内网设备,这叫PAT(端口地址转换) ,也是实际最常用 的 NAT 方式。
2.3 面试高频考点
1.为什么外网服务器不能主动访问内网主机?
NAT 路由器里面的映射记录,只能由内网主机主动向外发数据包才会创建 。
外网主机一开始没有任何映射条目,路由器收到外网主动发来的数据,找不到对应的内网主机,数据包就直接丢弃。
如果需要外网访问内网服务:需要手动配置端口映射(端口转发)
2.简述 IP 数据包分包组包的过程
当IP数据包携带比较大的载荷时,如果报文长度超过链路MTU无法一次性转发,就会触发拆包组包
路由器会将大报文拆分成若干个分片,使用16位标记来进行标记,确保当前分片是同一个数据同一个报文
而网络传输中可能出现乱序的情况,类似于后发先到,此时就会依靠13位片偏移来标记数据在原数据中的位置,根据片偏移>来进行排序;
同时会依靠标志位来判断是否到达最后一个分片
3.什么是 NAT?作用是什么?
- 节约公网 IP 资源,缓解 IPv4 地址枯竭;
- 屏蔽内网主机,外网无法直接访问内网设备,带来一层基础安全防护;
- 实现内网‑外网之间的数据包转发。
4.NAT 转换改的是源 IP 还是目的 IP?
- 内网→外网(出站):修改【源 IP、源端口】, 目的 IP 保持不变
- 外网→内网(回程):修改【目的 IP、目的端口】, 源 IP 保持不变
口诀:出去改源,回来改目的
[🔙 返回目录](#🔙 返回目录)








