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およびCWRTCPフラグは「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 エンコード/デコード コードは、ECN と制御ビットの解釈を示しています。
ただし、Networksorcery TCP ページは、これらのビットのより適切なリファレンスです。

# TCP フラグ
定数 FIN を使用 => 0x01;
定数 SYN を使用 => 0x02;
定数 RST を使用 => 0x04;
定数 PSH を使用 => 0x08;
一定の ACK を使用 => 0x10;
定数 URG を使用 => 0x20;
定数 ECE を使用 => 0x40;
定数 CWR を使用 => 0x80;

CWR' ' と ' 'の 2 つのフラグは、 RFC 3168で定義されているExplicit Congestion NotificationECE用です。 ウィキペディアのリンクは、オプションの ECN サポートの情報と実装に関する優れた情報源です。最後にフロイド ECN ページ参照を含めます 両方の TCP エンドポイントが対応していない限り、ECN はサポートされないことに注意することが重要です。 この目的のために、それはあまり見られません (ネットワークや TCP コードでも同様です)。



また、ECN をサポートする実装の IP ヘッダーも、そのTOS ビットで2 ビットの ECN フィールド
を 運ぶことに注意してください。

于 2009-10-20T05:24:53.143 に答える