原始套接字 簡介

2022-03-31 13:47:41 字數 2627 閱讀 7530

整理網上資源(若有侵權請私信)及自己的筆記

通常情況下程式設計師接所接觸到的套接字(socket)為兩類:

(1)流式套接字(sock_stream):一種面向連線的socket,針對於面向連線的tcp 服務應用;

(2)資料報式套接字(sock_dgram):一種無連線的socket,對應於無連線的udp 服務應用。

從使用者的角度來看,sock_stream、sock_dgram 這兩類套接字似乎的確涵蓋了tcp/ip 應用的全部,因為基於tcp/ip 的應用,從協議棧的層次上講,在傳輸層的確只可能建立於tcp 或 udp協議之上,而sock_stream、sock_dgram 又分別對應於tcp和udp,所以幾乎所有的應用都可以用這兩類套接字實現。 

但是,當我們面對如下問題時,sock_stream、sock_dgram 將顯得這樣無助:

(1)怎樣傳送乙個自定義的ip 包?

(2)怎樣傳送乙個icmp 協議包?

(3)怎樣分析所有經過網路的包,而不管這樣包是否是發給自己的?

(4)怎樣偽裝本地的ip 位址?

這使得我們必須面對另外乙個深刻的主題——原始套接字(sock_raw)。原始套接字廣泛應用於高階網路程式設計,也是一種廣泛的黑客手段。著名的網路sniffer(一種基於被動偵聽原理的網路分析方式)、拒絕服務攻擊(dos)、ip 欺騙等都可以通過原始套接字實現。

原始套接字(sock_raw)可以用來自行組裝資料報,可以接收本機網絡卡上所有的資料幀(資料報),對於監聽網路流量和分析網路資料很有作用。

原始套接字是基於ip 資料報的程式設計(sock_packet 是基於資料鏈路層的程式設計)。另外,必須在管理員許可權下才能使用原始套接字。

原始套接字(sock_raw)與標準套接字(sock_stream、sock_dgram)的區別在於原始套接字直接置「根」於作業系統網路核心(network core),而 sock_stream、sock_dgram 則「懸浮」於 tcp 和 udp 協議的外圍。 

流式套接字只能收發 tcp 協議的資料,資料報套接字只能收發 udp 協議的資料,原始套接字可以收發核心沒有處理的資料報。

原始套接字的建立:

int socket ( int family, int type, int

protocol );

引數:family:協議族 這裡寫 pf_packet

type: 套接字類,這裡寫 sock_raw

protocol:協議類別,指定可以接收或傳送的資料報型別,不能寫 「

0」,取值如下,注意,傳參時需要用 htons() 進行位元組序轉換。

eth_p_ip:ipv4資料報

eth_p_arp:arp資料報

eth_p_all:任何協議型別的資料報

返回值:

成功( >0

):套接字,這裡為鏈路層的套接字

失敗(

<0 ):出錯

混雜模式預設的情況下,我們接收資料,目的位址是本地位址,才會接收。有時候我們想接收所有經過網絡卡的所有資料流,而不論其目的位址是否是它,這時候我們需要設定網絡卡為混雜模式。網絡卡的混雜模式一般在網路管理員分析網路資料作為網路故障診斷手段時用到,同時這個模式也被網路黑客利用來作為網路資料竊聽的入口。在 linux 作業系統中設定網絡卡混雜模式時需要管理員許可權。在 windows 作業系統和 linux 作業系統中都有使用混雜模式的抓包工具,比如著名的開源軟體 wireshark。通過命令給 linux 網絡卡設定混雜模式(需要管理員許可權)

混雜模式

ifconfig eth0 promisc

ifconfig eth0 -promisc(關閉)

常用的資料結構如下

1.實體地址結構位於netpacket/packet.h

struct

sockaddr_ll

;sll_ifindex是網路(網絡卡)介面索引,代表從這個介面收發資料報

2.網路(網絡卡)介面資料結構位於net/if

.hstruct

ifreq

ifr_ifrn;

union

ifr_ifru;

};3.乙太網首部結構位於net/ethernet.h

struct

ether_header

__attribute__ ((__packed__));

ether_type幀型別:常見的有ip,arp,rarp,都有對應的巨集定義

4.arp包結構位於netinet/if_ether.h

struct

ether_arp ;

#define arp_hrd ea_hdr.ar_hrd

#define arp_pro ea_hdr.ar_pro

#define arp_hln ea_hdr.ar_hln

#define arp_pln ea_hdr.ar_pln

#define arp_op ea_hdr.ar_op上面的ether_arp結構還包含乙個arp首部,位於net/if_arp.h

struct

arphdr

原始套接字簡介(原始套接字系列一

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