在我的ubuntu 9.04上,/usr/include/netinet/tcp.h定义tcp header 如下

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标志。 tcphdr结构中定义的res1,res2和doff值是什么意思?
无论如何,是否也可以访问ECE和CWR标志值?

谢谢。

最佳答案

是的,它们是“保留的6位”(res1 + res2)的一部分。它们是可选的,或多或少是令人讨厌的添加(Stevens的书甚至没有提到它们)。 Doff是4位,并指定 header 长度,该长度通常为20个字节,但如果包括MSS之类的选项,则可以更长。

10-04 13:46