【问题标题】:Possible to access TCP packet details with a go HTTP client?可以使用 go HTTP 客户端访问 TCP 数据包详细信息吗?
【发布时间】:2019-04-07 05:42:03
【问题描述】:

我需要能够验证来自一组 HTTP 服务器的响应数据上的 TOS/DSCP 标记。是否有可能,给定一个目标 URL 列表来测试,如果go 中有一种方法可以生成 HTTP 请求,然后能够检查响应的 TCP 数据包详细信息以获得 TOS 值?

此时我的假设是,它可能需要创建一个套接字,然后动态生成一个包含 HTTP 请求负载的 TCP 数据包。我一直在四处寻找是否有任何库可以帮助完成这项任务,但还没有找到任何具体的东西。

注意:简单的 TCP 连接将无法提供足够的数据 - 相关目标服务器将根据 HTTP 服务器名称动态更改 TOS/DSCP 标记(因此基本上,单个物理服务器将根据不同的 TOS 标记进行响应) vHost 请求),因此能够验证实际 HTTP 响应数据包上的 TOS 非常重要,而不是像 ping 这样简单的东西。 TCP 3 次握手中的 TOS 值也不可信 - 它必须是包含 HTTP 数据的数据包。

【问题讨论】:

  • TCP 是一个流,在应用层看不到实际的数据包。您需要发出正常请求并在较低层检查数据包。
  • 如果你想生成数据包,你可能想先看看godoc.org/github.com/google/gopacket
  • 是的,我意识到这一点。我想我想知道的是,我是否需要在底层完成所有工作,或者我可以使用更高级别的函数发出 HTTP 请求,但仍然可以使用低级函数访问响应数据包。我拥有的旧工具基本上执行curl,然后立即开始侦听数据包。它有效,但效率不高。我现在只是在研究一些简化检查的方法。
  • “简单”的方法是做你的 curl 客户端所做的事情,并在请求期间嗅探接口。然而,Go 客户端只需要一个 net.Conn,因此如果您可以使用 gopacket 创建一个已检测的客户端,那么它可以直接放入客户端。
  • 如果您设法创建了 JimB 建议的检测连接,the Transport's DialContext field 就是您要找的。​​span>

标签: go


【解决方案1】:

我最终使用gopacket/pcapnet/http 解决了这个问题。

简而言之,我最终做的是编写一个创建通道的函数,然后调用一个执行实际数据包捕获和解析的 goroutine。 goroutine将捕获到的TOS值传回channel,然后原函数做http请求,然后读取channel得到TOS结果。仍有一些工作正在进行中,但到目前为止,此解决方案似乎运行良好。

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2023-03-25
    • 2017-10-02
    相关资源
    最近更新 更多