Linux 服务器编程
  • Introduction
  • First Chapter
  • 文件I/O
    • 基于文件描述符的I/O操作
      • Linux 文件系统
      • 常用文件操作函数
    • 基于流的I/O操作
  • I/O模型
    • 概念理解
    • 对比五种I/O模型
    • select、poll、epoll简介
  • TCP / IP
    • OSI七层协议模型与TCP/IP四层模型
  • Socket
    • 基础
      • 什么是socket?
      • IPV4 套接口地址结构
      • 网络字节序
      • 字节序转换函数与地址转换函数
    • TCP客户端/服务器模型
    • Socket 相关函数
      • 使用socket()函数创建套接字
      • 使用bind()和connect()函数
      • 使用listen()和accept()函数
      • 使用read()和write()函数
    • 回射客户端/客户端的实现
    • 附录*资料
  • 附录*Linux常见信号
  • 多进程编程
    • 共享内存
    • fork函数
    • fork与vfork的区别
  • 附录*资料
  • 五种I/O模型
Powered by GitBook
On this page
  • 举例
  • 为什么要统一字节序?引入字节序的概念?
  • 检测是小端字节序还是大端字节序?
  • 资料

Was this helpful?

  1. Socket
  2. 基础

网络字节序

PreviousIPV4 套接口地址结构Next字节序转换函数与地址转换函数

Last updated 5 years ago

Was this helpful?

字节序(Endian):分为大端字节序和小端字节序。

“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

大端字节序(Big Endian) :最高有效位(MSB:Most significant Bit)存储于最低内存地址处。最低有效位(LSB:Lowest significant Bit)存储于最高内存地址处。

小端字节序(Little Endian) :最高有效位(MSB:Most significant Bit)存储于最高内存地址处。最低有效位(LSB:Lowest significant Bit)存储于最低内存地址处。

举例

注意 0x12345678 是一个16进制的地址,表示一个内存地址。占四个字节。

为什么占4个字节?

1个字节是8位,最多表示0到256

而一位16最多只表示到16,即F表示16,要表示到256,就还需要第二位,

所以1个字节占2个16进制位

一个16进制位占0.5个字节

为什么要统一字节序?引入字节序的概念?

因为socket它能够实现异构系统间通信,不同的硬件平台,对这样一个整数它的存放 形式是不一样的,有的机器它采用的是大端字节序,有的机器它采用的是小端字节序 来进行存放,那么这样一个数字如果传输至对等方时,对等方就无法解析了,特别是 字节序不同,解析出来的数据就会相反,这时候就得统一字节序,将这些数据传输的时候 统一成一个字节序,那么统一出来字节序我们把他称为是网络字节序,这个网络字节序规定 的是大端字节序。

那我们要传输这样一个整数的时候呢,就需要将主机上面的字节序(有可能是大端字节序,也有 可能是小端字节序),

如图:假定A就是大端字节序,假定B就是小端字节序

假设主机A 传输数据到主机B,主机A先要将字节序转换成网络字节序,到达B端时候 又要将网络字节序转换成主机字节序。

那么A它转换成网络字节序的时候是不需要进行调整的,直接传输 接下来,网络字节序转换成B主机的字节序,那么就需要把它颠倒过来(因为网络字节序是大端字节序,而B主机是小端字节序) 这样B才能正确解析出来整数。

检测是小端字节序还是大端字节序?

c语言

#include <stdio.h>

int main(void){
    unsigned int x = 0x12345678;
    unsigned char *p  = (unsigned char*)&x;
    printf("%0x_%0x_%0x_%0x\n", p[0], p[1], p[2], p[3]);
    return 0;
}

输出结果:

78_56_34_12

资料

Big Endian和Little Endian的区别
网络通信之 字节序转换原理与网络字节序、大端和小端模式