from:
下面這些tcp/ip資料報是我在進行socket及wipcap網路程式設計過程中曾經用到過的資料報結構體, 這些東西平時看起來不起眼,真正用到的時候就會覺得非常有用......
/*物理幀頭結構*/
typedef struct dlc_header;
/*ip報頭結構*/
typedef struct ip_header;
長度:20個位元組
/*tcp報頭*/
typedef struct tcp_header;
//tcp偽首部 用於進行tcp校驗和的計算,保證tcp效驗的有效性
typedef structpsd_header;
/*udp報頭*/
typedef struct udp_header;
//udp偽首部-僅用於計算校驗和
typedef struct tsd_hdr
psd_header;
/*icmp報頭*/
typedef struct icmp_header;
//arp幀結構
typedef struct arp_frame;
/*dns資料報頭*/
typedef struct dns_header;
//這是dns包的公共部分,即查詢包及應答包都含有這部分,由於查詢問題(domain)大小無法確定,因此這裡不好將其及其以後的資料寫入結構體中
from:
大多數程式設計師所接觸到的套接字(socket)為兩類:
(1)流式套接字(sock_stream):一種面向連線的socket,針對於面向連線的tcp服務應用;
(2)資料報式套接字(sock_dgram):一種無連線的socket,對應於無連線的udp服務應用。
從使用者的角度來看,sock_stream、sock_dgram這兩類套接字似乎的確涵蓋了tcp/ip應用的全部,因為基於tcp/ip的應用,從 協議棧的層次上講,在傳輸層的確只可能建立於tcp或udp協議之上(圖1),而sock_stream、sock_dgram又分別對應於tcp和 udp,所以幾乎所有的應用都可以用這兩類套接字實現。
圖1 tcp/ip協議棧
但是,當我們面對如下問題時,sock_stream、sock_dgram將顯得這樣無助:
(1) 怎樣傳送乙個自定義的ip包?
(2) 怎樣傳送乙個icmp協議包?
(3) 怎樣使本機進入雜糅模式,從而能夠進行網路sniffer?
(4) 怎樣分析所有經過網路的包,而不管這樣包是否是發給自己的?
(5) 怎樣偽裝本地的ip位址?
這使得我們必須面對另外乙個深刻的主題――原始套接字(raw socket)。raw socket廣泛應用於高階網路程式設計,也是一種廣泛的黑客手段。著名的網路sniffer、拒絕服務攻擊(dos)、ip欺騙等都可以以raw socket實現。
raw socket與標準套接字(sock_stream、sock_dgram)的區別在於前者直接置"根"於作業系統網路核心(network core),而sock_stream、sock_dgram則"懸浮"於tcp和udp協議的外圍,如圖2所示:
圖2 raw socket與標準socket
當我們使用raw socket的時候,可以完全自定義ip包,一切形式的包都可以"製造"出來。因此,本文事先必須對tcp/ip所涉及ip包結構進行必要的交待。
目前,ipv4的報頭結構為:
版本號(4)
包頭長(4)
服務型別(8)
資料報長度(16)
標識(16)
偏移量(16)
生存時間(8)
傳輸協議(8)
校驗和(16)
源位址(32)
目的位址(32)
選項(8)
.........
填充
對其進行資料結構封裝:
typedef struct _iphdr //定義ip報頭
ip_header;
或者將上述定義中的第一位元組按位拆分:
typedef struct _iphdr //定義ip報頭
ip_header;
更加嚴格地講,上述定義中h_len、ver欄位的記憶體存放順序還與具體cpu的endian有關,因此,更加嚴格的ip_header可定義為:
typedef struct _iphdr //定義ip報頭
ip_header;
tcp報頭結構為:
源埠(16)
目的埠(16)
序列號(32)
確認號(32)
tcp偏移量(4)
保留(6)
標誌(6)
視窗(16)
校驗和(16)
緊急(16)
選項(0或32)
資料(可變)
對應資料結構:
typedef struct psd_hdr //定義tcp偽報頭
psd_header;
typedef struct _tcphdr //定義tcp報頭
tcp_header;
同樣地,tcp頭的定義也可以將位域拆分:
typedef struct _tcphdr
tcp_header;
udp報頭為:
源埠(16)
目的埠(16)
報文長(16)
校驗和(16)
對應的資料結構為:
typedef struct _udphdr //定義udp報頭
udp_header;
icmp協議是網路層中乙個非常重要的協議,其全稱為internet control message protocol(網際網路控制報文協議),icmp協議彌補了ip的缺限,它使用ip協議進行資訊傳遞,向資料報中的源端節點提供發生在網路層的錯誤資訊 反饋。icmp報頭為:
型別(8)
**(8)
校驗和(16)
訊息內容
常用的回送與或回送響應icmp訊息對應資料結構為:
typedef struct _icmphdr //定義icmp報頭(回送與或回送響應)
icmp_header;
常用的icmp報文包括echo-request(響應請求訊息)、echo-reply(響應應答訊息)、destination unreachable(目標不可到達訊息)、time exceeded(超時訊息)、parameter problems(引數錯誤訊息)、source quenchs(源抑制訊息)、redirects(重定向訊息)、timestamps(時間戳訊息)、timestamp replies(時間戳響應訊息)、address masks(位址掩碼請求訊息)、address mask replies(位址掩碼響應訊息)等,是internet上十分重要的訊息。後面章節中所涉及到的ping命令、icmp拒絕服務攻擊、路由欺騙都與 icmp協議息息相關。
另外,本系列文章中的部分源**參考了一些優秀程式設計師的開源專案,由於篇幅的關係我們不能一一枚舉,在此一併表示感謝。
TCP IP資料報結構詳解
tcp ip 資料報 結構 詳解 網路 協議 一般來說,網路程式設計我們只需要呼叫一些封裝好的函式或者元件就能完成大部分的工作,但是一些特殊的情況下,就需要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,但是它是網際網路的基礎,在各方面都有廣泛的應用。由ip協...
TCP IP資料報結構詳解
tcp ip 資料報 結構 詳解 網路 協議 一般來說,網路程式設計我們只需要呼叫一些封裝好的函式或者元件就能完成大部分的工作,但是一些特殊的情況下,就需要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,但是它是網際網路的基礎,在各方面都有廣泛的應用。由ip協...
TCP IP資料報結構詳解
這篇文章很好,tcp ip 資料報 結構 詳解 網路 協議 一般來說,網路程式設計我們只需要呼叫一些封裝好的函式或者元件就能完成大部分的工作,但是一些特殊的情況下,就需要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,但是它是網際網路的基礎,在各方面都有廣泛的...