關於網絡傳輸之字節存放方式

     在網絡上進行數據流的傳輸是逆序進行傳輸的(協議頭中某些字段),所謂的逆序就是說:多字節在賦值的時候是逆序賦值的,這個賦值是程序人員自己手動逆序後賦值的。可以通過函數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

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章