计算机网络:网络字节序

目录

一、字节序

1.字节序概念

字节序:内存中存储多字节数据的顺序。

难道存储数据还要看顺序吗?

  yes。内存是按照字节编址与存取的,每个字节都有自己的地址。在存取单字节数据时不需要考虑顺序,因为直接取一个字节就好了。

  但存储多字节数据时需要考虑数据的存储顺序,因为不同的cpu架构的存储顺序不同,因此这里需要知道字节序的分类,以及每一类的特点。(数据存储时从低地址到高地址存储,数据读取时从低地址到高地址读取)

字节序分类:

  1. 大端模式(大端字节序):内存的低地址空间存储数据的高位,即低地址存高位
  2. 小端模式(小端字节序):内存的低地址空间存储数据的低位,即低地址存低位

2.字节序的理解

   比如这里有一个int 型整数 1,int型占据4个字节(也就是32个比特位)大小的内存空间,它的二进制形式是:

  • 0000 0000 0000 0000 0000 0000 0000 0001

  它的十六进制形式是:

  • 0x 00 00 00 01

  如图所示是十六进制的表示形式,注意区分高位和低位。

(1)大端模式存储数据

 在大端模式中整型1是如何存储的?(以32位为例)

 (1)按照大端模式下低地址存高位,低地址会存储00,而这四个字节中的最高地址存储01。

 (2)在系统读取这个整型数据时,就会一次性读取出4个字节,然后按照大端模式对数据进行解读,得到正确的数据序列。

(2)小端模式存储数据

 小端模式中整型1是如何存储的?(以32位为例)

 (1)按照小端模式低地址存低位,四字节的最低地址存储01,四字节的最高地址存储00。

 (2)在系统读取这个整型时,就会一次性读取4个字节,按照小端模式解释数据,得到正确序列。

二、网络字节序

 (1)网络通信就是两端主机之间进行数据传输,两端主机使用的字节序不一定是相同的,这样就会造成数据错乱的情况。

 (2)如果是两台主机之间进行通信,主机A是大端模式,主机B是小端模式。主机A如果要发送一个整型变量1给主机B,发送数据时,数据肯定都是从低地址开始发送的,接收端存储接收的数据时,也是从低地址开始存储数据的。但这样就有了很严重的问题。

 (3)看看主机A的发送顺序,从低地址到高地址开始发送:第一个字节发送00,第二个字节发送00,第三个字节发送00,第四个字节发送01。

 (4)来看看主机B的接收和存储顺序,接受顺序就是主机A的发送顺序,存储时也是按地址从小到大存储的。主机B的低地址存储00,高位存01。

 (5)在主机B读取数据时就会出错了,因为主机B是用低地址来存储低位的。主机B如果要读取这个数据,就会一次性读取出来4个字节,然后按照主机B的字节序进行数据解析(主机B是小端)。然后就出现问题了,按照小端模式对数据进行解析后,得到的数据是这样的:0x 01 00 00 00。完犊子了,直接从1变成了一个很大的数据,这意味着数据会出现二义性。

 (6)上面这个过程如果用一个通俗的例子来说就是,主机A说的是汉语,结果主机B把汉语当成英语进行理解,那肯定会出错啊。

 (7)这样的问题是很严重的,因此网络通信中,要求全都使用网络字节序,而网络字节序是大端字节序。

相关推荐
蓝速科技5 分钟前
固定涉外场景台式翻译机选型与落地指南
网络·人工智能·自然语言处理·语音识别·技术分享
Java小学生丶11 分钟前
[开源自荐] ZTShell,一个使用 Tauri 2 + Rust 全程由 AI 开发的跨平台桌面 SSH 工具
linux·网络·centos7·云服务器·开发技巧·资源分享·个人私货
广州灵眸科技有限公司14 分钟前
灵眸科技EAI3572-Core-L核心板即将发布!八核+4TOPS NPU,面向工业与边缘AI
linux·运维·服务器·数据库·yolo
流浪00114 分钟前
Linux系统篇28——通信(五):信号量专篇:从电影院订票到内核一张大表,把信号量一次讲透
linux·运维·服务器
码农小韩20 分钟前
Linux应用开发(三)——Linux的文件属性与目录
linux·嵌入式软件开发·linux操作系统·嵌入式操作系统·linux应用开发
张洛闻Eren26 分钟前
云原生k8s【第七课】:集群监控与可观测性
linux·运维·docker·云原生·容器·kubernetes·k8s
28 分钟前
Python 图片处理:裁剪缩放至300×200,格式JPG/PNG/GIF,控制大小≤100KB
linux·前端·python
星 海2 小时前
【网络】VirtualBox网络模式
网络·虚拟机·virtualbox·vm
测试猿实操笔记8 小时前
DNS 通俗讲解:域名 ↔ IP 翻译
网络·网络协议·tcp/ip