18 原始套接字

2021-07-27 09:02:14 字數 1290 閱讀 1726

1.建立原始套接字

注意:原始套接字要超級使用者才能使用。

呼叫socket函式,即可建立原始套接字。引數需要注意變更:

int socket(af_inet,sock_raw,protocol)

int socket(af_packet,sock_raw,protocol)

2.傳送訊息

呼叫sendto可以傳送資訊

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
3.接收訊息

在下列情況下,核心會將接收到的ip資料報文傳遞給原始套接字

a.接收到的tcp/udp不會傳遞到任何套接字

b.icmp分組會在核心處理完其中的icmp訊息後,傳遞到原始套接字

c.igmp分組同上

d.核心不認識其協議欄位的ip資料報

接收訊息函式

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
4.簡單示例,實現原始套接字傳送資料

可以通過wireshark分析資料報內容。

int main(int argc, char *argv)

printf("sendto over.\n");

return 0;

}

5.簡要分析資料幀格式

乙太網head:

a.6bytes目的mac位址

b.6bytes源mac位址

c.2bytes型別,協議號:0800ip資料報,0806arp,8035rarp

ip層資料:

a.20bytes頭部

b.icmp協議可以用於檢測網路是否通暢,比如ping

c.igmp組播報文

原始套接字

資料出處 實際上,我們常用的網路程式設計都是在應用層的報文的收發操作,也就是大多數程式設計師接觸到的流式套接字 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位址。...