Ethernet下字节序和bit序的总结

2023-05-16

Ethernet下字节序和bit序的总结

本文讲述的是在ethernet中多字节数据发送时涉及到字节序和bit序的剖析。

关于字节序(大小端)和bit序,以及MSB和LSB的叙述,请另行学习,本篇不涉及。

正文开始:

对于多字节数据的发送(ethernet上是一个字节一个字节的传送数据的,故,对于多字节的数据,必然存在要先发送哪个字节,后发送哪个字节的顺序问题),这个很多文章都讲清楚了,这里快速过一下:

比如要发送4字节的int型数据0x12345678, 由于网络上要求的是大端字节序,那么要求发送的字节顺序为0x12,0x34,0x56,0x78.

假如,当前系统为小端系统,那么0x12345678在内存中的分布如下:

即在小端系统中,低位数据存储在低地址,高位数据存储在高位地址。

如果,当前系统为大端系统,则0x12345678在内存中的分布如下:

即在大端系统中,低位数据存储在高地址,高位数据存储在低地址。

当网卡往外发送数据时,都是从低地址开始,一个字节一个字节的发送,直到所有数据发送完毕。

当网卡接收数据时,将收到的字节存放在低地址,然后后面接收的字节按顺序存储在前一个字节的内存地址的下一个内存字节(地址升序)。

按照上述的原理,假设,我们不遵从网络字节序(大端)的要求,小端系统pc1要发送数据0x12345678,则发送的字节依次为0x78, 0x56, 0x34, 0x12。

接收端pc2收到的数据依次为0x78, 0x56, 0x34, 0x12。这些数据在接收端系统内存的分布和发送端是一样的,如下图:

如果接收端pc2也是小端系统,那么这4个字节的数据会被解析成0x12345678,和发送端pc1一样,此时,不会有什么问题。

但是,如果接收端pc2是大端系统,那么这4个字节的数据会被解析成0x78563412, 这就不是pc1想给pc2的数据了。

如果pc1和pc2都遵从网络字节序,pc1在发送之前,先将0x12345678转成网络字节序,转换后的内存数据分布如下:

然后再发送,这时的发送的字节依次为0x12, 0x34, 0x56, 0x78;接受端pc2也依次收到数据0x12, 0x34, 0x56, 0x78, 并存放在内存中,如下:

然后pc2在使用这块内存中的数据之前,先将网络字节序转换成本地字节序。

如果本地是大端字节序,则不变换,内存中的分布如下:

这些数据在大端系统中被解析为0x12345678, 和发送端pc1的数据一致。

如果本地是小端字节序,则进行大小端变换,变换后,内存中的分布如下:

这些数据在小端系统中被解析为0x12345678, 和发送端pc1的数据一致。

下面,我们要讲讲bit序的问题了(这个问题,到目前位置,我好像没有看到过有讲得很清楚的文章,而且有些讲的还是不正确的)。

首先,我们要明确,网卡芯片发送和接收数据管脚,都只用一根,如下图的intel I210芯片:

I210通过NC-SI(network controller side-band interface)接口连到MC(manageability controller),只使用NC_SI_TXD0和NCSI_RXD0。

所以,网卡芯片发送数据,只在NC_SI_TXD0管脚,一个bit一个bit的发送。

假设pc1要发送一个字节的数据,是怎么发送的呢?是先发送bit0还是bit7?与大小端系统中有什么联系?

我们以内核中iphdr的定义为例:

从上述定义中可知,如果是小端系统,那么定义bit0 ~ bit3为ihl, bit4 ~ bit7为version, 即:

而RFC中定义的Ip头的结构如下:

可以看到,ihl和version在本地定义和RFC中的定义是相反的,RFC中的定义如下:

两则不一致,为什么能工作不出错呢?

这里有一个很重要的信息,就是网卡要遵从的一个原则:就是在发送bit数据的时候,先发送MSB,最后发送LSB,即先发送最高有效bit位,最后发送最低有效bit位;网卡在接收bit数据的时候,同样认为,先收到MSB,最后收到的位LSB,即先收到最高有效bit,最后收到最低有效bit。

小端系统,MSB为bit7, LSB为bit0

大端系统,MSB为bit0, LSB为bit7

