TCPとUDPのパケットは分割できるのか?

TCPパケットはバラバラにレシーバーに届くのか?

例えば、TCPプロトコルを使って20バイトを送信した場合、10バイトの後にまた10バイトとかではなく、一度に正確に20バイトを受信することを100%確信できますか?

UDPプロトコルについても同じ質問があります。
UDPが信頼性に欠け、パケットがまったく届かなかったり、異なる順序で届いたりすることは知っている。パケットが到着した場合、それが断片ではなく完全なパケットであると確信できますか?

TCPパケットはバラバラに受信機に届くのでしょうか?

はい。IPはフラグメントをサポートしていますが、TCPは一般的にパスのMTUを決定し、パフォーマンス上の理由からパケットをそれよりも小さく保とうとします。フラグメントはデータグラムの損失率を極端に増加させます。パケットロス率が10%のパスの場合、データグラムを2つのパケットにフラグメントすると、データグラムロス率は20%近くになります。(どちらかのパケットが失われれば、データグラムは失われる)。

しかし、TCPレイヤーはこのことを心配する必要はありません。IP層はパケットを全体のデータグラムに再構成します。

例:TCPプロトコルを使って20バイトを送信する場合、10バイトの後にさらに10バイトとかではなく、一度に正確に20バイトを受信することを100%確信できますか?

いいえ、それはパケットとは関係ありません。TCPは基本的に、アプリケーション・メッセージの境界を保持しないバイト・ストリーム・プロトコルです。

UDP プロトコルについても同じ質問があります。UDPは信頼性が低く、パケットが全く到着しなかったり、異なる順序で到着したりすることは知っています、

TCPも同じです。パケットはパケットです。TCPにはリトライと順序変更がプロトコルに組み込まれているのに対し、UDPには組み込まれていないという違いがあります。

しかし、1パケットはどうでしょう?もしそれが到着したら、それが断片ではなく完全なパケットであると確信できますか?

いいえ、それはあなたの問題ではありません。UDPプロトコルはデータグラムの再組み立てを処理する。それがUDPプロトコルの仕事の一部です。(実際には、IPプロトコルがUDPプロトコルのためにこれを行うので、UDPは単にIPの上に重ねられているだけである)。データグラムが2つのパケットに分割された場合、IPプロトコルはUDPプロトコルのためにそれを再アセンブルします。

解説 (1)

パケットが物理的に一度に届くとは限らない。TCP/UDPより下のデータリンク層は、パケットを分割したければ分割するかもしれません。特にインターネットや自分の管理外のネットワークでデータを送信する場合、それを予測するのは難しい。

しかし、データが1つのパケットで届いたとしても、複数のパケットで届いたとしても、受信側には関係ありません。OSはこれらのパケットの連結を抽象化するはずなので、アプリケーションにとってはすべてが一度に到着したように見えます。ですから、あなたがカーネルハッカーでない限り、ほとんどの場合、このデータが1つのパケットで転送されるか、複数のパケットで転送されるかを心配する必要はありません。

UDPの場合もOSが何らかの抽象化を行うので、データを受信するアプリケーションは、データが何パケットで転送されたかを知る必要はない。しかし、TCPとの違いは、データが実際に到着する保証がないことです。また、データが複数のパケットに分割され、あるパケットは到着し、あるパケットは到着しないということもあり得ます。受信側のアプリケーションにとっては、データが完全であろうとなかろうと、とにかくデータのストリームにしか見えない。

解説 (5)

例:TCPプロトコルを使って20バイトを送信する場合、100%確実に受信できるでしょうか? バイトを一度に受け取ることができますか? バイトとかですか?

いいえ、TCPはストリームプロトコルであり、データの順序を保ちますが、メッセージごとにグループ化することはありません。一方、UDPはメッセージ指向ですが、信頼性がありません。SCTPは両方の長所を兼ね備えていますが、NATがインターネットを壊してしまうので、ネイティブには使えません。

解説 (0)