【问题标题】:How to determine the starting byte of http header in a raw packet?如何确定原始数据包中http头的起始字节?
【发布时间】:2015-08-04 12:15:38
【问题描述】:

我正在用 C 语言开发一个网络应用程序。我有以太网标头、IPV4 标头和 TCP 标头的字段和起始字节。如何获取 HTTP 标头的起始字节(指针)?

编辑:

我在初始化 HTTP 标头的指针时犯了一个错误。 我在这里做错了:

//tcp_header is a pointer to a structure of TCP header
char *data = (char *) (tcp_header + tcp_header_length);

我改正了

char *data = (char *) tcp_header + tcp_header_length;

现在一切都很美好:) 感谢您的帮助。

【问题讨论】:

  • 您是否考虑过 HTTP 请求可能会分布在多个数据包中?
  • HTP 标头在 TCP 数据中,因此只需移动到 tcp 标头之后的第一个数据。

标签: c networking network-programming


【解决方案1】:

这取决于您用于获取数据报的接口类型。您可能正在使用套接字接口。您也可以使用 pcap。 如果你使用socekts,这取决于你使用的socket类型:

  • Packet Sockets:可以直接获取以太网帧
  • 原始套接字:您可以读取 IP 数据报(带或不带 IP 标头)
  • 数据报或流套接字:您可以读取 UDP 或 TCP 有效负载

如果你有整个以太网帧,@thurizas 给了你最重要的提示,我可以补充:

  • 以太网帧将有 14 个八位字节(网络语言中的字节)长度:1-目标地址、2-源地址、3-以太网类型或长度

在以太网帧中你需要考虑:

  • 如果最后 2 个八位字节 >= 1536,最典型的情况是 Ethertype。当 IP 数据报在帧有效负载中传送时,您将看到值 0x0800。在这种情况下,在 0x0800 之后,您拥有整个 IP 数据报。

  • 如果最后 2 个八位字节

  • 如果您使用 VLAN 并且这 2 个八位字节是 0x8100,那么您必须考虑 802.1Q 标记的 4 个八位字节,然后是以太网类型/长度的 2 个八位字节

在 IP 标头中您需要考虑两个字段:

  • 第二个半字节(第一个字节的最后 4 位,字节 0)以 4 个字节为一组为您提供标头长度
  • 字节 2 和 3 给出了 IP 数据报的总长度,包括报头。您需要计算 ((Total Length) - (IHL x 4)) 以获得总 IP 负载长度

如果 IP 数据报包含 TCP 报头,则总长度为 IP 有效负载长度。

在 TCP 层,我无法在 @thurizas 写的内容中添加任何内容。 只是,假设不使用 SSL/TLS,TCP header 后面的下一个 Byte 将是 HTTP 的第一个 Byte。

【讨论】:

    【解决方案2】:

    正如 jdweng 所说,HTTP 数据包位于 TCP 标头之后。我们知道以下几点:

    • 我们知道以太网 II 标头由一个 8 字节的前导码、一个 6 byte destination address(目的MAC地址),一个6字节 源地址和一个 2 字节的类型字段。在大多数情况下,我从来没有 看到了序言,但开始在目标 MAC 地址获取数据,这 使以太网部分长 14 个字节。

    • IP 标头中的第一个字节包含版本和标头
      大小(以 32 位字的数量给出)。所以通常这是 0x45 这意味着我们使用的是 IPv4,并且在
      中有 5 个 32 位字 标题。这意味着 IP 标头的长度为 20 个字节。 (见 RFC 791了解更多信息)

    • 我们知道 TCP 报头中的偏移字段给出了 TCP 标头中的 32 位字。该字段的最小值为
      5,但如果有可选字段,可以更长。因此最小 TCP 标头的大小为 20 字节。(有关详细信息,请参阅 RFC 793 在 TCP 标头上)。

    因此,假设每个标头都具有默认大小,那么 HTTP 标头至少会从数据包的 54 个字节开始。可以肯定的是,您需要阅读各种尺寸字段并根据需要进行调整。

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2012-06-27
      • 2012-09-03
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多