在我的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标志值?
感谢。
答案 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字段。