LWIP 原始套接字(SOCK RAW)

2021-08-07 14:53:43 字數 1975 閱讀 4840

收錄於:

【lwip】lwip協議|相關知識彙總|lwip學習筆記

通常情況下我們接觸到的套接字為兩類:

(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)可以用來自行組裝資料報,我們常用的ping命令,其實現採用的就是原始套接字(sock_raw)。

1.輸入*「ping www.baidu.com」*命令後,在ping程式中會解析引數(ip位址、傳送次數、傳送資料大小、ttl值、timeout值)

2.建立原始套接字:socket(af_inet,sock_raw, ipproto_icmp)

isock = socket(af_inet, sock_raw, ipproto_icmp); 

if (isock < 0)

setsockopt(isock, sol_socket, so_rcvtimeo, &itimeout, sizeof(int));

setsockopt(isock, ipproto_ip, ip_ttl, &ittl, sizeof(int));

connect(isock, (struct sockaddr *)&sockaddrinto,

sizeof(struct sockaddr_in));

3.構建icmp報文,通過原始套接字型別直接傳送資料報至ip層

icmphdrecho = (struct icmp_echo_hdr *)__sheap_alloc(stpingsize);

if (icmphdrecho == lw_null)

__inetpingprepare(icmphdrecho, idatasize, pusseqrecv); /* 構造 ping 包 */

sockaddrin.sin_len = sizeof(struct sockaddr_in);

sockaddrin.sin_family = af_inet;

sockaddrin.sin_port = 0;

sockaddrin.sin_addr = inaddr;

ssterror = sendto(isock, icmphdrecho, stpingsize, 0,

(const struct sockaddr *)&sockaddrin,

sizeof(struct sockaddr_in));

__sheap_free(icmphdrecho);

這樣,乙個ping包就被傳送出去了。

原始套接字

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

原始套接字

參考1 原始套接字能幹什麼?參考2 原始套接字抓包實踐 參考3 各層頭結構 通過原始套接字,我們可以抓取所有傳送到本機的ip包 包括ip頭和tcp udp icmp包頭 也可以抓取所有本機收到的幀 包括資料鏈路層協議頭 普通的套接字無法處理icmp igmp等網路報文,而sock raw可以。利用原...

原始套接字

利用原始套接字實現乙個tcp syn flooding 程式 要求 客戶端不斷向攻擊端傳送syn連線請求 客戶端在傳送資料時,通過源位址隨機位址的方式隱藏自己的 位址 檢驗 在shell下通過 netstat tn 檢查syn recv連線數檢驗自己的程式是否成功 好像有點問題。不能偽造mac位址。...