網路程式設計原始套接字

2021-09-08 14:17:24 字數 3991 閱讀 5561

socket_stream 流式套接字     

socket_dgram       

socket_raw 原始套接字   

ipproto_ip ip協議   

ipproto_icmp internet控制訊息協議,配合原始套接字可以實現ping的功能   

ipproto_igmp internet 閘道器服務協議,在多播中用到

在af_inet位址族下,有sock_stream、sock_dgram、sock_raw三種套接字型別。sock_stream也就是通常所說的tcp,而sock_dgram則是通常所說的udp,而sock_raw則是用於提供一些較低階的控制的;第3個引數依賴於第2個引數,用於指定套接字所用的特定協議,設為0表示使用預設的協議。

希望各位參與,進來的順便up一下.

raw socket能夠對較低層次的協議直接訪問,網路監聽技術很大程度上依賴於它。該文介紹了利用raw socket捕獲網路底層資料報的步驟和方法,並開發了乙個程式模型來進一步**了利用raw socket捕獲資料報的方法。

1 引言

隨著資訊科技的快速發展,網路已成為資訊交換的主要手段,一些網路新業務在不斷地興起,如電子商務、移動支付等,這些都對網路安全提出了較高的要求。與此同時,黑客對網路的攻擊從未停止,網路的安全問題變得日趨嚴峻。

很多網路攻擊都是從監聽開始的,網路監聽最重要一步就是捕獲區域網中的資料幀,因此,研究資料捕獲技術對於保障網路安全有著重要的意義。

2 raw socket簡介

同一臺主機不同程序可以用程序號來唯一標識,但是在網路環境下程序號並不能唯一標識該程序。tcp/ip主要引入了網路位址、埠和連線等概念來解決網路間程序標識問題。套接字(socket)是乙個指向傳輸提供者的控制代碼,tcp/ip協議支援3種型別的套接字,分別是流式套接字、資料報式套接字和原始套接字。

流式套接字(socket_stream)提供了面向連線、雙向可靠的資料流傳輸服務。資料報式套接字(socket_ dgram)提供了無連線服務,不提供無錯保證。原始套接字(socket_raw)允許對較低層次的協議直接訪問,比如ip、 icmp協議,它常用於檢驗新的協議實現,或者訪問現有服務中配置的新裝置,因為raw socket可以自如地控制windows下的多種協議,能夠對網路底層的傳輸機制進行控制,所以可以應用原始套接字來操縱網路層和傳輸層應用。比如,我們可以通過raw socket來接收發向本機的icmp、igmp協議包,或者接收tcp/ip棧不能夠處理的ip包,也可以用來傳送一些自定包頭或自定協議的ip包。網路監聽技術很大程度上依賴於socket_raw。

3 raw socket程式設計

要使用原始套接字,必須經過建立原始套接字、設定套接字選項和建立並填充相應協議頭這三個步驟,然後用send、wsasend函式將組裝好的資料傳送出去。接收的過程也很相似,只是需要用recv或wsarecv函式接收資料。下面介紹使用raw socket程式設計的幾個步驟。

3.1 建立原始套接字

我們可以用socket或wsasocket函式來建立原始套接字,因為原始套接字能直接控制底層協議,因此只有屬於「管理員」組的成員,才有權建立原始套接字。下面是用socket函式建立原始套接字的**。

socket sock;

sock=socket (af_inet, sock_raw, ipproto_udp);

上述建立原始套接字的**使用的是udp協議,如果要使用其它的協議,比如icmp、igmp、ip等協議,只需要把相應的引數改為ipproto_icm、ipproto_ igmp、ipproto_ip就可以了。另外,ipproto_udp、ipproto_ip、ipproto_raw這幾個協議標誌要求使用套接字選項ip_hdrincl,而目前只有windows 2000和windows xp提供了對ip_hdrincl的支援,這意味著在windows 2000以下平台建立原始套接字時是不能使用ip、udp、tcp協議的。

3.2 設定套接字選項

建立了原始套接字後,就要設定套接字選項,這要通過setsocketopt函式來實現,setsocketopt函式的宣告如下:

