相手が遅延ACKを有効にして自分がNagleアルゴリズムを有効にしている状態で、自分がwrite-write-readの順で読み書きをすると、
- 最初のwriteで即座にパケットが送られる
- 2番目のwriteは(Nagleアルゴリズムにより)ACKを受信するまで送信されない
- しかし相手は遅延ACKを有効にしているので、ACKを送信するまで最大500msかかる
というように遅延が生じてしまうというのは理解できました。しかし、Nagleによるとwrite-write-writeの順番で書き込みした場合は問題が発生しないそうですが、その理由が分かりません。どうしてでしょうか?
ユーザーレベルでできる解決策は、ソケットに対して、write-write-read の順番で読み書きすることを避けることである。write-read-write-read は大丈夫である。write-write-write は大丈夫である。しかし write-write-read はダメである。それ故、可能なら、TCP での小さな書き込みをバッファリングして一度に一つにまとめて送信するべきである。標準的な UNIX I/O パッケージを使用し、読み込みの前に書き込みのフラッシュを行うならば通常は機能する。
https://ja.wikipedia.org/wiki/Nagle%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
もしかしたら
ただし、最大セグメントサイズ以上のデータを受信したときは最低限2つ目のセグメントでACK応答を返さなければならない
https://ja.wikipedia.org/wiki/TCP%E9%81%85%E5%BB%B6ACK
が関係しているのかもしれないと思いましたが、最大セグメントサイズ未満のデータを受信した場合は、2個以上のセグメントを受信してもACKを返さない場合もあるのではないでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/03 05:19
2017/01/03 06:17
2017/01/03 12:11