c - 如何确定原始数据包中http header 的起始字节?

标签 c networking network-programming

我正在用 C 语言开发网络应用程序。我有以太网 header 、IPV4 header 和 TCP header 的字段和起始字节。如何获取 HTTP header 的起始字节(指针)?

编辑:

我在初始化 HTTP header 指针时犯了一个错误。 我在这里做错了:

//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;

现在一切都很美好:) 感谢您的帮助。

最佳答案

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

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

如果你有整个以太网框架,@thurizas 给了你最重要的提示,我可以添加:

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

在以太网帧中你需要考虑:

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

  • 如果最后 2 个八位字节 <=1500,则表示负载长度。它可以包含 802.2 LLC 帧。

  • 如果您使用 VLAN 并且这 2 个八位字节是 0x8100,那么您必须考虑 4 个八位字节的 802.1Q 标记,然后是 2 个用于以太网类型/长度的八位字节

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

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

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

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

关于c - 如何确定原始数据包中http header 的起始字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31809099/

相关文章:

java - 如何让JVM默认使用给定的源IP?

java - 从生物识别指纹考勤设备中检索数据

c - unix域套接字编程

检查 TCP 套接字上的传入接口(interface)

c - 如何在函数声明语句中使用二维数组?

java - 不满意的链接错误 : no library file in java. library.path

c - 为什么指针只递增一次

c - C 中的嵌套函数

python - 如何省略 "connect: network is unreachable"消息

用于在网络适配器上打开 "File and Print Sharing for Microsoft Networks"的 PowerShell 命令