读取 TCP header 并使用 RAW_SOCKET 管理 TCP 连接
Reading a TCP header and managing a TCP connection with RAW_SOCKET
我正在尝试获取 C++11 中 TCP 连接的 TCP header。阅读已经存在的 Whosebug 问题 (here, here, here and ) 似乎我必须打开一个 RAW_SOCKET
或编写一个 Linux 内核模块 (LKM) 才能访问它。
据我了解,打开原始套接字意味着处理整个 TCP 协议(握手、window 大小等...)。有没有办法获取 TCP header 并让内核管理 TCP 协议("by hand" 或使用某些框架)?
我知道我可以使用 libpcap 来捕获数据包,但这意味着我的应用程序会以某种方式匹配 TCP 套接字中的传入数据包和从 libpcap 捕获的数据包。虽然这是一种可能的解决方案,但它会很麻烦(我不想那样做)。
感谢任何帮助,谢谢!
"quick and dirty" 方法可能使用两个连接,一个到远程主机的外部连接和一个纯内部连接。当然,这不是最有效的方法,但易于(且快速)实施(QAD 的核心功能 "solutions"...):
socket ext_raw ------- socket remote, TCP (likely, at least)
socket int_raw ---
| (loop back connection)
socket int_tcp ---
ext_raw
和 int_raw
上的任何传入消息只是从一个转发到另一个(而 ext_raw
上的传入消息可以针对 TCP headers 检查),而所有正常的 TCP 处理都是由内部 TCP 套接字完成的。所以在某种程度上,您将通过两个原始套接字建立 TCP 连接隧道...
我正在尝试获取 C++11 中 TCP 连接的 TCP header。阅读已经存在的 Whosebug 问题 (here, here, here and RAW_SOCKET
或编写一个 Linux 内核模块 (LKM) 才能访问它。
据我了解,打开原始套接字意味着处理整个 TCP 协议(握手、window 大小等...)。有没有办法获取 TCP header 并让内核管理 TCP 协议("by hand" 或使用某些框架)?
我知道我可以使用 libpcap 来捕获数据包,但这意味着我的应用程序会以某种方式匹配 TCP 套接字中的传入数据包和从 libpcap 捕获的数据包。虽然这是一种可能的解决方案,但它会很麻烦(我不想那样做)。
感谢任何帮助,谢谢!
"quick and dirty" 方法可能使用两个连接,一个到远程主机的外部连接和一个纯内部连接。当然,这不是最有效的方法,但易于(且快速)实施(QAD 的核心功能 "solutions"...):
socket ext_raw ------- socket remote, TCP (likely, at least)
socket int_raw ---
| (loop back connection)
socket int_tcp ---
ext_raw
和 int_raw
上的任何传入消息只是从一个转发到另一个(而 ext_raw
上的传入消息可以针对 TCP headers 检查),而所有正常的 TCP 处理都是由内部 TCP 套接字完成的。所以在某种程度上,您将通过两个原始套接字建立 TCP 连接隧道...