比如,在小端系统中,网卡发送bit数据时,依次发送bit7, bit6, bit5, bit4, bit3, bit2,bit1,bit0.

在大端系统中,网卡发送bit数据时,依次发送bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7.

这样来看,内核中定义的iphdr结构和RFC上对应了起来。

同样的,在小端系统,网卡收到bit数据时,依次存放在bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0.

在大端系统中,网卡收到bit数据时,依次存放在bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ethernet下字节序和bit序的总结 的相关文章

  • Windows设置本地DNS域名解析Hosts

    DNS Domain Name System 域名系统 xff1a 为了加快定位IP地址的速度 将域名映射进行层层缓存的系统 目的 xff1a 互联网通过IP xff08 10 223 146 45 xff09 定位浏览器建立连接 xff0
  • 机器学习之缺失样本重采样策略

    1 引言 在机器学习领域中 对不均衡数据集进行建模是我们训练模型时经常遇到的挑战 比如在分类问题上 训练集上类别的平衡对模型建模起着重要作用 如果直接对类间不平衡的数据进行建模 xff0c 即数据集中存在少数类 xff0c 这样训练好的模型
  • aptitude与apt-get

    aptitude 与 apt get 一样 xff0c 是 Debian 及其衍生系统中功能极其强大的包管理工具 与 apt get 不同的是 xff0c aptitude 在处理依赖问题上更佳一些 举例来说 xff0c aptitude
  • js 冒泡排序、函数(function)

    一 冒泡排序 原理 数组中的元素两个两个进行比较 xff0c 如果前面的数大于后面的数就进行交换 xff0c 如果前面的数小于后面的数不交换位置 xff0c 后面的继续和下一个进行比较 整体代码 xff1a 冒泡排序 var arr 10
  • python 中Dict 转 Json

    最近在公司需要写个小工具 xff0c 运用到的python xff0c 然后需要将Dict转成Json 之前遇到转换Json失败 xff0c 然后以为复杂的Entity结构 xff0c 不能用Json的库Json dump xff0c 进行
  • Zabbix监控

    由于本人工作职责的一部分 xff0c 需要用Zabbix监控 xff0c 所以在此贴一下Zabbix监控 实在觉得Zabbix监控做的太牛掰 xff0c 先打Tag xff0c 周末再来补全
  • 看完23岁的我在干嘛之后有感

    现在我已经25岁了 xff0c 先说我23岁的时候吧 xff0c 23岁我在干嘛 xff0c 刚上研究生 xff0c 好像貌似一切都挺顺的 xff0c 考研成功 xff0c 进入北京比较好的一所大学读计算机 xff1b 然后是和前任分手 x
  • Libev源码解析

    最近在看libev源码 xff0c 算是对libev的源码有个比较清晰的了解 总共分3部分来介绍libev 1 Libev是什么 Libev是基于Reactor模式的一个高性能 xff0c 支持高并发的事件库 它本身不仅支持IO xff0c
  • Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面 .相机.录影机....

    Android开发之Intent跳转到系统应用中的拨号界面 联系人界面 短信界面 现在开发中的功能需要直接跳转到拨号 联系人 短信界面等等 xff0c 查找了很多资料 xff0c 自己整理了一下 安装已经存在的apk String file
  • C++ STL中判断list为空,size()==0和empty()有什么区别

    关于两个的区别 xff0c 首先size 61 61 0为bool表达式 xff0c empty 为函数调用 xff0c 这一点很明显 查看源代码 xff0c bool empty const return M node gt M next
  • docker port

    一 码云 https gitee com login 用户名 xff1a cakin24 二 为什么要端口映射 在启动容器时 xff0c 如果不配置宿主机器与容器的端口映射 xff0c 外部程序是无法访问容器的 xff0c 因为没有端口 三
  • 安装和删除Ubuntu双系统

    一 制作系统硬盘 1 在官网下载镜像文件 xff1a ubuntu 18 04 6 desktop amd64 iso 地址 xff1a 下载Ubuntu桌面系统 Ubuntu 注 xff1a 这里的LTS Long Term Suppor
  • 安装Intellij,编译第一个android程序出错

    今天安装了最新的Intellij社区最新版 xff0c 安装完成后 xff0c 发现编译第一个android程序 xff0c 出现如下编译错误 Cannot run program 34 D Android platform tools a
  • Bootstrap的select组件动态添加的数据不显示

    bootstrap中的select属性 xff0c 如果是动态添加的元素 xff0c 会出现页面不显示的问题 lt select class 61 34 form control form control lg 34 id 61 39 my
  • VScode 自定义主题颜色

    vscode其实已经有很多完善且好看的主题了 xff0c 但我总觉得每一个主题对我来说 xff0c 都有那么一点点不够完美 xff0c 比如亮色的主题 xff0c 颜色就没有深色主题那么好看 xff0c 对比度高 好不容易看到一个好看的主题
  • IIC详解,包括原理、过程,最后一步步教你实现IIC

    IIC详解 1 I2C总线具有两根双向 信号线 xff0c 一根是数据线SDA xff0c 另一根是时钟线SCL 2 IIC总线上可以挂很多设备 xff1a 多个主设备 xff0c 多个从设备 xff08 外围 设备 xff09 上图中主设
  • 飞控板不用看得高大上,本质就是STM32加那几个传感器,和平衡车板子差不多,是完全可以自己画的,甚至不用画,买个STM32核心板+十轴模块

    你自己画一块板子 xff0c 然后真正飞成了 xff0c 我觉得你会非常开心的 xff0c 这种感觉不一样的我觉得 xff0c 你说是不是 飞控我们不用看得高大上 xff0c 本质还是STM32加传感器 xff0c 可能和平衡车的差不多 x
  • 搜刮来的PID进阶

    PID 原理普及 1 对自动控制系统的基本要求 xff1a 稳 准 快 xff1a 稳定性 xff08 P和I降低系统稳定性 xff0c D提高系统稳定性 xff09 xff1a 在平衡状态下 xff0c 系统受到某个干扰后 xff0c 经
  • C语言中<>和“”引用头文件的区别

    区别如下 xff1a 1 lt gt 先去系统目录中找头文件 xff0c 如果没有再到当前目录下找 所以像标准的头文件 stdio h和 stdlib h等用这个方法 2 34 34 首先在当前目录下寻找 xff0c 如果找不到 xff0c
  • ACfly中的Parameters.c参数部分

    typedef enum MAV PARAM TYPE MAV PARAM TYPE UINT8 61 1 8 bit unsigned integer MAV PARAM TYPE INT8 61 2 8 bit signed integ

