6

返されたパケットを受信して​​解析できるように、(たとえば) ポート 123 経由で NTP サーバーに送信するネットワーク パケットを生成したいと考えています。目標は、ネットワーク化されたシステムによってパケットがどのように生成され、読み取られ、応答されるかをよりよく理解することです。

(1) 構造体を使用してパケットを生成する必要がありますか?

(2) 構造体内のさまざまなフィールドに適切に入力する方法がわかりません。たとえば、送信元と送信先の IP アドレスを 16 進値で設定する必要がありますか。それとももっと人間に優しい方法はありますか?

(3) 次に、フィールドに値が入力されたら、send()/write() 経由で UDP 接続を介して NTP サーバーに構造体を送信できますか? (または TCP、プロトコルが要求する場合)

私のアプローチは合理的ですか?NTP RFC を読んでいますが、クライアントがサーバーに何を送信する必要があるかまだわかりません (IP アドレスなど。これはネットワーク層ヘッダーによって処理されるべきではありませんか?) 私はこの NTP をモデル化しましたRFC 5905 の付録 A の「送信」の例の後の構造体。よろしくお願いします。以下のコード例は、RFC 5905 のサンプル コードを借用しています。

typedef unsigned long ipaddr;       //32 bits (4 bytes)
typedef signed char s_char;     //character type as number, -128..127
typedef unsigned int tdist;     //character type as number, 0..255
typedef unsigned long long tstamp;  //64 bits (8 bytes)
typedef unsigned long digest;       //32 bits (4 bytes)

struct Ntp {
    ipaddr  dstaddr;
    ipaddr  srcaddr;
    char    version;
    char    leap;
    char    mode;
    char    stratum;
    char    poll;
    s_char  precision;
    tdist   rootdelay;
    tdist   rootdisp;
    char    refid;
    tstamp  reftime;
    tstamp  org;
    tstamp  rec;
    tstamp  xmt;
    int     keyid;
    digest  dgst;
} Ntp;

int main()
{
    struct Ntp packet;

    //packet.dstaddr=WHAT_GOES_HERE;
    //...
    //...
    //packet.dgst=WHAT_GOES_HERE;

    return 0;
}
4

1 に答える 1

2

あなたは、ネットワーク プロトコルを書いた経験があまりないようです。構造体を宣言して書き出すことは、適切な方法ではありません。また、http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.htmlを参照し、具体的には次の点を指摘します。

  • 既存のパッケージの 1 つを実行するのに比べて、なぜ独自のパッケージを作成したいのですか?

  • NTP クライアントを作成する際の問題の 1 つは、正しい時刻を取得することです。

  • もう 1 つは、ネットワークの残りの部分を台無しにしたり、サーバーに不当な負荷をかけたりすることではありません。

いずれにせよ、私が指摘したスレッドで説明したように、SNTP を使用したいので、ntp tarball の SNTP 参照実装を調べて、その方法を示し、何をすべきかを理解するのに役立ててください。

于 2011-06-25T00:15:01.433 に答える