Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何确定原始数据包中http头的起始字节?_C_Networking_Network Programming - Fatal编程技术网

C 如何确定原始数据包中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

我正在用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;
现在一切都很美好:)
谢谢你的帮助。

正如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有效负载
如果你有整个以太网帧,@thurizas给了你最重要的提示,我可以补充:

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

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


  • 如果最后两个八位字节是,您是否考虑HTTP请求可能会分布在多个数据包中?HTP标头位于TCP数据中,因此只需移动到TCP标头之后的第一个数据。