我正在尝试使用tcp程序包开始重新组装TCP流。我看了两个例子
https://github.com/google/gopacket/tree/master/examples/httpassembly 和 https://github.com/google/gopacket/tree/master/examples/statsassembly
如果我发送小数据块,这些示例工作正常。如果我发送更大的数据,例如从源到目的地的5MB文件,那么golang TCP程序集似乎会丢失数据。
当我使用tcpflow使用tcpdump时,我可以重建我发送的数据,但golang示例在重组期间错过了大块数据,我无法重现我发送的数据。
例如,当我使用netcat从源传输文件到目的地时,我无法在使用golang TCP程序集汇编数据时重现该文件。
我对https://github.com/google/gopacket/tree/master/examples/statsassembly中的代码做了很小的修改。
加入
payload []byte
到statsStream结构。
然后
s.payload = append(s.payload, reassembly.Bytes...)
就在
s.bytes += int64(len(reassembly.Bytes))
。
当我在 ReassemblyComplete 中打印数据时,它只有一部分数据而且不包含其余数据。
我也改变了snaplength
var snaplen = flag.Int("s", 65536, "SnapLen for pcap packet capture")
当我使用tc命令减慢流量时,应用程序工作正常。真奇怪。 go库可以捕获数据包的速度是否有限制? Tcpdump似乎可以很好地捕获所有流量。