我正在用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;
现在一切都是桃子:) 谢谢你的帮助。
答案 0 :(得分:2)
这取决于您用于获取数据报的接口类型。您可能正在使用套接字接口。你也可以使用pcap。 如果您使用socekts,则取决于您使用的套接字类型:
如果您拥有整个以太网帧,@ thurizas,给了您最重要的提示,我可以添加:
在以太网框架中,您需要考虑:
如果最后2个八位字节是> = 1536,这是最典型的情况,那就是Ethertype。当在IP有效载荷中传送IP数据报时,您将看到值0x0800。在这种情况下,在0x0800之后,您拥有整个IP数据报。
如果最后2个八位字节是< = 1500,则表示有效负载长度。它可能包含802.2 LLC帧。
如果您使用VLAN并且这两个八位字节是0x8100,那么您必须考虑4个八位字节的802.1Q标记,然后考虑2个八位字节的Ethertype / Length
在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个字节开始进入数据包。当然,您需要阅读各种尺寸字段并根据需要进行调整。