int setsocketopt (

socket s,

int level,

int optname,

const char far *optval,

int optlen

);在該宣告中,引數s是標識套介面的描述字,要注意的是選項對這個套接字必須是有效的。引數level表明選項定義的層次,對tcp/ip協議族而言,支援sol_socket、ipproto_ip和ipproto_cp層次。引數optname是需要設定的選項名,這些選項名是在winsock標頭檔案內定義的常數值。引數optval是乙個指標,它指向存放選項值的緩衝區。引數optlen指示optval緩衝區的長度

3.3 建立並填充相應協議頭

這一步就是建立ip和tcp協議頭的資料結構,根據相關協議的定義進行編寫即可,下面是乙個tcp協議頭的資料結構。

struct tcp ;

4 乙個利用raw socket捕獲網路資料報的程式模型

下面介紹乙個利用raw socket捕獲網路資料報的程式模型。這個程式模型演示了如何使用raw socket捕獲區域網中的資料報,它完成了網路底層資料的接收,能顯示源位址、目標位址、源埠、目標埠和接收的位元組數等資訊。這個程式模型也說明了網路監聽的基本原理,給捕獲區域網中的資料報提供了一種方法,即先把網絡卡設定為混雜模式,然後利用raw socket接收ip層的資料。

程式在visual c++.net 2003中除錯並編譯通過,執行環境為乙太網, 程式**可同時在linux與windows環境下編譯和執行,當然在編譯時需要不同的標頭檔案以及需要對**作相應的改動。本程式模型在windows下能直接執行,如果在linux下執行,則需要先用手工把網絡卡設定為混雜模式,在root許可權下用如下命令設定:ifconfig eth0 promisc。

在unix/linux下程式要包含以下這幾個進行呼叫系統和網路函式的標頭檔案:

#include〈stdio.h〉

#include〈sys/socket.h〉

#include〈netinet/in.h〉

#include〈arpa/inet.h〉

#include"headers.h"

為了方便基於berkeley套介面的已有源程式的移植,windows sockets支援許多berkeley標頭檔案。這些berkeley標頭檔案被包含在winsock2.h中,所以乙個windows sockets應用程式只需包含winsock2.h標頭檔案就足夠了,這也是目前推薦使用的一種方法。在windows平台下程式改用以下這幾個標頭檔案:

#include "stdafx.h"

#include

#include

#include"headers.h"

headers.h是自己編寫的標頭檔案,它的作用是定義ip和tcp包的頭結構。在程式中首先定義幾個變數和結構,然後呼叫函式socket()建立socket連線,主要**如下:

int _tmain(int argc, _tchar* ar**)

程式的第二步用乙個while(1)語句來建立乙個死迴圈,用來不停地接收網路資訊。首先用函式sizeof()取出乙個socket結構的長度,這個引數是recvfrom()函式所必須的。從建立的socket連線中接收資料是通過函式recvfrom()是來實現的,因為recvfrom()函式需要乙個sockaddr資料型別,所以用了乙個強制型別轉換,**如下:fromlen=sizeof(from);

bytes_recieved=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen);

接下來用一條語句把接收到的資料轉化為我們預先定義的結構,以便於檢視,**為:

ip=(struct ip *)buffer

還要用一條語句來指向tcp頭,因為接收的資料中,ip頭的大小是固定的4位元組,所以用ip長度乘以4就能指向tcp頭部分,**為:

tcp=(struct tcp *)(buffer+(4*ip->ip_length))

最後就可以用列印語句把接收的位元組數、資料的源位址、目標位址、源埠、目標埠、ip頭長度和協議的型別輸出來。

Linux網路程式設計 原始套接字

原始套接字 sock raw 應用原始套接字,我們可以編寫出由tcp和udp套接字不能夠實現的功能.注意原始套接字只能夠由有 root許可權的人建立.dos.c include include include include include include include include inclu...

UNIX網路程式設計 原始套接字SOCK RAW

實際上,我們常用的網路程式設計都是在應用層的報文的收發操作,也就是大多數程式設計師接觸到的流式套接字 sock stream 和資料報式套接字 sock dgram 而這些資料報都是由系統提供的協議棧實現,使用者只需要填充應用層報文即可,由系統完成底層報文頭的填充並傳送。然而在某些情況下需要執行更底...

linux sock raw原始套接字程式設計

sock raw原始套接字程式設計可以接收到本機網絡卡上的資料幀或者資料報,對與監聽網路的流量和分析是很有作用的.一共可以有3種方式建立這種socket 1.socket af inet,sock raw,ipproto tcp ipproto udp ipproto icmp 傳送接收ip資料報 ...