我正在用 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/