Ethernet下字节序和bit序的总结

Ethernet下字节序和bit序的总结

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

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

正文开始:

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

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

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

Ethernet下字节序和bit序的总结_第1张图片

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

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

Ethernet下字节序和bit序的总结_第2张图片

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

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

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

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

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

Ethernet下字节序和bit序的总结_第3张图片

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

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

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

Ethernet下字节序和bit序的总结_第4张图片

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

Ethernet下字节序和bit序的总结_第5张图片

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

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

Ethernet下字节序和bit序的总结_第6张图片

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

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

Ethernet下字节序和bit序的总结_第7张图片

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

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

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

Ethernet下字节序和bit序的总结_第8张图片

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的定义为例:

Ethernet下字节序和bit序的总结_第9张图片

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

Ethernet下字节序和bit序的总结_第10张图片

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

Ethernet下字节序和bit序的总结_第11张图片

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

Ethernet下字节序和bit序的总结_第12张图片

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

这里有一个很重要的信息,就是网卡要遵从的一个原则:就是在发送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.

Ethernet下字节序和bit序的总结_第13张图片

你可能感兴趣的:(网络,linux)