news 2025/12/28 6:50:01

【Linux网络基础】详解网络字节序与大小端模式 (Network Byte Order Endianness)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux网络基础】详解网络字节序与大小端模式 (Network Byte Order Endianness)

详解网络字节序与大小端模式 (Network Byte Order & Endianness)

本文详细讲解计算机系统中的字节序(Byte Order)概念,包括大端模式(Big-Endian)和小端模式(Little-Endian)的区别、内存布局,以及网络编程中必须遵守的网络字节序规则。


1. 什么是字节序 (Byte Order)?

在计算机中,数据是以**字节(Byte)**为单位存储的。一个字节包含8位(bit)。对于单字节的数据(如char),存储和处理都很简单,不存在顺序问题。

然而,对于多字节数据(如int,short,long等),它们占用多个字节。例如,一个 32 位的整数0x12345678占用 4 个字节。当我们要把这 4 个字节存储到内存中时,就涉及到一个顺序问题:是先把高位字节(0x12)存到低地址,还是先把低位字节(0x78)存到低地址?

这就引出了字节序的概念。

核心术语

  • MSB (Most Significant Byte): 最高有效字节。在0x12345678中,0x12是 MSB。
  • LSB (Least Significant Byte): 最低有效字节。在0x12345678中,0x78是 LSB。

2. 大端模式 (Big-Endian)

定义:数据的高位字节(MSB)存储在内存的低地址端,低位字节(LSB)存储在内存的高地址端。

特点

  • 符合人类的阅读习惯(从左到右)。
  • 也就是:高位在低地址

内存布局示意图

假设我们有一个 32 位整数0x12345678,存储在起始地址为A的内存中。

Mermaid 示意:

Memory
Address A+1 : 0x34
Address A+2 : 0x56
Address A : 0x12(MSB)
Address A+3 : 0x78(LSB)

3. 小端模式 (Little-Endian)

定义:数据的低位字节(LSB)存储在内存的低地址端,高位字节(MSB)存储在内存的高地址端。

特点

  • 符合计算机处理逻辑(低位先处理)。
  • 也就是:低位在低地址
  • 常见的 x86 架构(Intel, AMD)都是小端模式。

内存布局示意图

同样是 32 位整数0x12345678,存储在起始地址为A的内存中。

Mermaid 示意:

Memory
Address A+1 : 0x56
Address A+2 : 0x34
Address A : 0x78(LSB)
Address A+3 : 0x12(MSB)

4. 大端与小端的对比

特性大端模式 (Big-Endian)小端模式 (Little-Endian)
存储顺序MSB -> 低地址LSB -> 低地址
可读性好,符合人类阅读习惯差,逆序存储
典型架构PowerPC, IBM,网络协议x86 (Intel/AMD), ARM (默认)
判定口诀高尾端(高位在低地址)低尾端(低位在低地址)

5. 网络字节序 (Network Byte Order)

在网络通信中,不同的计算机可能采用不同的字节序(例如一台是大端机,一台是小端机)。为了保证数据在传输过程中的正确性,TCP/IP 协议规定了统一的网络字节序

规定网络字节序采用大端模式 (Big-Endian)

这意味着:

  1. 发送方主机在发送数据前,必须将数据从主机字节序 (Host Byte Order)转换为网络字节序
  2. 接收方主机在接收数据后,必须将数据从网络字节序转换为主机字节序

转换函数 (C/C++)

操作系统提供了一组标准函数来进行转换,通常在<arpa/inet.h><netinet/in.h>中。

  • h代表 host (主机)
  • n代表 network (网络)
  • s代表 short (16位,用于端口号)
  • l代表 long (32位,用于IP地址)
函数名作用解释
htons()Host to Network Short主机字节序 -> 网络字节序 (16位)
htonl()Host to Network Long主机字节序 -> 网络字节序 (32位)
ntohs()Network to Host Short网络字节序 -> 主机字节序 (16位)
ntohl()Network to Host Long网络字节序 -> 主机字节序 (32位)

6. 代码实战:检测当前系统的字节序

我们可以编写一段简单的 C 代码来检测当前机器是是大端还是小端。

方法一:使用联合体 (Union)

联合体的所有成员共享同一块内存。

#include<stdio.h>intcheck_endian_union(){union{inti;charc;}u;u.i=1;// 0x00000001// 如果是小端,内存中是 01 00 00 00,c 取低地址字节,为 1// 如果是大端,内存中是 00 00 00 01,c 取低地址字节,为 0return(u.c==1);}intmain(){if(check_endian_union()){printf("当前系统是:小端模式 (Little-Endian)\n");}else{printf("当前系统是:大端模式 (Big-Endian)\n");}return0;}

方法二:使用指针强制转换

#include<stdio.h>intcheck_endian_pointer(){inti=1;// 0x00000001// 将 int 指针强制转为 char 指针,指向最低地址的一个字节char*c=(char*)&i;// 如果 *c 是 1,说明低地址存的是 0x01 (低位),即小端return(*c==1);}intmain(){if(check_endian_pointer()){printf("当前系统是:小端模式 (Little-Endian)\n");}else{printf("当前系统是:大端模式 (Big-Endian)\n");}return0;}

7. 总结

  1. 字节序是多字节数据在内存中的存储顺序。
  2. 大端模式:高位在低地址(符合阅读习惯,网络标准)。
  3. 小端模式:低位在低地址(x86架构标准)。
  4. 网络通信:必须统一使用大端模式作为网络字节序。
  5. 编程实践:在涉及网络传输时,务必使用htons,htonl等函数进行转换,不要假设对方的机器字节序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/27 19:23:12

Langchain-Chatchat如何评估问答质量?指标体系构建

Langchain-Chatchat如何评估问答质量&#xff1f;指标体系构建 在企业知识管理日益智能化的今天&#xff0c;一个常见的困境是&#xff1a;员工每天要花数小时查找文档、邮件或内部系统中的信息&#xff0c;而客服面对客户提问时却常常无法快速调取准确答案。尽管大语言模型&am…

作者头像 李华
网站建设 2025/12/27 19:23:10

springboot在线教育系统(11528)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2025/12/27 19:23:08

测了多款AI自动生成PPT工具,真正能用的不到一半

告别PPT制作难题&#xff01;轻竹办公让汇报高效出彩在职场中&#xff0c;年终总结、项目汇报等工作如同一座座大山&#xff0c;压得职场人喘不过气来。为了一份完美的报告&#xff0c;我们常常熬夜修改&#xff0c;好不容易搭建好框架&#xff0c;内容却缺乏亮点&#xff1b;精…

作者头像 李华
网站建设 2025/12/26 3:05:39

springboot星之语明星周边产品销售网站的设计与实现(11529)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2025/12/25 21:48:43

毕设救星:Spring Boot + Neo4j 打造“医疗知识问答”——基于知识图谱的智能导诊平台

🏥 前言:为什么选“医疗问答”? 现在毕设题目里带个“智能”二字才好过。但真正的“医疗大模型”训练成本极高,且容易胡说八道。 “基于知识图谱的问答 (KBQA)” 是完美的替代方案: 准确性高:基于图谱查询,不会产生幻觉(医生说吃药 A,它绝不会说吃药 B)。 可视化强…

作者头像 李华
网站建设 2025/12/26 3:05:35

华为网络设备基本配置命令

1、恢复出出厂设置<Huawei>reset saved-configuration This will delete the configuration in the flash memory.The device configuratio ns will be erased to reconfigure.Are you sure? (y/n)[n]:yClear the configuration in the device successfully. <Huawe…

作者头像 李华