ネットワークプログラミング相談室 Port29
レス数が950を超えています。1000を超えると書き込みができなくなります。
0990デフォルトの名無しさん
2014/10/30(木) 23:13:37.00ID:vmfUc9wP>>982 のレスで正しくて、だぶん蛇足だと思うけど解説しとく
まず、UDP を利用するアプリケーションから見た「論理メッセージ」と
送信側/受信側の対向する UDP 間で転送される「データグラム」を混同しやすいので注意が必要
で、UDP 上の論理メッセージに関して「途中でちょん切ったりくっつけたり」することはない
ただし UDP は「順番が入れ替わったり取りこぼしが出る」信頼性の無いプロトコルだから、
たとえば送信側アプリが "123" と "456" という論理メッセージの送信を UDP へ要求した場合、
受信側アプリでは以下に示す4通りのパターンのいずれかになることが保証されている
1) 正常な転送 : "1234" "5678"
2) 部分的な欠落(1): "1234"
3) 部分的な欠落(2): "5678"
4) すべて欠落 : (* 何も受信しない *)
ここで、UDP は論理メッセージ間に境界が存在するブロック指向プロトコルだから、(ストリーム指向の TCP とは異なり)
"12" "34" "56" "78" と「途中でちょん切ったり」することはないし、"12345678" と勝手に「くっつけたり」することもない
次に UDP 間で転送されるデータグラムについては、分割(fragment)と組み立て(reassemble)が起きることがある
つまり送信側 UDP で1個のデータグラムが複数の IP パケットへと分割されてから転送され、
受信側 UDP によって複数の IP パケットが1個の データグラムへと組立てられることがある
その結果として「(UDP はデータグラムを)途中でちょん切ったりくっつけたり」することがある、と言える
ただし、アプリケーションからデータグラムの分割/組み立ては見えないから、一般にソケットプログラマが意識する必要はない
レス数が950を超えています。1000を超えると書き込みができなくなります。