【发布时间】:2016-06-16 02:10:06
【问题描述】:
我正在编写一个需要访问 TCP 标头字段的应用程序,例如,序列号或 TCP 时间戳字段。
是否可以通过在套接字 API 上操作而不监听原始套接字来获取序列号(或其他标头字段)? (我想避免过滤掉所有的数据包)。
我正在查看 TCP_INFO,但它的信息有限。
例如,在调用 recvmsg() 并获取数据缓冲区之后,是否有可能知道在接收到的数据缓冲区中传递最后一个字节的段的序列号?
谢谢
【问题讨论】:
我正在编写一个需要访问 TCP 标头字段的应用程序,例如,序列号或 TCP 时间戳字段。
是否可以通过在套接字 API 上操作而不监听原始套接字来获取序列号(或其他标头字段)? (我想避免过滤掉所有的数据包)。
我正在查看 TCP_INFO,但它的信息有限。
例如,在调用 recvmsg() 并获取数据缓冲区之后,是否有可能知道在接收到的数据缓冲区中传递最后一个字节的段的序列号?
谢谢
【问题讨论】:
您可以尝试使用 libpcap 来捕获数据包。此库允许使用与 Wireshark 中相同的语法指定数据包过滤器,因此您可以将捕获的数据包限制为仅一个连接。一个缺点是您也必须以正常方式接收数据包,这有点复杂,而且是额外的性能开销。
更新:您还可以使用套接字选项SO_ATTACH_FILTER 打开原始套接字并在其上设置伯克利包过滤器。更多细节在这里:https://www.kernel.org/doc/Documentation/networking/filter.txt。但是,您也必须在代码中实现 IP 堆栈的 TCP 部分。
【讨论】: