免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wangzhen11aaa
打印 上一主题 下一主题

看网络堆栈时的疑问:数据包内数据何时完成字节序转换 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2011-10-20 12:39 |只看该作者
回复 10# zylthinking
个人也不太确定,需要查资料。

若你查到明确的结果了,欢迎在论坛上分享。

论坛徽章:
0
12 [报告]
发表于 2011-10-20 12:42 |只看该作者
本帖最后由 wangzhen11aaa 于 2011-10-20 12:56 编辑

Endianness of Networking:网络协议的Endianness定义了数据在发送和接收时的byte和bit顺序。
这里介绍一个概念:wire address。处于较低wire address的bit或者byte总是先于处于较高wire address的bit或byte被发送或者接收。  最后的差错检测,会在数据zhen后加上n bit位的 CRC检测码:这里才用bit 序转换,网卡有错误检测功能,假如出现了错误,就简单的抛弃数据。然后启动重传机制,否则就开始确认。
网卡一般来说和它所支持的网络协议保持相同的Endianness type,它可能与所在系统分别拥有不同的Endianness type。大部分网络协议是Big Endianness的.

以太网和802.3的硬件设备都是遵循上述的动作,对于它们来说byte和bit序正好是相反的。网卡需要对bit序列做出调整以符合它所在系统的bit序列,而对于byte序列的调整则需要系统自己来完成
看样子,bit序是由网卡决定的,但是byte序列调整是由系统完成的。具体完成的地点还不清楚。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
13 [报告]
发表于 2011-10-20 12:46 |只看该作者
回复 10# zylthinking
这句话有点不能理解!

网卡硬件只需要把整个bit流按每8个bit组装成1个字节就可以了。

它为什么需要知道CPU的字节序呢?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
14 [报告]
发表于 2011-10-20 13:50 |只看该作者
回复  zylthinking
这句话有点不能理解!

网卡硬件只需要把整个bit流按每8个bit组装成1个字节就可以了。 ...
asuka2001 发表于 2011-10-20 12:46


union{
struct a{
   int b : 1;
   int c : 31;
}d;

int e;
}u;

u u0;
u0.d.b = 1;
   
printf("%d\n", u.e);

在sparc处理器及x86各自运行一遍, 就能知道原因了。 两者对bit序解释不同的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2011-10-20 14:01 |只看该作者
回复 14# zylthinking

我记得之前看过一篇文章,字节序和 bit 序应该是一致的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
16 [报告]
发表于 2011-10-20 14:04 |只看该作者
回复  zylthinking

我记得之前看过一篇文章,字节序和 bit 序应该是一致的。
Godbach 发表于 2011-10-20 14:01


是啊, 所以这代码运行起来肯定非常直接说明问题了, 这是大概前年还是啥时候对这个问题搞糊脑袋的时候, 跑去 unix-center上做实验时的代码

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
17 [报告]
发表于 2011-10-20 14:06 |只看该作者
回复 14# zylthinking

位域的实现我记得c标准是没有规定的,位域本身是不具备可移植性的。这段代码的结果不论机器的bit序是否一致,本身我们也不能肯定他们的结果一定是一样的。

bit序的话,还是举例比较容易说明,假设以下情况:

对于网卡A与网卡B: A为发送方;B为接收方!假设A所在的机器CPU的字节表示其bit序列是01234567,而B所在的机器CPU的字节表示是76543210。

我觉得不论是A还是B,它们发送的时候肯定不能按着CPU来,只能是规定大家都先传7,然后6。。。直到0。

所以他们接收的时候,都是按76543210来接收。只是在给CPU的时候,才会按CPU的bit序来给。

但是这也只是网卡和CPU交互时,bit序需要可能一种协调。

但是字节序,网卡怕是不会管的,毕竟网卡它是不清楚数据里哪些是32 bit的整形,哪些是16 bit的整形对吧,那它依据什么来调整字节序呢?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
18 [报告]
发表于 2011-10-20 14:09 |只看该作者
回复  zylthinking

位域的实现我记得c标准是没有规定的,位域本身是不具备可移植性的。这段代码的结果不 ...
asuka2001 发表于 2011-10-20 14:06


我问得就是这个协调处在什么地方啊, 这个和C标准基本关系不大, 很显然, 就算是basic写出来的发送代码, 如果涉及到协议中有跨字节的位域段, 它也得琢磨琢磨位域怎么拼

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
19 [报告]
发表于 2011-10-20 14:11 |只看该作者
本帖最后由 asuka2001 于 2011-10-20 14:12 编辑

回复 18# zylthinking

其实我难以理解的是,同时想澄清的是:

网卡是不是需要对数据的字节序进行处理?

位域其实感觉和这个问题没啥联系。顺带说句那个一般都是用做标志的居多,当年读到位域没有可移植性的时候我还纳闷linux里用了那么多位域,杂没说linux移植性很差。后来想了好久才想通!

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
20 [报告]
发表于 2011-10-20 14:11 |只看该作者
回复  zylthinking

其实我难以理解的是,同时想澄清的是:

网卡是不是需要对数据的字节序进行处理?
asuka2001 发表于 2011-10-20 14:11



估计不会, 否则 htonl 这些东西就不该存在了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP