读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接

Reading a TCP header and managing a TCP connection with RAW_SOCKET

本文关键字:TCP SOCKET 连接 RAW 管理 读取      更新时间:2023-10-16

我正在尝试在 C++11 中获取 TCP 连接的 TCP 标头。通读已经存在的StackOverflow问题(这里,这里,这里和这里(,似乎我必须打开一个RAW_SOCKET或编写一个Linux内核模块(LKM(才能访问它。

据我所知,打开原始套接字意味着处理整个TCP协议(握手,窗口大小等(。有没有办法获取TCP标头并让内核管理TCP协议("手动"或使用某些框架(?

我知道我可以使用 libpcap 来捕获数据包,但这意味着我的应用程序以某种方式与 TCP 套接字中的传入数据包和来自 libpcap 捕获的数据包进行匹配。虽然这是一个可能的解决方案,但这将是一个繁琐的解决方案(我不想这样做(。

任何帮助不胜感激,谢谢!

"快速而肮脏"的方法可能是使用两个连接,一个是到远程主机的外部连接,另一个是纯内部连接。当然,这不是最有效的方法,但很容易(而且快速(实现(QAD"解决方案"的核心功能......

socket ext_raw  ------- socket remote, TCP (likely, at least)
socket int_raw  ---
|    (loop back connection)
socket int_tcp  ---

ext_rawint_raw的任何传入消息都只是从一个转发到另一个(而ext_raw上的传入消息可以检查TCP标头(,而所有正常的TCP处理都由内部TCP套接字完成。因此,在某种程度上,您将通过两个原始套接字通过隧道传输TCP连接...