C 如何确定原始数据包中http头的起始字节?
我正在用C语言开发一个网络应用程序。我有以太网报头、IPV4报头和TCP报头的字段和起始字节。如何获取HTTP头的起始字节(指针) 编辑: 初始化HTTP头的指针时出错。 我在这里做错了:C 如何确定原始数据包中http头的起始字节?,c,networking,network-programming,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 + tc
//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;
现在一切都很美好:)
谢谢你的帮助。正如jdweng所说,HTTP包在TCP头之后。我们知道以下几点:
- 我们知道ethernet II报头包含一个8字节的前导码,一个6字节的前导码 字节目标地址(目标MAC地址),6字节 源地址和一个2字节类型的字段。在大多数情况下,我从来没有 看到了序言,但开始在dest MAC地址获取数据,这 使以太网部分的长度为14字节
- IP头中的第一个字节包含版本和头
大小(以32位字的数量表示)。通常这是0x45 这意味着我们正在使用IPv4,并且
标题。这意味着IP头的长度为20字节。(见RFC) 791获取更多信息) - 我们知道TCP报头中的offset字段给出了
TCP头中的32位字。此字段的最小值为
5,但如果有可选字段,则可以更长。因此,最低限度 TCP头的大小为20字节。(有关更多信息,请参阅RFC 793。) 在TCP标头上)
由此,假设每个头具有默认大小,HTTP头将至少从数据包的54字节开始。当然,您需要读取各种大小字段并根据需要进行调整。这取决于用于获取数据报的接口类型。您可能正在使用套接字接口。您也可以使用pcap。 如果您使用socekts,则取决于您使用的插座类型:
- 数据包套接字:您可以直接获得以太网帧
- 原始套接字:您可以读取IP数据报(带或不带IP头)
- 数据报或流套接字:您可以读取UDP或TCP有效负载
- 以太网帧将有14个八位字节(网络语言中的字节)长度:1个目标地址,2个源地址,3个以太类型或长度
- 如果最后2个八位字节>=1536,最典型的情况是Ethertype。当IP数据报在帧有效负载中传输时,您将看到值0x0800。在本例中,在0x0800之后,您拥有整个IP数据报
- 如果最后两个八位字节是,您是否考虑HTTP请求可能会分布在多个数据包中?HTP标头位于TCP数据中,因此只需移动到TCP标头之后的第一个数据。