关于网络传输之字节存放方式

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

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

     例如:存储0x1234

                          小数端对齐            大数端对齐

      addr 1:         0x34                    0x12  

      addr 2:         0x12                    0x34

 

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

    所以,我认为:发送数据包时,在网络上的协议字段中字节数超过一个字节的字段都得进行逆序,例如:源、目的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                 0x00                              0x00   

    add2:      0x00                 0x5c                              0x5c

    add3:      0x0b                 0x0a                              0x0a

    add4:      0x03                 0x01                              0x01

    add5:      0x01                 0x03                              0x03

    add6:      0x0a                 0x0b                              0x0b

你可能感兴趣的:(c,网络,存储)