![](/img/trans.png)
[英]How to determine the length of “Content-Length: ” in HTTP packet
[英]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,则取决于您使用的套接字类型:
如果您拥有整个以太网框架,@ thurizas,则为您提供了最重要的提示,我可以添加:
在以太网帧中,您需要考虑:
如果最后2个八位位组> = 1536,则最典型的情况是Ethertype。 当IP数据报在帧有效负载中传送时,您将看到值0x0800。 在这种情况下,在0x0800之后,您将拥有整个IP数据报。
如果最后2个八位位组<= 1500,则表示有效载荷长度。 它可能包含802.2 LLC框架。
如果使用VLAN,并且这2个八位字节为0x8100,则必须考虑4个八位字节的802.1Q标签,然后考虑2个八位字节的以太类型/长度
在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.