首页 > 解决方案 > 读取 TCP 标头并使用 RAW_SOCKET 管理 TCP 连接

问题描述

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

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

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

任何帮助表示赞赏,谢谢!

标签: c++linuxtcplibpcapraw-sockets

解决方案


“快速而肮脏”的方法可能是使用两个连接,一个到远程主机的外部连接和一个纯内部连接。当然,这不会是最有效的方法,但很容易(并且快速)实施(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 连接......


推荐阅读