在IP网络上,如果用户要将一台计算机连接到Internet上,就需要向因特网服务提供方ISP(Internet Service Provider)申请一个IP地址。

        IP地址是在计算机网络中被用来唯一标识一台设备的一组数字。IPv4地址由32位二进制数值组成,但为了便于用户识别和记忆,采用了“点分十进制表示法”。采用了这种表示法的IPv4地址由4个点分十进制整数来表示,每个十进制整数对应一个字节。例如,IPv4地址使用二进制的表示形式为00001010 00000001 00000001 00000010,采用点分十进制表示法表示为10.1.1.2。

IPv4地址由如下两部分组成:

  • 网络号码字段(Net-id):用来标识一个网络。IP地址与子网掩码转换为二进制,进行AND计算后的结果即为网络号码字段。

  • 主机号码字段(Host-id):用来区分一个网络内的不同主机。对于网络号相同的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。IP地址与子网掩码转换为二进制,再将子网掩码取反,进行AND计算后的结果即为主机号码字段。

网络层的主要职责

  • 提供逻辑地址 :每个网络设备通过网络层的IP协议拥有一个逻辑地址(IP地址),确保数据包能够被准确送达。
  • 路由和转发 :决定数据包在网络中的传输路径,并进行转发。
  • 分片和重组 :在网络设备间路径可能存在的MTU(最大传输单元)不一致时,网络层负责对数据包进行分片,并在到达目的地后进行重组。
  • 提供连接服务 :网络层提供无连接服务,如IP协议,以及面向连接的服务,如传输层的TCP协议在应用层封装后会通过网络层进行传输。

IPV4报文格式

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | IHL | Type of Service |          Total Length       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        | Flags |    Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |   Protocol    |        Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (if IHL > 5)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

关键字段说明

字段作用
Version版本号(IPv4=4)
IHL头部长度(单位:4字节,最小值为5)
Type of ServiceQoS服务质量(如优先级、延迟、吞吐量要求)
Total Length数据包总长度(最大65535字节)
TTL生存时间(防止环路)
Protocol上层协议标识(TCP=6,UDP=17)
Checksum头部校验和(每跳重新计算)
Source/Dest IP源/目标IP地址

IPv4地址结构

(1) 地址表示

  • 二进制11000000.10101000.00000001.00000001

  • 点分十进制192.168.1.1

  • 十六进制C0 A8 01 01

(2) 地址分类(历史分类,现已被CIDR取代)

类别范围网络/主机位用途
A1.0.0.0 - 126.255.255.2558/24大型机构(如政府)
B128.0.0.0 - 191.255.255.25516/16中型企业
C192.0.0.0 - 223.255.255.25524/8小型网络
D224.0.0.0 - 239.255.255.255N/A组播(Multicast)
E240.0.0.0 - 255.255.255.255N/A保留(实验用途)

IPv4地址类型

(1) 公有地址(Public IP)

  • 全球唯一,由IANA分配给ISP或企业(如 203.0.113.1)。

  • 用于互联网通信。

(2) 私有地址(Private IP)

  • 局域网内部使用,不可直接访问互联网(需NAT转换):

    • 10.0.0.0/8

    • 172.16.0.0/12

    • 192.168.0.0/16

(3) 特殊地址

地址用途
127.0.0.1环回地址(测试本机网络栈)
169.254.0.0/16链路本地地址(DHCP失败时自动分配)
224.0.0.0/4组播地址(如224.0.0.5用于OSPF路由协议)
255.255.255.255受限广播地址(仅当前子网)

IPv4核心特性

