我正在用Golang写一个简单的程序来使用原始套接字捕获TCP / IP数据包:

当我将程序接收到的数据包数量及其包含的数据总量与Wiresharks看到的数据包数量以及传输的总数据进行比较时,我知道我每次运行都丢失了15-30%的所有数据包和数据 。

为什么?

我唯一想到的是应用程序的速度不足以接收数据包,但这很奇怪。 (我正在localhost上进行通信,并发送了约17 MB的数据。)但是,Goreplay使用了类似的东西并且可以工作。

我正在接收的流量是通过curl-进入本地运行的Python服务器(http.server)并在请求正文中发送大文件而创建的。 Python服务器成功下载了整个正文。


我最初的猜想是对的:通过修改接收的Python服务器,使其不立即读取所有传入的数据:

而是在两次迭代之间有10毫秒延迟的循环中:

我收到了Golang中的所有数据,并且处理的数据包的数量大致相同(我假设只有很少的匹配,因为Golang中接收的数据包已经被处理,即重新整理。或者至少我希望,因为 没有太多的文档。)

此外,调整延迟后,丢包率也会发生变化。