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

网络层IP协议

一:网络层的作用

在复杂的网络环境中确定一个合适的路径.

二:IP报头

4位版本号(version):指定IP协议的版本, 对于IPv4来说, 就是4.

4位头部长度(header length):IP头部的长度是多少个32bit(4字节), 4bit能表示最大的数字是15, 因此IP头部最大长度是60字节.

8位服务类型(Type Of Service):3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置 为0). 4位TOS分别表示:最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择 一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重 要.

16位总长度(total length):IP数据报整体占多少个字节.

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

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

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

8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路 由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环

8位协议:表示上层协议的类型

16位头部校验和:使用CRC进行校验, 来鉴别头部是否损坏.

32位源地址和32位目标地址:表示发送端和接收端.

三:网络号,主机号,子网,公网,局域网

IP地址分为两个部分, 网络号和主机号

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

• 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

• 不同的子网其实就是把网络号相同的主机放到一起.

• 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能 和子网中的其他主机重复. 通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.

那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.

• 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.

• 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.

怎么区分网络号和主机号呢?

CIDR(Classless Interdomain Routing)(无类别域间路由):

• 引入子网掩码(subnet mask)来区分网络号和主机号;

• 子网掩码是一个32位的正整数,通常用一串 "0" 来结尾;

• 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;

举例:

IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0

特殊的IP地址

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

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

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

私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址

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

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

• 192.168.*,前16位是网络号,共65,536个地址 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

• 一个路由器可以配置两个IP地址,一个是WAN口IP, 一个是LAN口IP(子网IP).

• 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.

• 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.

• 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.

子网内的主机需要和外网进行通信时, 路由器将IP首部中的 源IP地址 进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的源IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).

• 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

NAPT

一、基础定义

NAPT全称:Network Address Port Translation,中文叫网络地址端口转换,业内也常简称PAT(Port Address Translation,端口地址转换)

它是NAT(网络地址转换)技术里应用最广的分支,也是现在家用路由器、小区宽带、普通企业宽带默认开启的核心功能。

二、前置知识点:端口的作用

TCP/UDP 协议依靠「IP 地址 + 端口号」唯一标识一条网络通信会话:

  • IPv4 地址:定位全网哪一台主机;
  • 端口号(取值 0~65535):定位一台主机上的具体应用 / 进程
    • 0~1023:知名端口(固定给服务使用,如 80 网页、443 HTTPS、22 SSH);
    • 1024~65535:动态临时端口(客户端主动发起请求时随机使用,NAPT 主要使用这一段)。

一台公网 IP 搭配不同端口,理论可同时承载上万条并发连接,完美解决「单公网 IP 带多台内网设备」的问题。

三、核心原理

NAPT 的核心是路由器维护一张NAPT 映射表,规则:

内网(私有 IP + 内网端口) ↔ 公网(路由器公网 IP + 路由器临时端口)

所有进出内网的数据包,都会根据这张表改写 IP 地址 + 端口号,分 出网(内网→外网)回包(外网→内网)两个流程,下面用实例一步步拆解。

环境示例

  • 路由器内网网段:192.168.1.0/24(私网)
  • 路由器 WAN 口公网 IP:112.xx.xx.xx(唯一公网 IP)
  • 内网设备 A:192.168.1.10,随机发起端口10240
  • 内网设备 B:192.168.1.11,随机发起端口20480
  • 外网目标服务器:公网 IP223.5.5.5,服务端口80

流程 1:内网设备访问外网(数据包出方向)

  1. 主机发包设备 A 发起网页请求,数据包信息: 源 IP:192.168.1.10,源端口:10240目的 IP:223.5.5.5,目的端口:80

  2. 到达路由器,执行 NAPT 转换路由器识别这是内网访问外网的流量,查询本地 NAPT 表:

    • 无对应映射条目 → 从自身空闲高位端口中分配一个临时端口(比如50001);
    • 改写数据包:把「源私网 IP + 内网端口」替换成「路由器公网 IP + 临时端口」;
    • 写入映射表:(192.168.1.10:10240) ↔ (112.xx.xx.xx:50001)

    转换后数据包: 源 IP:112.xx.xx.xx,源端口:50001目的 IP:223.5.5.5,目的端口:80

  3. 转发外网改写后的数据包以路由器公网身份,在互联网中路由转发。

同一时间设备 B 也上网,路由器会分配另一个临时端口(如50002),生成第二条独立映射,两台设备流量互不干扰。


流程 2:外网服务器回包(数据包入方向)

  1. 外网服务器回复数据服务器只知道路由器的公网地址,回包信息: 源 IP:223.5.5.5,源端口:80目的 IP:112.xx.xx.xx,目的端口:50001

  2. 回到路由器,查表还原路由器根据「公网 IP + 目的端口50001」查询 NAPT 映射表,找到对应的内网地址和端口;反向改写数据包:把「公网 IP + 临时端口」还原为「内网私网 IP + 原内网端口」。

    还原后数据包: 源 IP:223.5.5.5,源端口:80目的 IP:192.168.1.10,目的端口:10240

