通过网络传输的字节存放方式时什么

通过网络传输的字节存放方式时什么,在网络上进行数据流的传输是逆序进行传输的(协议头中某些字段),所谓的逆序就是说:多字节在赋值的时候是逆序赋值的,这个赋值是程序人员自己手动逆序后赋值的。可以通过函数inet_addr(),htonl(),htons()…等等。这样存放后相当于是大数端对齐。但是和大数端对齐是完全的两个概念。

内存数据的存放方式分为小数端对齐和大数端对齐。大部分内存是小数端对齐(即低字节在低地址,以低地址为基地址)。小部分厂商的内存呢是大数端对齐,它的存放方式和前者反之。

如:存储0×1234

小数端对齐            大数端对齐

addr 1:         0×34                    0×12

addr 2:         0×12                    0×34

      在小数端对齐的内存存储方式下,网络上如果某字段赋值为0×1234,也需要将其逆序。也就是将其转化为大数端的那样存储。这样转化的好处就是,网络上识别的比特流,他只是从低字节开始识别,他不会管你的内存是如何存储数据的。所以,需要逆序。这样的存储只是和大数端相似,而不是大数端对齐,就是因为,这是手动转化的,内存的存储模式还是小数端对齐。而在大数端对齐的方式下,是自动转化的。

所以,我认为:发送数据包时,在网络上的协议字段中字节数超过一个字节的字段都得进行逆序,例如:源、目的IP是u32(4字节),在赋值的时候,都进行了逆序。如果是10.1.3.11,需转化为0x0b03010a。

当然,在接受数据包的时候,要恢复出IP地址,就得将转序收到的IP,这样才能得出真正的Ip地址。如果,我们把收到得包(从mac地址开始)按字节以16进制打印出来,得到的打印数据按协议分析,这时,我们看到得数据就是方想要发送的数据包。

例如:发送方的IP为10.1.3.11,包长为92

不转序赋值:ip->sip = 0x0a01030b,   p->len  = 0x005c;

转序后赋值:ip->sip  = 0x0b03010a,  p->len  = 0x5c00;

下面为数据在内存中的存放方式:

不转序赋值        转序后赋值                 接受方收到得数据存放

add1:      0x5c                 0×00                              0×00

add2:      0×00                 0x5c                              0x5c

add3:      0x0b                 0x0a                              0x0a

add4:      0×03                 0×01                              0×01

add5:      0×01                 0×03                              0×03

add6:      0x0a                 0x0b                              0x0b 本文链接地址: 通过网络传输的字节存放方式时什么