TCP/IP网络编程之字节序和网络字节序

Posted justzhuzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP网络编程之字节序和网络字节序相关的知识,希望对你有一定的参考价值。

一、概要

本篇文章主要讲解基于.net中tcp/ip网络通信编程中的网络字节序。在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家。技术的进步源自于分享和不断的自我突破。

技术交流QQ群:580749909  欢迎交流有问必答,文章尾有个人的微信公众号有兴趣的小伙伴多多关注。

二、简介

在此之前我们需要了解清楚几个概念。

CPU架构:人们常说的x86 x64是一种架构,但是他有32位的和64位的。32位的叫x86 ,后来出现基于它的64位版,就叫x64。

操作系统位数 :64位的系统是基于64位处理器而来的,所以64位的系统能在64位的处理器上运行,但是不能在32的处理器上运行!

而因为64位处理器是基于32位的X86而来,所以向后兼容,支持32位的系统!

情况如下:

64位处理器(X64):64位系统,32位系统

32位处理器(X86):32位系统。64位处理器也能跑16位系统。

只不过进了长模式之后,不再兼容16位指令了而已。开机之后如果没进长模式,还是可以跑16位指令的。

什么是字节序和网络字节序?

网络字节序 是TCP/IP中规定好的一种数据表示格式,跟CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。

主机字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前。

 只要是Intel或AMD的x86/x64架构就一定是小端主机字节序。

 

三、主要内容

为什么会有“字节序”的概念,因为有不同架构的CPU所以每种CPU的保存数据方式均不同。

CPU向内存保存数据的方式有两种,相对应解析方式也有2种:

大端序(Big Endian):高位字节存放到低位地址。

小端序(Little Endian):高位字节存放到高位地址。

技术图片

整数中0x12345678, 0x12是最高位字节,0x78是最低位字节。因此大端程序中先保存最高位字节0x12(最高位字节0x12存放到低位地址)

技术图片

先保存的是最低位字节0x78。从以上分析可以看出,每种CPU的数据保存方式不同。因此代表CPU 数据保存数据方式的主机字节序在不同CPU中,也各不相同。

技术图片

大端序系统传输数据0x1234时为考虑字节序问题,直接以0x12、0x34的顺序发送。结果接收端以小端方式保存数据,因此小端序接收的数据编程了0x3412。

这样传输小端序系统不是没法用了吗?这时候就约定统一处理方式,统一按照大端序来处理就行了。怎么处理呢.net中有专门的函数来处理这个问题。

技术图片

 

技术图片

以上是关于TCP/IP网络编程之字节序和网络字节序的主要内容,如果未能解决你的问题,请参考以下文章

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

主机字节序和网络字节序

网络字节序和主机字节序

主机字节序和网络字节序

Python网络编程——主机字节序和网络字节序之间的相互转换

主机序和网络序以及使用例子