日期:2014-05-16  浏览次数:20715 次

网络编程抓包程序缓存问题?
现在有一问题没有搞明白,在做网络编程时,需要抓取数据包进行分析,一般设定缓冲区来接收数据包,缓冲区的大小设定的比ETH的包大一些即可,如2048,然后用recv函数接收。问题是我在用GDB调试时,发现跟踪查看中间的处理程序后,不会丢失后面的数据包,因为我感觉在调试的过程中,缓冲区没有处理完毕,还没有启动新的recv过程,那接下来的数据包应该丢失了,等再次recv的时候,应该收到当前网络传输的数据包才是,而实际上,并没有丢失紧接着的数据包,当然对于大量的数据包传输还是有抓取不到的。
      那这些没有丢的数据包是被系统缓存了么?还是GDB给缓存了?还是其他的?
      另外,如果数据包流量很大,我用单线程实现抓包、重组、分析、记录等功能的话,会不会有漏掉的数据包?我自己感觉这样会丢失不少数据包,因为重组、分析和记录比较耗时,在处理完毕再接收下一个的话,有可能丢失数据包。不知道对不对,希望高手帮忙解答一下哈!

------解决方案--------------------
感觉是被网卡缓存了

跟踪调试网络程序肯定有丢包问题,可以结合接包后输出各项中间纪录的方式一起调试。
------解决方案--------------------
我们来理一下过程
1.双绞线上传来一个帧
2.网卡发现这帧是自己要的,考到网卡的缓存,发一个中断通知CPU来取
3.CPU把该帧考到内核的数据结构中(sk_buff)
4.经过一堆函数之后将此包考到用户态相关进程数据结构中
网卡应该不会存太久,很可能是存在sk_buff list中
------解决方案--------------------
网卡的硬件缓存不会存你的包.

而且丢包现象在网络上是完全正常的.