原始套接字 概述

2021-09-05 22:48:54 字數 2661 閱讀 6141

大多數程式設計師所接觸到的套接字(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可以。利用原...