應用程式可以繞過傳輸層而直接使用ipv4和ipv6,這稱為原始套介面(raw socket)。
原始套介面是一種對原始網路報文進行處理的套介面。原始套介面主要應用在底層網路程式設計上,同時也是網路黑客的必備手段。例如sniffer、拒絕服務(dos)、ip位址欺騙等都需要在原始套接字的基礎上實現。
與原始套接字對應,之前的tcp/udp的套接字稱為標準套接字,如下圖所示,為標準套接字與原始套接字之間的關係。標準套接字與網路協議棧的tcp、udp層打交道,而原始套接字則與ip層級網路協議棧核心打交道。
原始網路套介面提供普通的tcp和udp套介面不提供的以下3個功能:
1、有了原始套介面,程序可以讀與寫icmpv4、igmpv4和icmpv6等分組。
2、有了原始套介面,程序可以讀與寫核心不處理其協議欄位的ipv4資料報。
3、有了原始套介面,程序還可以使用ip_hdrincl套介面選項自行構造ipv4頭部。
建立乙個原始套介面涉及如下步驟:
1、把第2個引數指定為sock_raw呼叫socket函式,以建立乙個原始套介面。第3個引數(協議型別)通常不為0。
2、可以在這個原始套介面上如下開啟ip_hdrincl套介面選項:
const3、可以在這個原始套介面上呼叫bind函式,不過比較少見。bind函式僅僅設定本地位址,因為原始套介面不存在埠的概念。int on = 1
;if(setsockopt(sockfd, ipproto_ip, ip_hdrincl, &on, sizeof(on)) < 0
) 出錯處理
4、可以在這個原始套介面上呼叫connect函式,不過也比較少見。connect函式僅僅設定遠地位址,同樣因為原始套接字不存在埠的概念。
原始套介面的輸出遵循以下規則:
1、普通輸出通過呼叫sendto或sendmsg並指定宿ip位址完成。如果套介面已經連線,那麼也可以呼叫write、writev或send。
2、如果ip_hdrincl套介面選項未開啟,那麼由程序讓核心傳送的資料的起始位址指的是ip頭部之後的第乙個位元組,因為核心將構造ip頭部並把它置於來自程序的資料之前。核心把所構造的ipv4頭部的協議字段設定成來自socket呼叫的第3個引數。
3、如果ip_hdrincl套介面選項已開啟,那麼由程序讓核心傳送的資料的起始位址指的是ip頭部的第乙個位元組。程序呼叫輸出函式寫出的資料量必須包括ip頭部的大小。整個ip頭部由程序構造,不過:(a)ipv4標識欄位可置為0,從而告知核心設定該值;(b)ipv4頭部校驗和字段總是由核心計算並儲存;(c)ipv4選項欄位是可選的。
4、核心對於超出外出介面mtu的原始分組執行分片。
原始套介面輸入遵循以下規則:
1、接收到的udp分組和tcp分組絕不傳遞到任何原始套介面。如果乙個程序想要讀取含有udp分組或tcp分組的ip資料報,它就必須在資料鏈路層讀取這些分組。
2、大多數icmp分組在核心完成處理其中的icmp訊息後傳遞到原始套介面。
3、所有igmp分組在核心完成處理其中的igmp訊息後傳遞到原始套介面。
5、如果某個資料報以片段形式到達,那麼在它的所有片段均到達且重組出該資料報之前,不傳遞任何片段分組到原始套介面。
UNIX網路程式設計讀書筆記 套介面選項
有很多方法來獲取和設定影響套介面的選項 這兩個函式僅用於套介面。include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen int setsockopt int sockfd,int lev...
Unix網路程式設計讀書筆記(二)
套接字位址結構 typedef uint32 t in addr t struct in addr struct sockaddr in 在使用結構前總是把整個結構置零,是由於sin zero欄位沒有任何作用,只需置零即可。為了是套接字函式在處理位址時具有一定的通用性,套接字函式還定義了通用套接字位...
Unix網路程式設計讀書筆記(四)
unix下共有5種i o模型 阻塞式i o 非阻塞式i o i o復用 select和poll 訊號驅動式i o sigio 非同步i o posix的aio 系列函式 同步i o與非同步i o 同步i o操作導致請求程序阻塞,直到i o操作完成。前4種模型都是同步i o模型,因為其中真正的i o操...