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发包过程)