2

在我的 ubuntu 9.04 上,/usr/include/netinet/tcp.h 定义了 tcp 标头,如下所示

struct tcphdr
  {
    u_int16_t source;
    u_int16_t dest;
    u_int32_t seq;
    u_int32_t ack_seq;
#  if __BYTE_ORDER == __LITTLE_ENDIAN
    u_int16_t res1:4;
    u_int16_t doff:4;
    u_int16_t fin:1;
    u_int16_t syn:1;
    u_int16_t rst:1;
    u_int16_t psh:1;
    u_int16_t ack:1;
    u_int16_t urg:1;
    u_int16_t res2:2;
#  elif __BYTE_ORDER == __BIG_ENDIAN
    u_int16_t doff:4;
    u_int16_t res1:4;
    u_int16_t res2:2;
    u_int16_t urg:1;
    u_int16_t ack:1;
    u_int16_t psh:1;
    u_int16_t rst:1;
    u_int16_t syn:1;
    u_int16_t fin:1;
#  else
#   error "Adjust your <bits/endian.h> defines"
#  endif
    u_int16_t window;
    u_int16_t check;
    u_int16_t urg_ptr;
};

在标志部分,定义了 FIN、SYN、RST、PSH、ACK、URG 值,而我找不到 ECE 和 CWR 标志。struct tcphdr 中定义的 res1、res2 和 doff 值是什么意思?是否也可以访问 ECE 和 CWR 标志值?

谢谢。

4

3 回答 3

2

我相信您的 ECE 和 CWR TCP 标志包含在“res2”结构成员中,此TCP 标头图像显示 ECE 和 CWR 位位于 URG 旁边。

于 2009-09-26T06:21:59.240 回答
1

是的,它们是“保留的 6 位”(res1 + res2)的一部分。它们是可选的,并且或多或少地讨厌添加(史蒂文斯的书甚至没有提到它们)。Doff 是 4 位,并指定通常为 20 字节的标头长度,但如果包含 MSS 等选项,则可以更长。

于 2009-09-26T06:40:19.650 回答
1

这个 Perl ' NetPacket::TCP' TCP Encode-Decode 代码显示 ECN 和控制位解释。
但是,Networksorcery TCP 页面是这些位的更好参考。

# TCP 标志
使用常量 FIN => 0x01;
使用常量 SYN => 0x02;
使用常量 RST => 0x04;
使用常量 PSH => 0x08;
使用常量 ACK => 0x10;
使用常量 URG => 0x20;
使用常量 ECE => 0x40;
使用常量 CWR => 0x80;

CWR' ' 和 ' '这两个标志ECE用于RFC 3168中定义的显式拥塞通知Wikipedia 链接是获取可选 ECN 支持的信息和实施 的良好来源。最后包括Floyd ECN 页面参考 需要注意的是,除非两个 TCP 端点都支持,否则不支持 ECN。 为此,它并不常见(在线和 TCP 代码上也是如此)。



另请注意,支持 ECN 的实现的 IP 标头
还将在其TOS 位中携带两位 ECN 字段

于 2009-10-20T05:24:53.143 回答