• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:TCP/IP通信について)

TCP/IP通信のデータ送信で発生する問題とその解決方法

このQ&Aのポイント
  • TCP/IP通信において、データ送信時に発生する問題とその解決方法について説明します。
  • 現在、TCP/IP通信のプログラミングを行っており、サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っていますが、データが連なって送信される事象が発生しています。
  • OutputStreamではwrite後にflushを行っているので、送信用バッファが送信されるイメージであるが、実際には4byteで送信できていないように見えます。解決方法をご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> なるほどー。境界が維持されないんですねー。 > ということは、パケット内にサイズを保持するとかしないといけないんですかね…。 そうなります。 TCPの機能はJava自体ではなく,OS等が実現しています。 パケット未達時に再送してくれたり,パケットの到着順が入れ替わった場合に並び替えるのもJavaではなくOS等の機能です。 着信系の機能はプロセスを横断して行う必要があるので,UNIXやWindowsといったOSではJavaに任せるのは難しいと思いますし。 # どこまでをOSと呼ぶかやデバイスドライバの実装によって実際の処理箇所が異なるのでOS等と書いています。 なので,Java側でflushしても,デバイス (デバイスドライバ含む) のバッファに転送されるだけかと思います。 さらにNagleアルゴリズムが有効な限り,最大で200ms程度 (規格上は500ms) の間の送信はデバイス側でまとめられます。 今回はACKを載せるパケットがどんどん出来るので,遅延ACKによる遅延がほとんどなく,結果としてNagleアルゴリズムも大きく働いてはいないのだと思います。 # サーバー側が送信を止めた場合,800octetくらいのデータが一気に送受信されるかもしれません。 送信側としては,Nagleアルゴリズムを無効にすることでデータを即座に送信することが出来ます。 ただし,受信側でパケット境界が維持されるとは限りませんし,4octetのデータに20octetのTCPヘッダと20octetのIPv4ヘッダ (IPv6だと40octet) が付随するので,ネットワーク効率を下げる可能性があります。

その他の回答 (3)

  • SeydaNeen
  • ベストアンサー率43% (26/60)
回答No.3

すみません、flushの説明違うかも。あと、4バイトより短いデータが取れるかもしれません。それはsizeを見て残りをとって・・。

  • SeydaNeen
  • ベストアンサー率43% (26/60)
回答No.2

UDPという意見もありますが、今から組み替えて、到達確認、再送処理を入れ込むのは面倒ですね。この辺、本番環境で問題になるんですよ。 と言いますか、 byte rcvData[] = new byte[16];とやってるのはなぜでしょうか?これは、「最大16バイト取ろう」としていることになります。 size = ins.read(rcvData, 0, 4);とやるのがいいと思いますが。 実際にこのプログラムを動かしてみましたよ。(javacとやったら、なんとjdkインストールしとらんかった!) 8バイト取ることがありましたが、改良後は100秒動かしても4以外はありません・・・。 ちなみに、「OutputStream の flush メソッドは何も行いません。」とAPIドキュメントに書かれてます。APIドキュメントは重要です。

shin2chan
質問者

お礼

回答ありがとうございます! サイズ指定しても、8byte となってしまいますね…。 改良って他にも変更されたのでしょうか…? flushのAPI見ましたが、何もしないとは書かれていないように見えました。 ただ、実際のAPIソースコード見たら、ご指摘通り何にもしない、空APIに見えました。

回答No.1

TCPはパケット境界を維持しないプロトコルです。 送信側での複数のパケットが受信側では1つのパケットになることもありますし, 送信側では1つのパケットだったものが受信側では複数のパケットとなることもあります。 そのため,パケット境界が維持されないことを前提にTCP上にプロトコルを作成するか,UDPなどのパケット境界を維持するプロトコルを使う必要があります。

shin2chan
質問者

お礼

回答ありがとうございます! なるほどー。境界が維持されないんですねー。 ということは、パケット内にサイズを保持するとかしないといけないんですかね…。

関連するQ&A