前へ << UDP を使ってみよう (3) | DNS クライアントを作ってみよう (1) >> 次へ |
print SOCKET "data1"; print SOCKET "data2";としたとき、data1 は data2 より必ず先に届きます。 多くの場合、送信側 OS が
"data1data2"と結合してから、1つのパケットとして送信します。 もし
"data1" "data2"という2つのパケットで送信して、 仮に送信途中で順序が入れ替わり、
"data2" "data1"という順序で相手先に到着したとしても、 受信側 OS がパケットの送信順序を調べ、 サーバプログラムがデータを読み込むときには
"data1" "data2"という順序に入れ替わっています。つまり、
1. print SOCKET "data1"; print SOCKET "data2";
2. print SOCKET "data1data2";
3. print SOCKET "dat"; print SOCKET "a1d"; print SOCKET "ata2";送信側が 1〜3 のどの書き方をしても、データ受信側からすると全く等価なのです。 これを
a. send(SOCKET, "data1", 0, $sock_addr); send(SOCKET, "data2", 0, $sock_addr);と
b. send(SOCKET, "data1data2", 0, $sock_addr);は全く違います。a はパケットが必ず 2個流れます。b だと 1個です。
例えば、FTP のようなファイル転送を行なう場合、 1つの大きなファイルを小さなパケットに分割して送らなければいけません。 どのパケットが1番目で、どのパケットが2番目なのか、順序関係を明確にしないといけませんので、 TCP が向いています。
一方、DNS のように 1つ1つの問い合わせが独立しており、 それらの間には順序関係がない場合は UDP が向いていると言えます。
前へ << UDP を使ってみよう (3) | DNS クライアントを作ってみよう (1) >> 次へ |
ご意見・ご指摘は Twitter: @68user までお願いします。