随机推荐

  • C++Primer第五版 习题答案 目录

    C 43 43 Primer第五版 习题答案 本文当作我学习C 43 43 的一个记录 xff0c 这里的习题答案并不是标准答案 xff0c 仅仅是我的理解 xff0c 如有错误 xff0c 请大家指出 xff0c 谢谢 xff01 参考的
  • C++Primer第五版 习题答案 第六章 函数(Functions)

    练习6 1 实参和形参的区别的什么 xff1f 形参在函数的定义中声明 xff1b 实参是形参的初始值 练习6 2 请指出下列函数哪个有错误 xff0c 为什么 xff1f 应该如何修改这些错误呢 xff1f span class toke
  • Dockerfile的CMD指令

    一 Docker的CMD指令 The main purpose of a CMD is to provide defaults for an executing container CMD在容器运行的时候提供一些命令及参数 xff0c 用法
  • usb供电相关

    1 针对集线器端口上的电涌警告 xff1a 在 设备管理器 gt 通用串行总线控制器 xff0d USB Root Hub gt 电源 中可以看到 xff0c 正在使用的USB设备的耗 由于频繁的插拔USB设备 xff0c 或在USB设备传
  • PHP四种设计模式

    1php常见开发模式 xff1a 1 单列模式 2 工厂模式 3 观察者模式 4 策略模式 2设计模式实例 1 单例模式 单例模式顾名思义 xff0c 就是只有一个实例 作为对象的创建模式 xff0c 单例模式确保某一个类只有一个实例 xf
  • CAN总线基础知识(一)

    1 xff0e CAN总线是什么 xff1f CAN xff08 Controller Area Network xff09 是ISO国际标准化的串行通信协议 广泛应用于汽车 船舶等 具有已经被大家认可的高性能和可靠性 CAN控制器通过组成
  • 【ROS Gazebo专题】二、Gazebo的使用上

    跳的比较快 xff0c 别人光介绍基础以及ros的基本操作就写了十几二十篇 xff0c 我一下就跳到了Gazebo这 xff0c 可怕有没有 其实原因很简单 xff0c 如果你将ros官网的基础篇章练习完了 xff0c 在最后一篇 wher
  • 程序员也该懂点UI细节

    虽然说项目开发过程中 xff0c 美工和程序各司其职 但是很多时候程序员本身也要知道一些UI设计的细节 一 每个页面的功能上要突出重点 比如说你首页是想引导更多用户注册的话 xff0c 你就要把注册按钮突出出来 如果你首页是你想引导用户更快
  • ftp 客户端软件的传输模式ASCII和二进制

    FTP可用多种格式传输文件 xff0c 通常由系统决定 xff0c 大多数系统 包括UNIX系统 只有两种模式 xff1a 文本模式和二进制模式 文本传输器使用ASCII字符 xff0c 并由回车键和换行符分开 xff0c 而二进制不用转换
  • 一步一步定制自己的google map(各个省市的经纬度查询)

    安徽省 合肥 北纬31 52 东经117 17 安徽省 安庆 北纬30 31 东经117 02 安徽省 蚌埠 北纬32 56 东经117 21 安徽省 亳州 北纬33 52 东经115 47 安徽省 巢湖 北纬31 36 东经117 52
  • 网页刷新或者重新加载后滚动条的位置不变

    在开发的过程中我们经常需要重新加载或者刷新某个画面 xff0c 已确保数据显示是最新的 但是如果一丁点改变就刷新画面的话 xff0c 会导致用户体验很差 xff0c 想想看你好不容易把网页拖到最后 xff0c 结果点击某个按钮的时候 xff
  • 番茄工作法(番茄钟时间管理)

    番茄工作法是我一次偶然的时间在网上看到的 xff0c 因为自己性格大大咧咧 丢三落四 xff0c 所以经常容易在时间问题上犯迷糊 很多人都有时间拖沓症 xff0c 就是一件事不到最后阶段不去解决它 比如你有一个星期的时间写的毕业论文 xff
  • jquery中美元符号($)命名冲突

    在Jquery中 xff0c 是JQuery的别名 xff0c 所有使用 的地方也都可以使用JQuery来替换 xff0c 如 39 msg 39 等同于JQuery 39 msg 39 的写法 然而 xff0c 当我们引入多个js库后 x
  • Django的密码操作

    一 关于密码操作的思维导图 二 修改密码内置函数源码 64 sensitive post parameters 64 csrf protect 64 login required 64 deprecate current app def p
  • js实现省市联动

    效果图如下 xff1a 思路很简单 xff0c 就是先加载省信息 xff0c 然后当省改变的时候加载市县信息 烦的是数据的录入 xff0c 代码如下 lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 T
  • 正则在小偷程序中的应用(续)

    获取资源信息 content 61 file get contents 34 http list sososteel com qg list html pg 61 1 amp h 61 34 time 对抓取的信息进行处理 取class为l
  • mysql密码过期问题解决方案

    mysql密码过期问题解决方案 问题再现 xff1a 密码过期 旧电脑许久没有用 xff0c 今天打开发现数据库连接不上了 提示密码过期 xff0c 请修改密码 ERROR 1862 HY000 Your password has expi
  • Fast RTPS(DDS) 安装指南

    Foonathan Memory 在构建 Fast DDS 之前 xff0c 需要先安装 Foonathan Memory 依赖 span class token function git span clone https github c
  • ubuntu的两种软件安装方式

    第一种 xff1a sudo apt get install xxxxxxx 第二种 xff1a sudo dpkg i xxxx deb 参考文章
  • Ethernet下字节序和bit序的总结

    Ethernet下字节序和bit序的总结 本文讲述的是在ethernet中多字节数据发送时涉及到字节序和bit序的剖析 关于字节序 大小端 和bit序 xff0c 以及MSB和LSB的叙述 xff0c 请另行学习 xff0c 本篇不涉及 正