标头中存在TCP标志

时间:2009-09-26 06:08:04

标签: linux tcp flags

在我的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;
};

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

感谢。

3 个答案:

答案 0 :(得分:2)

我相信你的ECE和CWR TCP标志包含在'res2'结构成员中,这个TCP Header Image表示ECE和CWR位在URG旁边。

答案 1 :(得分:1)

是的,它们是“保留的6位”(res1 + res2)的一部分。它们是可选的,或多或少都是怨恨(史蒂文斯的书甚至没有提到它们)。 Doff是4位并指定标题长度,通常为20字节但如果包括MSS之类的选项则可以更长。

答案 2 :(得分:1)

此Perl'NetPacket::TCP'TCP编码 - 解码代码显示ECN和控制位解释 但是,Networksorcery TCP page是这些位的更好参考。

# TCP Flags
use constant FIN => 0x01;
use constant SYN => 0x02;
use constant RST => 0x04;
use constant PSH => 0x08;
use constant ACK => 0x10;
use constant URG => 0x20;
use constant ECE => 0x40;
use constant CWR => 0x80;

两个标记“CWR”和“ECE”适用于Explicit Congestion Notification中定义的 RFC 3168
Wikipedia link是信息的良好来源。 implementation可选的ECN支持 最后包括Floyd ECN page reference
重要的是要注意,除非两个TCP端点都有能力,否则不支持ECN 为此,它不常见(同样在线和TCP代码上)。

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