计算机网络:网络字节序

目录

一、字节序

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

相关推荐
城南云小白7 分钟前
Linux网络服务只iptables防火墙工具
linux·服务器·网络
咩咩大主教8 分钟前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
羌俊恩13 分钟前
视频服务器:GB28181网络视频协议
服务器·网络·音视频
Flying_Fish_roe35 分钟前
linux-网络管理-网络配置
linux·网络·php
FuLLovers38 分钟前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言
xuanyu222 小时前
Linux常用指令
linux·运维·人工智能
hellojackjiang20112 小时前
即时通讯框架MobileIMSDK的H5端开发快速入门
网络·即时通讯·im开发
有时间要学习2 小时前
Linux——应用层自定义协议与序列化
linux·服务器·网络
阑梦清川2 小时前
简明linux系统编程--互斥锁--TCP--UDP初识
linux·udp·tcp·互斥锁·信号·解锁·加锁
hardStudy_h2 小时前
Linux——常用系统设置和快捷键操作指令
linux·运维·服务器