• 締切済み

winsockを使ったTCP及びUDP通信について

今回winsockを使った通信プログラムを組む事になったのですが、わからない点が多々ありましたので、どなたかご教授頂けると大変ありがたいです。 1. TCP通信において、送信側が"Hoge" "Fuga"と2回sendした際、受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? (到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 2. UDP通信においては、上記のような現象は起きないと認識しているのですが、これは正しいでしょうか? (UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? 4. 2が正しい前提での話です。UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? (MTUが1500Byteの場合、UDPで2000Byteをsendすると、recvで1500,500と2回受信する?) 以上の4点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

みんなの回答

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

1.正しい TCPはバイトストリームを送ります。バイト順は保障しますがパケットの単位は考慮されません。 2.概ね正しい UDPはパケットを送ります。パケットを勝手に分割したり結合したりはしません。ただし同じパケットが複数回受信されることはあるので送信回数より多く受信する可能性は排除できません。 3.ない ただしパケット単位での到着順は保障されません。 4.動作としては意識する必要はない 途中のIPパケットは分割されても、UDPで再構成した上で受信します。再構成できない場合はパケットの一部が受信されるのではなくパケット全体が破棄され受信されません。 ただし、上記により大きなパケットは届きにくいのでほとんどの場合にUDPは小さいサイズで送ります。そういう意味では意識する必要があります。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? 1回で受信する場合もあります。 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/effective-tcp.html >(到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 概ね合っている…かと。 # 順序だけでなく、通信エラーがあった場合の再送処理なども保証されます。 # ドライバが処理しているのでプログラム側では判りませんが。 >(UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 分割に関しては不明(UDP使ったことないので)ですが… 同じパケットを複数回受信することもある…らしいです。 >3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? ありえる。 と考えておいたほうがよい…かと。 >UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? 意識すべし…なのかも知れませんが…。 下層でのデータフレームのサイズに関して、どこまで考慮すべきなのか…は不明です。 PPPの場合もあったりするでしょうし。 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#udpbad とりあえず、よろしく処理してくれる…らしいです。