繁体   English   中英

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

[英]How to determine the starting byte of http header in a raw packet?

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

现在一切都变淡了:)谢谢您的帮助。

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

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

如果您拥有整个以太网框架,@ thurizas,则为您提供了最重要的提示,我可以添加:

  • 以太网帧的长度为14-Octet(网络语言中的字节):1-目标地址,2-源地址,3-以太网类型或长度

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

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

  • 如果最后2个八位位组<= 1500,则表示有效载荷长度。 它可能包含802.2 LLC框架。

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

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

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

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

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

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

  • 我们知道,以太网II标头由一个8字节的前导码,一个6字节的目标地址(目标MAC地址),一个6字节的源地址和一个2字节的类型字段组成。 在大多数情况下,我从未见过前言,而是开始从目标MAC地址获取数据,这使以太网部分的长度为14个字节。

  • IP标头中的第一个字节包含版本和标头
    大小(以32位字的数量为准)。 因此通常为0x45,这表示我们正在使用IPv4,并且其中有5个32位字
    标头。 这意味着IP标头的长度为20个字节。 (有关更多信息,请参见RFC 791)

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

据此,假设每个报头具有默认大小,则HTTP报头至少应以54个字节开始进入数据包。 当然,您需要阅读各种尺寸字段并根据需要进行调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM