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