如何确定原始数据包中http头的起始字节?

时间:2015-08-04 12:15:39

标签: c networking network-programming

我正在用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;

现在一切都是桃子:) 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

如果您拥有整个以太网帧,@ thurizas,给了您最重要的提示,我可以添加:

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

在以太网框架中,您需要考虑:

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

  • 如果最后2个八位字节是< = 1500,则表示有效负载长度。它可能包含802.2 LLC帧。

  • 如果您使用VLAN并且这两个八位字节是0x8100,那么您必须考虑4个八位字节的802.1Q标记,然后考虑2个八位字节的Ethertype / Length

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

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

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

在TCP层,我无法添加@thurizas所写的内容。 只是,假设未使用SSL / TLS,TCP头后面的下一个字节将是HTTP的第一个字节。

答案 1 :(得分:1)

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

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

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

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

从这里开始,假设每个标头都有默认大小,HTTP标头至少会从54个字节开始进入数据包。当然,您需要阅读各种尺寸字段并根据需要进行调整。