libnet发包过程
2019/08/12
(這篇文章更像是解釋原生socket發包的過程 2019/08/13)
今天具體了解了一下, 發包的過程,目前知道比較關注的兩種兩種發包方式,分別是構造IP包和直接構造以太網包;這兩種我都試過,他們實現的原理是不盡相同的。首先要明確的一個問題,他們都需要通過系統調用來實現功能,那么都不可能通過驅動層面的內容來進行發包,所以發包的過程,最后終究應該是和socket這種編程的方式很像。
int socket(int domain, int type, int protocol);
以前的時候,普遍在進行編程的時候都是使用一些TCP/UDP相關的編程接口;這里進行發包的過程,是通過個人的需求對數據包進行構造,通過構造之后然后選擇網卡發送出去。
同樣,這里有兩種發送方式,分別是發送IP包和發送以太網幀。
他們分別采用的協議簇是不一樣的,一個是AF_PACKET和AF_INET,具體的內容通過后面的type進行再區分。
文獻[1]中對AF_PACKET進行了比較詳細的介紹,這部分介紹個各種背景,算是比較豐富的材料,但最后說明使用的發送函數是write,這個跟我理解的不一樣,我見到的都是使用sendto/sendmsg;文獻[2]是利用這種方式進行捕包的;文獻[3]中提到的問題是發包使用的內容,他的意思是我可以不用構造相關的鏈路層信息。這個問題不是非常理解,就是編程細節的問題
文獻[4]中對兩種不同的原生socket進行了對比;文獻[5][6]分別是兩個發送和接收的范例。
文獻[7]是對raw socket的一個詳細介紹
2019/08/16
問題描述,這里遇見一個這樣的問題,在多線程同時發包的過程中,經常出現no availiable buffer(單詞可能錯),這個錯誤的原因[9],是錯誤碼 ENOBUFS,文章[9]中提到了兩個錯誤碼,另外一個是內存限制,但我看了機器當前的內存還有一些其他的博客,不然是內存的原因。 ENOBUFS這個東西的主要原因,看文檔描述,是說網卡的隊列滿了。
但是調整了相關的網卡信息之后,比如大小,緩沖區大小,雖然能減緩這種情況,但并不能完全根治這種問題;對于這部分的內容,最主要的一個問題就是沒有一個可以入手的測試方案,只能說大致上定位他在協議棧的什么位置。到目前位置,我也沒辦法對項目上發包的性能進行繼續調優。
參考文獻
[1]Raw socket, Packet socket and Zero copy networking in Linux
[2]packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/
[3]sending-data-on-af-packet-socket
[4]Linux的RAW SOCKET探索
[5]capture_ethernet_frames_using_an_af_packet_socket_in_c
[6]send_an_arbitrary_ethernet_frame_using_an_af_packet_socket_in_c
[7]suricata抓包方式之一 AF_PACKET
[8]sock_raw
總結
以上是生活随笔為你收集整理的libnet发包过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《东周列国志》第六十二回 诸侯同心围齐国
- 下一篇: 崔紫娟我爱你