由于我是想做个旁路劫持一类的软件,所以肯定不允许抓包有很大延迟(如果包比正常包还要晚到达客户端直接会被丢弃) 这里我们要开启立即模式

inactive.SetImmediateMode(true)

构造链路和网络层没什么好说的,传输层构造TCP后要记得设置该层对应的上层协议,不然无法计算checksum,仍然会被客户端丢弃

tcp.SetNetworkLayerForChecksum(&ipv4)

在序列化成字节的时候使用gopacket.Payload可以直接追加字节内容到要发送的包里

gopacket.SerializeLayers(buf, opts, ð, &ipv4, &tcp, gopacket.Payload([]byte(data)))

据说PF_RING具有更高性能,但似乎gopacket的pfring没有支持SetImmediateMode的API,所以会抓到的每个包有200ms延迟时间,不适合做旁路劫持等延迟敏感的应用