ファイルの転送に使用されるトランスポート プロトコルには、TCP と UDP の 2 つがあります。 UDP は信頼性の低いプロトコルですが、TCP は信頼性、フロー制御、輻輳制御を提供しますが、明示的な接続確立フェーズがあり、アプリケーションによってはこれが望ましくない場合があります。このプロジェクトの目標は、接続確立フェーズを必要とせずに、TCP の優れた機能をすべて備えたファイル転送アプリケーションを設計して実装することです。
UDP サーバーとクライアントは次のヘッダー形式を使用します。
サーバーはクライアントからのファイル要求を受け取ります。リクエストからファイル名を抽出し、バッファ内のファイルのコンテンツを取得します。次に、ファイルをヘッダーでサポートされているサイズ 1450 バイトのチャンクに分割します。
考慮すべきウィンドウ サイズは 2 つあります。
サーバーは、輻輳ウィンドウ サイズとアドバタイズされたウィンドウ サイズの最小値までファイル セグメントの送信を開始します。ウィンドウ内のすべてのセグメントを送信した後、確認応答の受信を待ちます。次に送信されるシーケンス番号よりも小さいシーケンス番号に対する確認応答が受信された場合、前のセグメントが正しく受信されなかったことを意味し、サーバーはクライアントからの 3 つの重複した確認応答を受け入れます。次に、受信した確認応答に基づいて次のシーケンス番号を設定します。累積確認応答を受信した後、次のウィンドウでセグメントの送信を続けます。重複した確認応答を受信すると、サーバーは正しく受信されなかったパケットからセグメントの送信を開始します。
クライアントが受信するパケットとサーバーが受信する確認応答の往復時間 (RTT) を推定するための Jacobson/Karel アルゴリズムを実装しました。サーバーが RTT 内に確認応答を取得できない場合、それらのパケットは再度再送信されます。
疑似コード:
Estimated_RTT = (1-α) Estimated RTT + (α) Sample_RTT
In the original TCP Specification, α=.0125
Jacobson/Karels included a variation component to the calculation for the Estimated_RTT
Estimated_RTT = Estimated_RTT + δ (Sample_RTT-Estimated_RTT)
Deviation = Deviation + δ (|Sample_RTT- Estimated_RTT|- Deviation)
Timeout = μ * Estimated_RTT + φ * Deviation
Typically φ=4, μ = 1, δ is between 0 and 1
サーバーは 1 セグメントを送信することで起動します。次に、輻輳制御の 2 フェーズが続きます。
スロー スタート:セグメント サイズは、タイムアウト内に受信者によって正しく確認され、輻輳ウィンドウ サイズが 64000 バイトに設定されている ssthresh 未満になるまで、指数関数的に増加します。
輻輳の回避:輻輳ウィンドウ サイズが ssthresh 以上になると、輻輳ウィンドウ サイズは 1 セグメント サイズずつ直線的に増加します。
タイムアウト:上記の Jacobson/Karel アルゴリズムを使用して計算されます。タイムアウトが発生すると、ssthresh は輻輳ウィンドウの半分の値に設定され、輻輳ウィンドウは 1 セグメント サイズにリセットされます。
vagrant up
これにより、サーバーとクライアントの両方のマシンが起動します。
vagrant ssh reliableUDPServer
vagrant ssh reliableUDPClient
make
./Server port advertised_window
サーバーは次のコマンドライン引数を受け入れます。
port: 通信に使用するポート番号
アドバタイズドウィンドウ: サーバーが確認応答を待つ前に送信を許可されるバイト数
./Client server_host_name port file_name advertised_window
クライアントは次のコマンドライン引数を受け入れます。
portとadvertised_window:サーバーのものと同じ
server_host_name: サーバーのホスト名
file_name: クライアントが要求したファイルの名前
コードが正常に実行されると、クライアントが要求したファイルが ReliableUDPClient フォルダー内に見つかります。
コンピュータ ネットワーキング - トップダウン アプローチ