- 締切済み
UDPパケットの分割について
こんにちは。 現在、クライアント&サーバの通信プログラムを作成しています。 クライアントがサーバに接続しにいく際、サーバの待ち受けポートにクライアントが UDPでブロードキャストしています。 その際、クライアントの情報もUDPに乗せて、送信しています。 ここで、問題なのですが、ネットワークモニタで通信データを見てみると、 クライアントから送信するUDPデータが1500バイト?を超えると、UDPパケットの分割が行われ、 2つめのデータが、UDPではなく、IPで送信されています。 しかも、2つめのIPのパケットがサーバ側に届くケースと届かないケースがあるように見受けられます。 (環境の違いかもしれません。) 2つめのパケット破棄は破棄が起こる環境では必ず起きます。 破棄が起きない環境では一回も起こりません。 スイッチ、NIC等で、破棄することってあるのでしょうか? ネットワーク上の問題っぽいので、OSの違い(Win2K pro,Win2k advanced server) などには関係ないですよね? どなたが、ご存知の方がおられましたらご教授願います。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- terra5
- ベストアンサー率34% (574/1662)
Ethernetのフレームサイズの上限が1500バイトなのはご存知ですか? IP自体は1500バイト以上送れますが,例えば途中の経路にEthernetがあった場合,送信時にエラーとなるか、 複数のIPに分割して送信するかします(OSやプログラム、ドライバ等の設定による)。 分割した場合は、UDPの前の方が含まれるIPパケットと UDPの後ろの方が含まれるIPパケットになります。 つまり、質問されているようなUDPとIPに分かれたように見えてるものは、単にUDPの前の方が含まれるIPパケットと 残りが含まれるIPパケットというだけで、 それそのものは問題ありません。 あとは、受信した側でその二つのIPパケットからUDPを復元するだけです。 これでIPからすれば、分割されずに1パケットとして通信されたように見えます。 話からすると、途中のスイッチなりルータなりFWなりか、受信側のIPドライバ(?)が分割されたIPパケットを正しく処理できてないか, そもそもIPパケットの分割に対応していないのではないかと思います。 ちなみに、WindowsはIPパケット分割不可の設定で送信するらしいので、このようなデータは送信時にエラーになると思います。 ただ、エラー自体は送信時でなく送信後に発生することになると思いますので,プログラムで検出できるかどうかはわかりませんが。 UDPを使うなら分割が起きないよう,1パケットのサイズは途中経路のフレームなりパケットのサイズを越えないようにした方がいいように思いますが。 そうじゃないと、このケースだとエラー出る経路上の全てをチェックし、必要なら機器なりソフトなりを交換しないとだめなように思えます。 私が作る場合,状況によってはTCPでもEthernetの1フレームに収まるようにしますし、 UDPならまず間違い無く1500(IP,UDPヘッダサイズ込み)以下にします。 もちろん、足らない場合はありますが、その場合はプログラムで自分用のヘッダつけて対処します。 パケットをモニタできるなら、ICMPのエラーが帰ってきているかも知れませんのでチェックしてみてください。
- notnot
- ベストアンサー率47% (4900/10358)
IPパケットがネットワークの途中で消えることがあるかということなら、ありますね。 消えることがあるからこそ、確実に通信を行うためのTCPがあり、IPより上位層で連番管理や受信応答を行い、不着や抜けを検知すると自動再送することで、確実な通信を実現しているわけです。 そういうことを行わないのがUDPなので、届いた・届かないなどの管理はプログラマが行わなければなりません。 消える原因として考えられるのは、 ・他のパケットとの衝突 ・ノイズ ・接触不良 ・電圧変動や高温によるネット機器の不安定動作 などで、IPパケットのデータがビット化けを起こし、チェックサムエラーとなればNIC、スイッチ、ルーター等でパケットが廃棄されます。 再現性があるなら環境の違いを詳しく調べると何か原因がわかるかもしれません。交換できるものは交換してみて変化を見るとか。
- askme_japan
- ベストアンサー率0% (0/6)
UDPは到達が必ずしも保証されないものだと聞いたことがあります。リアルタイムのストリーミングなどで使われているようです
お礼
早速のご回答ありがとうございます。 確かにUDPは到達が保障されないプロトコルだということは知っているのですが、 必ずしも、届かないという現象の原因はなんなのか?ということを調査しています。
お礼
回答ありがとうございました。 やはり、UDPの限界(システムで使用する)というものがあるという感じでしょうか。 今回のようなシステムでは、TCPを使用するほうがよりベターであるということですよね? ありがとうございました。