-3

スライディングウィンドウプロトコルをデータリンクプロトコルとして使用し、UDPソケットを使用して通信する2つのアプリケーションを実装しています。Tanembaumの本を参考にして、スライディングウィンドウプロトコルを実装しようとしています。これが私が本で見つけたコードです。

/* Protocol 4 (sliding window) is bidirectional and is more robust than protocol 3. */

    #define MAX_SEQ 1   /* must be 1 for protocol 4 */
    typedef enum {frame_arrival, cksum_err, timeout} event_type;
    #include "protocol.h"

    void protocol4 (void)
    {
    seq_nr next_frame_to_send;  /* 0 or 1 only */
    seq_nr frame_expected;  /* 0 or 1 only */
    frame r, s; /* scratch variables */
    packet buffer;  /* current packet being sent */
    event_type event;

    next_frame_to_send = 0; /* next frame on the outbound stream */
    frame_expected = 0; /* number of frame arriving frame expected */
    from_network_layer(&buffer);    /* fetch a packet from the network layer */
    s.info = buffer;    /* prepare to send the initial frame */
    s.seq = next_frame_to_send; /* insert sequence number into frame */
    s.ack = 1 - frame_expected; /* piggybacked ack */
    to_physical_layer(&s);  /* transmit the frame */
    start_timer(s.seq); /* start the timer running */

    while (true) {
    wait_for_event(&event); /* could be: frame_arrival, cksum_err, timeout */
    if (event == frame_arrival) { /* a frame has arrived undamaged. */
            from_physical_layer(&r);    /* go get it */

            if (r.seq == frame_expected) {
                    /* Handle inbound frame stream. */
                    to_network_layer(&r.info);  /* pass packet to network layer */
                    inc(frame_expected);    /* invert sequence number expected next */
            }

            if (r.ack == next_frame_to_send) { /* handle outbound frame stream. */
                    from_network_layer(&buffer);    /* fetch new packet from network layer */
                    inc(next_frame_to_send);    /* invert sender's sequence number */
            }
    }

    s.info = buffer;    /* construct outbound frame */
    s.seq = next_frame_to_send; /* insert sequence number into it */
    s.ack = 1 - frame_expected; /* seq number of last received frame */
    to_physical_layer(&s);  /* transmit a frame */
    start_timer(s.seq); /* start the timer running */
  }
  }

これをJavaに翻訳するのに少し混乱しています。ここでスレッドがどのように適用されるのか正確にはわかりません。これを実装するのに役立つヒントや戦略を探しています。

編集

私は最も混乱しています:

  • 関数wait_for_event()およびstart_timer()を実装する場合。
  • UDPソケット部分はどこに置くべきですか?UDPソケット部分はto_physical_layer()とfrom_physical_layer()内にあると思います。私が間違っている場合は訂正してください。
  • プロトコルは双方向であるため、両方のアプリケーションに同じコードを含める必要がありますか?
4

2 に答える 2

1

関数wait_for_event()およびstart_timer()を実装する場合。

あなたはそれらを必要としません。それぞれとを使用DatagramSocket.setSoTimeout()catch (SocketTimeoutException)ます。

UDPソケット部分はどこに置くべきですか?UDPソケット部分はto_physical_layer()とfrom_physical_layer()内にあると思います。私が間違っている場合は訂正してください。

recv()プレゼントと同じ場所でsend()お電話します。

プロトコルは双方向であるため、両方のアプリケーションに同じコードを含める必要がありますか?

はい。

于 2013-02-03T03:47:02.073 に答える
1

まず第一に、UDPの上にあるスライディングウィンドウレイヤーに時間と労力を費やす前に、そのようなエキゾチックなソリューションが必要かどうかを確認してください。TCPはすでにそのようなことを行っており、多くの人々がそれを正しく堅牢にするために多くの時間を費やしてきました。しかし、もちろん、そのようなソリューションを実装する正当な理由があります。次のステップはグーグルで回ることです。おそらく、非常によく似たプログラムがすでに何十もあります。特に、JavaのネットワーキングAPIの経験があまりないように思われるため、人々のネットワーキングの概念を学ぶことを目的とした本の例よりも、Javaコードの実用的な部分から始める方がはるかに効率的です。

とにかく、上記のプロトコルを再実装する場合は、 DatagramSocketクラスのJavadocを読み取ることから始めます。上記のコードのタイマーを置き換えることができるsetSoTimeoutメソッドがあります。主な違いは、タイムアウト時に受信する SocketTimeoutExceptionがスローされるため、プログラムのフローが少し複雑になる可能性があることです。from_physicalビットとto_physicalビットを忘れてください。これらはすべてSocketクラスによってラップされています。

于 2013-02-03T00:20:30.197 に答える