特性说明
地址长度32位二进制(约43亿个地址),通常以点分十进制表示(如192.168.1.1
寻址方式分层结构(网络号+主机号),通过子网掩码划分
协议字段标识上层协议(如TCP=6,UDP=17,ICMP=1)
生存时间TTL(Time to Live),每经过一个路由器减1,防止数据包无限循环
分片机制支持大数据包分片传输(MTU限制)
无连接不保证可靠性,依赖上层协议(如TCP)纠错

 IPv4分片与重组

  • MTU限制:以太网默认MTU=1500字节,超大数据包需分片。

  • 分片字段

    • Identification:同一数据包分片标识相同。

    • Flags

      • DF(Don't Fragment):禁止分片(如ICMP Ping设置DF位)。

      • MF(More Fragments):非最后一片时为1。

    • Fragment Offset:当前分片在原始数据包中的偏移量(单位:8字节)。

数据包分片的条件

 在IPv4网络中,由于链路层帧的大小限制,过大的数据包可能需要在发送前进行分片。在IP层的分片通常由发送方根据链路层的最大传输单元(MTU)来决定:

        最大传输单元(MTU) :链路层的最大数据帧大小。不同的链路层技术(例如以太网和PPP)有不同的MTU值。

        分片触发条件 :当一个数据包的总长度超过下一站链路层的MTU时,IP层会将数据包分片,以确保每个分片都小于或等于MTU。

        分片过程 :分片时,原始数据包的头部被复制到每个分片中,每个分片被赋予一个新的IP头部,包含了片偏移、更多片段标志和片长度等信息。

重组过程和相关问题


在到达目的地之后,这些分片需要被重新组合成原始数据包。重组过程如下:

        组装过程 :目的地主机的网络层接收到分片后,根据片偏移和标识字段将分片组装到缓冲区中的正确位置。

        重组条件 :当所有分片都到达,并且标识字段一致时,表明这些分片属于同一个数据包,可以开始组装。

        超时问题 :如果某些分片丢失,接收方需要等待一定时间以收集所有分片。如果超出设定的超时时间仍未收到所有分片,则组装失败,需要丢弃已接收到的分片,并可能通知源主机发送方重传。

        分片和重组虽然提供了灵活性,但也增加了处理的复杂性,可能导致传输效率降低。因此,在设计应用时,最好尽量避免数据包分片,例如通过使用路径MTU发现(PMTUD)来调整数据包大小。

校验和计算
uint16_t calculate_checksum(const ipv4_header_t *hdr) {uint32_t sum = 0;uint16_t *ptr = (uint16_t*)hdr;size_t len = get_header_length(hdr);// 16位累加for (size_t i = 0; i < len/2; i++) {sum += ntohs(ptr[i]);if (sum > 0xFFFF) {sum = (sum & 0xFFFF) + (sum >> 16);}}return (uint16_t)~sum;
}
路由表数据结构
// 路由表项定义
typedef struct {uint32_t network;    // 网络地址uint32_t netmask;    // 子网掩码uint32_t next_hop;   // 下一跳地址uint8_t  mac[6];     // 下一跳MACuint32_t if_index;   // 出接口索引uint32_t metric;     // 路由度量值
} route_entry_t;// 路由表结构
typedef struct {route_entry_t *entries;size_t capacity;size_t count;
} routing_table_t;
最长前缀匹配(LPM)实现
// Trie节点定义
typedef struct trie_node {struct trie_node *children[2]; // 0和1分支route_entry_t *route;         // 叶子节点对应的路由
} trie_node_t;// LPM查找实现
route_entry_t *ipv4_lpm(trie_node_t *root, uint32_t dest_ip) {trie_node_t *current = root;route_entry_t *best_match = NULL;for (int i = 31; i >= 0; i--) {int bit = (dest_ip >> i) & 0x1;if (!current->children[bit]) {break;}current = current->children[bit];if (current->route) {best_match = current->route;}}return best_match;
}

该图展示了用于实现最长前缀匹配(LPM)的二进制Trie树结构:

树结构:
每个节点代表IP地址的一个比特位
左分支(0)和右分支(1)对应比特值
从根到叶子的路径表示完整网络前缀
路由示例:
10.0.0.0/8:只需匹配前8位(路径:1→0→…)
192.168.0.0/16:匹配前16位(路径:1→1→0→…)
192.168.1.0/24:需要匹配24位(路径:1→1→0→…→1)
查找过程:
从最高位开始逐比特匹配
记录途经的最具体路由(最长前缀)
当无法继续匹配时返回最后记录的路由


完整IPv4处理流程

void ipv4_process_packet(eth_header_t *eth, ipv4_header_t *ip) {// 1. 校验和验证if (calculate_checksum(ip) != 0) {log_drop_packet(ip, "Checksum error");return;}// 2. TTL检查if (ip->ttl <= 1) {send_icmp_time_exceeded(eth, ip);return;}// 3. 路由查找route_entry_t *route = ipv4_lpm(routing_table, ip->dst_addr);if (!route) {send_icmp_dest_unreachable(eth, ip);return;}// 4. ARP解析下一跳MACuint8_t *next_hop_mac = arp_lookup(route->next_hop);if (!next_hop_mac) {arp_send_request(route->next_hop);return; // 等待ARP响应}// 5. 更新数据包头部ip->ttl--;ip->checksum = update_checksum(ip->checksum, 1); // TTL减1后更新校验和// 6. 更新以太网头部memcpy(eth->dmac, next_hop_mac, ETH_ALEN);memcpy(eth->smac, get_interface_mac(route->if_index), ETH_ALEN);// 7. 发送数据包iface_send_packet(route->if_index, eth, ntohs(ip->total_length));
}

该流程图详细描述了IPv4协议栈处理入站数据包的完整逻辑:

  • 输入验证:

        校验和验证:确保头部未被篡改
TTL检查:防止数据包无限循环

  • 路由决策:

        目的地址分类(本地/转发)
LPM查找确定下一跳和出接口
无路由时发送ICMP目的不可达消息

  • 转发准备:

        TTL递减和校验和更新
ARP解析下一跳MAC地址
以太网头部重写

  • 输出处理:

        接口MTU检查(可能触发分片)
排队发送到输出接口
更新统计计数器

高级实现技术

硬件加速转发

该图展示了现代路由器中控制平面与数据平面分离的架构:

  • 控制平面:

        CPU运行路由协议(OSPF/BGP等)
维护主路由表(FIB)
处理异常数据包(如TTL过期)

  • 数据平面:

        TCAM实现纳秒级路由查找
ASIC完成线速报文修改
流水线处理实现高吞吐量

  • 协同工作:

        控制平面下载路由到硬件
数据平面异常包上送CPU
统计信息定期同步

曾经我们的千兆交换机只能跑到200Mbps,因为:

  1. 每个包都要经过CPU
  2. 缓存未命中率高

转折点:引入TCAM后:

  • 将FIB表项预处理为TCAM格式

  • 批量更新代替单条操作

  • 吞吐量直接拉满到线速

  // TCAM表项格式示例struct tcam_entry {uint32_t key[4];    // IP地址+掩码uint32_t action;    // 转发/丢弃uint8_t  next_hop[6]; // 下一跳MAC};
快速转发路径优化
// 快速转发路径数据结构
typedef struct {uint32_t dst_ip;uint32_t next_hop;uint8_t  out_if;uint8_t  mac[6];uint32_t last_used;
} fast_path_cache_t;// 快速转发实现
bool ipv4_fast_forward(eth_header_t *eth, ipv4_header_t *ip) {fast_path_cache_t *cache = lookup_fast_cache(ip->dst_addr);if (cache && (time_now() - cache->last_used < CACHE_TIMEOUT)) {// 更新数据包头部ip->ttl--;ip->checksum = update_checksum(ip->checksum, 1);// 更新以太网头部memcpy(eth->dmac, cache->mac, ETH_ALEN);memcpy(eth->smac, get_interface_mac(cache->out_if), ETH_ALEN);// 发送数据包iface_send_packet(cache->out_if, eth, ntohs(ip->total_length));// 更新缓存时间戳cache->last_used = time_now();return true;}return false; // 快速路径未命中
}

调试与排错指南

常见问题排查表

现象可能原因排查方法解决方案
无法ping通路由缺失1. show ip route(Cisco)
2. route print(Windows)
3. ip route(Linux)
1. 添加静态路由:
ip route add 192.168.1.0/24 via 10.0.0.1
2. 检查动态路由协议(OSPF/BGP)状态
TTL过期路由环路1. traceroute 目标IP
2. 检查路由表是否有循环路径
1. 修正路由配置
2. 启用STP/RSTP防二层环路
3. 检查ECMP(等价多路径)配置
分片丢失PMTU不匹配1. ping -f -l 1472 目标IP(测试MTU)
2. netsh interface ipv4 show subinterface(Windows)
1. 调整MTU:
ifconfig eth0 mtu 1400
2. 启用PMTUD:
sysctl -w net.ipv4.ip_no_pmtu_disc=0
校验和错误硬件故障/驱动问题1. Wireshark抓包分析错误帧
2. ethtool -S eth0(Linux网卡统计)
1. 更换网线/光纤
2. 更新网卡驱动
3. 禁用校验和卸载:
ethtool -K eth0 rx off tx off
ARP超时网络隔离/配置错误1. arp -a(检查ARP表)
2. show mac address-table(交换机)
1. 检查VLAN配置
2. 验证ACL是否阻断ARP
3. 启用ARP代理:
arping -U 网关IP
调试信息展示
void show_ipv4_stats(void) {printf("IPv4 Statistics:\n");printf("  Received: %10u packets\n", stats.rx_packets);printf("  Forwarded: %9u packets\n", stats.forwarded);printf("  Dropped: %10u packets\n", stats.dropped);printf("    |- Checksum errors: %u\n", stats.csum_errors);printf("    |- TTL expired: %u\n", stats.ttl_expired);printf("    |- No route: %u\n", stats.no_route);printf("    |- ARP failed: %u\n", stats.arp_failed);printf("\nRouting Table (%u entries):\n", route_count);for (int i = 0; i < route_count; i++) {printf("  %15s/%d -> %15s via %02X:%02X:%02X:%02X:%02X:%02X\n",ip2str(routes[i].network),mask_to_prefix(routes[i].netmask),ip2str(routes[i].next_hop),routes[i].mac[0], routes[i].mac[1], routes[i].mac[2],routes[i].mac[3], routes[i].mac[4], routes[i].mac[5]);}
}
诡异案例:半夜准时丢包

现象:每天凌晨2点丢包率飙升
排查过程:

  1. 检查CPU/内存 → 正常
  2. 抓包分析 → 发现大量ARP请求
  3. 最终发现:某台NAS设置的定时备份任务

总结:永远记住这个检查顺序:

  1. 物理层(网线/光模块)
  2. ARP表
  3. 路由表
  4. ACL规则
  5. 系统日志

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

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

    相关文章

    技术速递|GPT-5 正式上线 Azure AI Foundry

    AI 应用正在经历一场深刻变革——对企业来说&#xff0c;仅仅“能聊天”早已不够&#xff0c;生成内容、逻辑推理、落地生产&#xff0c;这些才是新时代对 AI 能力的真正考验。 今天&#xff0c;我们非常激动地宣布&#xff0c;OpenAI 最新旗舰大模型 GPT-5 正式上线 Azure AI …

    Logistic Regression|逻辑回归

    ----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

    三极管在电路中的应用

    1、信号放大&#xff08;电压放大&#xff09; 应用场景 &#xff1a;麦克风声音放大、耳机驱动、广播信号接收等音频设备 原理解析 &#xff1a; 想象三极管如同一个精准的水龙头&#xff1a; 基极&#xff08;B&#xff09;电流如同拧动阀门的微弱力量&#xff08;输入信号&a…

    Redis 事务机制

    文章目录一、什么是事务&#xff1f;二、事务相关操作总体认识基本操作流程watch 操作演示watch 原理一、什么是事务&#xff1f; Redis 的事务和 MySQL 的事务概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执⾏. Redis 的事务和 MySQL 事务的区别&#xff1…

    Mybatis学习之自定义映射resultMap(七)

    这里写目录标题一、准备工作1、新建maven工程2、准备两张表3、建立mapper、pojo、映射文件mapper接口pojoxxxMapper.xml二、resultMap处理字段和属性的映射关系1、用起别名的方式保证字段名与属性名一致2、逐一设置resultMap映射关系3、配置mapUnderscoreToCamelCase三、多对一…

    数学学习 | 高数、线代、概率论及数理统计荐书

    注&#xff1a;本文为 “数学学习书目推荐” 相关合辑。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 高等数学、线性代数及概率论与数理统计领域推荐书目 西湖边的卡夫卡 编辑于 2023-09-19 13:26 7495 人赞同了该回答 数学具有内在的美学属性&#xff0c;但并非…

    【LLM实战|langgraph】langgrpah基础

    every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 langgraph 基础 1. Chatbot实现 # !pip install langchain # !pip install langgraphfrom typing import Annotatedfrom typing_extensions import Typ…

    大疆无人机使用eport连接Jetson主板实现目标检测

    所需硬件设备如下&#xff1a; 实现原理&#xff1a; 视频流获取&#xff1a;从大疆无人机获取实时视频流。数据传输&#xff1a;将视频流传输至 Jetson 平台。目标检测处理&#xff1a;在 Jetson 上运行目标检测算法对传入的视频帧进行分析 EPort开发套件 大疆官网给出了…

    Typora激活与使用

    Typora下载 下载地址&#xff1a;Typora 官方中文站 Typora&#xff08;1.9.5及其以前的版本&#xff09; 工具&#xff1a;待补充 流程 1.解压工具 2.将license-gen.exe、node_inject.exe两个文件放于typora安装目录下 3.在typora安装目录下运行cmd&#xff08;可以打开…

    图片拆分工具,自定义宫格切割

    软件介绍 今天推荐一款实用的图像处理工具——lmage Splitter&#xff0c;支持图像拆分与格式互转功能&#xff0c;无广告干扰&#xff0c;操作简单流畅&#xff0c;满足多样化图片编辑需求。 软件优势 该工具为绿色版设计&#xff0c;无需安装即可直接运行&#xff0c;下载…

    23种设计模式解析--创建型模式

    创建型模式&#xff08;造物主的智慧&#xff09; 单例模式 模式定义 单例模式&#xff08;Singleton&#xff09;确保一个类仅有一个实例&#xff0c;并提供该实例的全局访问点。核心思想是通过私有化构造函数和静态成员实现受控的对象创建。核心实现要点 私有构造函数&#x…

    全面解析软件工程形式化说明技术

    一、形式化说明技术概述&#xff1a;从模糊到精确的跨越 在软件工程的发展历程中&#xff0c;需求说明技术始终是确保软件系统成功开发的关键环节。从早期依赖自然语言的非形式化描述&#xff0c;到如今基于数学和逻辑的形式化方法&#xff0c;这一领域经历了从模糊到精确的深…

    百度网盘自动启动如何关闭,关闭智能看图

    #某度软件引起的奔溃#在日常办公中&#xff0c;有时候双击图片&#xff0c;会自动打开了某度的网盘&#xff0c;很奇怪莫名其妙的为什么会关闭网盘后又自动打开了。如何发现是某度的牛虻软件在搞鬼的&#xff1f;我右键图片&#xff0c;选择打开方式&#xff0c;发现有“智能看…

    疏老师-python训练营-Day40训练和测试的规范写法

    浙大疏锦行 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测…

    【重磅发布】flutter_chen_keyboard -专注于键盘相关功能

    flutter_chen_keyboard 一个功能强大且易于使用的 Flutter 键盘增强库&#xff0c;专为提升移动应用的键盘交互体验而设计。 &#x1f4d6; 库简介 flutter_chen_keyboard 是一个专注于键盘相关功能的 Flutter 工具库&#xff0c;旨在为开发者提供更流畅、更智能的键盘交互解决…

    idea设置注释--带日期和作者和描述

    最终效果 在File Header中添加如下内容&#xff1a; /*** author ${USER}* date ${DATE} ${TIME}* description ${DESCRIPTION}*/${USER}&#xff1a;IDEA 里设置的用户名 ${DATE}&#xff1a;当前日期 ${TIME}&#xff1a;当前时间 可以加自定义变量&#xff0c;比如 ${DESCRI…

    【Linux】Socket编程——UDP版

    &#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——udpsocket &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C学习笔记&#xff0c;C语言入门基础&#…

    RabbitMQ面试精讲 Day 14:Federation插件与数据同步

    【RabbitMQ面试精讲 Day 14】Federation插件与数据同步 开篇 欢迎来到"RabbitMQ面试精讲"系列第14天&#xff0c;今天我们将深入探讨RabbitMQ Federation插件与跨集群数据同步机制。在分布式系统架构中&#xff0c;如何实现消息队列集群间的数据同步是确保业务连续…

    AI编程工具 | Trae介绍

    描述需求就可以自动创建可运行的完整项目了&#xff0c;确实很强&#xff01; 终端中的报错信息都可以快速作为上下文输入&#xff0c;点击确认就可以自动修改&#xff0c;贼好使&#xff01; Trae 编程工具详细介绍 一、产品简介 Trae 是字节跳动于 2025 年 1 月 19 日推出的…

    【第11话:感知算法基础3】目标检测:深度学习目标检测模型介绍入门及常用模型详解

    深度学习目标检测模型介绍入门及常用模型详解 目标检测是计算机视觉的核心任务&#xff0c;需同时完成目标定位&#xff08;输出边界框坐标&#xff09;和目标分类&#xff08;识别类别&#xff09;。深度学习通过端到端训练显著提升了检测精度和效率&#xff0c;主要分为两类架…