四:IP分片和组装

分片与组装的过程

分片

1. 检查MTU限制:

◦ 当一个IP数据报的大小超过了网络的MTU(最大传输单元)限制时,就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。

2. 分割数据报:

◦ IP层将原始的IP数据报分割成多个较小的片段

◦ 对于每个片段,IP层会设置相应的标识偏移量标志位字段

◦ 同一个数据报的不同分片的标识字段相同

◦ 偏移量字段指示了当前分片相对于原始数据报的起始位置,以8字节为单位

◦ 标志位字段包含了3个位,其中MF(More Fragment)位用于指示是否还有更多的分片,DF (Do Not Fragment)位用于指示数据报是否允许进行分片。

3. 添加IP头部:

每个分片都会加上自己的IP头部,与完整IP报文拥有类似的IP头结构,但MF和Fragment Offset 等字段的值会有所不同。

4. 发送分片:

◦ 分片在传输过程中独立传输,每个分片都有自己的IP头部,并且各自独立地选择路由。

组装

1. 接收分片:

◦ 当目的主机的IP层接收到这些分片后,会根据标识字段将属于同一个数据报的所有分片挑选出来。

2. 排序与组装:

◦ 利用片偏移字段,IP层会对属于同一个数据报的分片进行排序。

◦ 当所有的分片都到达并正确排序后,IP层会将这些分片重新组装成一个完整的IP数据报。

3. 传递给上层协议:

◦ 组装好的IP数据报会传递给上层的协议进行处理。

IP 分片是不得已的兼容方案,实际网络中弊端远大于优势,任意分片丢失,会导致整个报文进行重传,而分片越多,报文丢失的概率越大,所以IP通信过程中,分片并不能成为主流。

MSS(TCP 最大分段大小) =MTU(整个 IP 报文最大长度,通常1500字节) - IP首部(20字节) - TCP首部 (20字节)

通过以上公式,TCP可以减少IP分片产生的弊端

UDP 没有 MSS:UDP 是无连接数据报协议,不会主动分段,所以 UDP 业务只能靠应用层限制包长防分片

http://www.gsyq.cn/news/1429892.html

相关文章:

  • 2026广州荔湾注册公司创业指南:老城创业优势、实操流程、避坑干货与靠谱代办盘点 - 资讯纵览
  • W55RP20-EVB-MKR 嵌入式 C 语言开发教程:UDP 客户端 / 服务端双模式通信
  • GLM-4-9B API集成教程:如何将AI模型接入现有系统的完整方案
  • MapLibre GL JS第32课:显示跨越180度经线的线
  • 110、未来展望:车载以太网与CAN混合组网对长距离通信的启示
  • 性能优化技巧:提升DeBERTa-v3-base-zeroshot-v2.0推理速度的10个方法
  • 2026大连黄金名表回收靠谱推荐榜,这3家最权威 - 资讯纵览
  • 钢丝绳的捻制工艺对电子防盗扣柔韧性的影响
  • 用Arduino与泡沫板制作五自由度线驱仿生机械手
  • Oracle EBS R12 应付 AP 模块核心架构详解
  • 58.从PBL到系统启动,全链路解析手机安全启动链与签名校验机制
  • BUCK 功率级参数计算
  • 设计模式系列文章(基础篇第 11 篇):模板方法模式——定义算法骨架,实现代码复用与流程统一
  • 2026年5月大模型选型指南:15+主流模型全维度对比(含最新Gemini 3.5 Qwen3.7)
  • MapLibre GL JS第33课:渲染世界副本
  • 保姆级教程:Win10/Win11系统下SolidWorks 2021 SP5完整安装与破解(含.NET环境检查与防火墙设置)
  • Selenium IDE导出的Python脚本跑不起来?手把手教你配置Edge驱动和Pycharm环境(避坑指南)
  • Python 进阶:函数名、闭包与迭代器
  • 069、NeRF/Gaussian Splatting 训练太慢?数据预处理、加速采样与低分辨率预热方案
  • 3PEAK思瑞浦 TP2191-TR SOT23-5 运算放大器
  • Hyperf 利用 PHP 的 反射机制的庖丁解牛
  • spi_master
  • 第八届高分子化学国际研讨会 (ICPC 2026)
  • Python类型推导协议
  • 城通网盘解析器:3分钟掌握免费高速下载的终极方案
  • OpencvSharp 算子学习教案之 - Cv2.CvtColor
  • MATLAB图论实战:除了shortestpath,自己写的Dijkstra函数如何优化与可视化?
  • 3PEAK思瑞浦 TP5551-TR SOT23-5 精密运放
  • OmenSuperHub:彻底释放惠普暗影精灵游戏本性能的终极解决方案
  • OpencvSharp 算子学习教案之 - Cv2.CvtColorTwoPlane