メインコンテンツまでスキップ

Socket通信:パケットの分断と結合

Socket通信中、送信されるバイトデータにおいて、パケットの分断と結合処理が行われ、Socketの内部の最適化メカニズムになります。

パケットの結合:比較的に小さいバイトデータを頻繁に送信する場合、これらのデータを結合して、メモリ消費を削減します。

パケットの分断:送信するバイトデータが大きな場合、Socketは、このバイトデータにおいて分断処理することで、メモリの消費を削減します。

例の説明:

現在、2つのパケットを送信します。具体内容は次のとおり:

123456789
ABCDEFGH

受信側が123456789とABCDEFGHといった2つのパケットを受信するのは一番理想的な状況ですが、パケットの分断と結合処理を行うと、その状況が実現されません。

パケット結合の場合

2つのパケットは、非常に短い間隔(例えば0.1秒以内)で送信される場合、パケットの長さが十分であると、受信側は、次の1つパケットのみを受け取ります。

123456789ABCDEFGH
1

パケット分断の場合

もし、パケットの最大の長さを5バイトに設定する場合(極端の場合、一般の長さは1000−1500の間にある)、受信側は、次のような4つのパケットを受信します。

12345
6789
ABCDE
FGH
1234

処理の方式

パケットの分断か結合処理が存在しているので、受信者が受信したデータを再処理する必要があります。主に次のような問題を解決します。

  1. パケットが結合された場合、同じパケットから複数のパケットの内容を取得できます。
  2. パケットが分断された場合、前のパケットの内容を一部保留して、次のパケットの内容に結合します。

現在、主流となっている処理の方式は2つ:

1. パケットにマークをつける

例えば、パケット内容の先頭に“START”、末尾に"END"という文字列を追加することで、受信側は、“START”と"END"の間の内容は、受信する必要のある内容だと特定することができます。

START123456789END
STARTABCDEFGHEND
12

2. パケットの先頭に内容の長さを説明

発信側は、パケットの先頭に内容の長さを説明すると、受信側は、パケットを受信した後、その長さの説明によって受信する必要のある内容を特定できます。

PACKAGELENGTH:0009123456789
PACKAGELENGTH:0008ABCDEFGH
12