在網路上進行資料流的傳輸是逆序進行傳輸的(協議頭中某些字段),所謂的逆序就是說:多位元組在賦值的時候是逆序賦值的,這個賦值是程式人員自己手動逆序後賦值的。可以通過函式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
TCP網路傳輸方式
tcp和udp區別 1.tcp面向連線 udp是不面向連線 2.tcp提供可靠的資料傳輸,也就是說,通過tcp連線傳送的資料,無差錯,不丟失,不重複,且按序到達 udp不保證可靠的資料傳輸,容易出現丟包情況 3.tcp需要連線傳輸速度慢,udp不需要連線傳輸速度快 4.tcp不支援發廣播 udp支援...
網路 傳輸方式的分類
面向有鏈結型 面向無連線型 面向無連線性,則不需要建立和斷開連線的處理。傳送端可以隨時自由傳送資料。同時,接收端也不知道自己會在何時何地從 接收到資料,因此,在面向無連線的傳送情況下,接收端需要時常確認自己是否收到了傳送端發來的資料 這就相當於我們網上購物,快遞員不需要確認收貨位址是否正確,只要賣家...
網路傳輸之網路協議
之所以說神奇的網路協議,是因為網路本身就覺得很神奇。當我想要給乙個小夥伴傳輸檔案時,我們兩個人看到的都是一樣的介面,就像通過qq,今目標傳送檔案時,檔案傳輸速度,傳到了多少,都是一樣的,但是我們實際上卻隔著千山萬水。這篇文章就來說一說,是如何實現傳輸的。這篇文章,是郭凱師哥點燃了自己對這方面的興趣,...