tcp - 从 * char eth/ip/tcp 打包程序表示中获取 TCP 选项(超出 tcphdr->doff)

标签 tcp libpcap

玩转 http://www.tcpdump.org/sniffex.c获取数据包选项。

void payload (char *data) { // data contains full copied packet source without ethernet header.
 char *ptr = NULL;
 //ptr = data;
 //struct ip *pip = (struct ip *) ptr;

 ptr = data + sizeof(struct ip);
 struct tcphdr *thdr = (struct tcphdr *) ptr;

 ptr = data + sizeof(struct ip) + (thdr->doff*4);
 char *txt = (char *) ptr;
 // *txt can be fprint/cout'ed, returned OK.
}
  1. data + struct ip 指向(指针)(unsigned char)内存中的TCP头
  2. data + struct ip + thdr->doff*4 points to end of TCP options = beginning of the data

给定以下结构,

typedef u_int tcp_seq;

struct sniff_tcp {
        u_short th_sport;               /* source port */
        u_short th_dport;               /* destination port */
        tcp_seq th_seq;                 /* sequence number */
        tcp_seq th_ack;                 /* acknowledgement number */
        u_char  th_offx2;               /* data offset, rsvd */
#define TH_OFF(th)      (((th)->th_offx2 & 0xf0) >> 4)
        u_char  th_flags;
        #define TH_FIN  0x01
        #define TH_SYN  0x02
        #define TH_RST  0x04
        #define TH_PUSH 0x08
        #define TH_ACK  0x10
        #define TH_URG  0x20
        #define TH_ECE  0x40
        #define TH_CWR  0x80
        #define TH_FLAGS        (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
        u_short th_win;                 /* window */
        u_short th_sum;                 /* checksum */
        u_short th_urp;                 /* urgent pointer */
};

TCPDump代码中也有引用:

 tp = (struct tcphdr *)bp; // packet header.
  hlen = TH_OFF(tp) * 4;    // data length?

  if (hlen > sizeof(*tp)) {
                 register const u_char *cp;
                 register u_int i, opt, datalen;
                 register u_int len;
                 hlen -= sizeof(*tp);

因此,要读取数据包的一部分,即选项所在的位置,需要:

  1. 假设数据包中指定的长度大于结构长度
  2. 读取(ethernet + ip + tcphdr)结构长度后的 N 个字节?
  3. 放下那些字节,现在读取有效负载。

对吗?读取随机负载的字节序列而不是实际数据只会让我厌烦。

最佳答案

选项位于 data + sizeof(struct ip) + sizeof(struct tcphdr)txt 之间。可能没有选项,在这种情况下这些指针将相等。

关于tcp - 从 * char eth/ip/tcp 打包程序表示中获取 TCP 选项(超出 tcphdr->doff),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4221448/

相关文章:

tcp - 如何使用 libpcap 在原始数据包的 TCP header 中打印标志

windows - Pcap 和 WinPcap 有多相似?

go - 处理多个网络客户端

WCF 元数据包含无法解析的引用

c# - TcpClient.Close() 仅适用于 Thread.Sleep()

java - 使用 Spring Integration 使 ssl-context-support 有条件地使用 tcp-connection-factory

python - 如何存储抓包数据(*.pcap)以供分析

linux - libpcap 到达间隔时间和调度程序

python - 扭曲忽略从 MUD 客户端发送的数据?

C:inet_ntop返回值位置?