大多數程式設計師所接觸到的套接字(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,所以幾乎所有的應用都可以用這兩類套接字實現。
但是,當我們面對如下問題時,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所示:
當我們使用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協議息息相關。
另外,本系列文章中的部分源**參考了一些優秀程式設計師的開源專案,由於篇幅的關係我們不能一一枚舉,在此一併表示感謝。
原始套接字 概述
大多數程式設計師所接觸到的套接字 socket 為兩類 1 流式套接字 sock stream 一種面向連線的socket,針對於面向連線的tcp服務應用 2 資料報式套接字 sock dgram 一種無連線的socket,對應於無連線的udp服務應用。從使用者的角度來看,sock stream s...
原始套接字
資料出處 實際上,我們常用的網路程式設計都是在應用層的報文的收發操作,也就是大多數程式設計師接觸到的流式套接字 sock stream 和資料報式套接字 sock dgram 而這些資料報都是由系統提供的協議棧實現,使用者只需要填充應用層報文即可,由系統完成底層報文頭的填充並傳送。然而在某些情況下需...
原始套接字
參考1 原始套接字能幹什麼?參考2 原始套接字抓包實踐 參考3 各層頭結構 通過原始套接字,我們可以抓取所有傳送到本機的ip包 包括ip頭和tcp udp icmp包頭 也可以抓取所有本機收到的幀 包括資料鏈路層協議頭 普通的套接字無法處理icmp igmp等網路報文,而sock raw可以。利用原...