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
処理の方式
パケットの分断か結合処理が存在しているので、受信者が受信したデータを再処理する必要があります。主に次のような問題を解決します。
- パケットが結合された場合、同じパケットから複数のパケットの内容を取得できます。
- パケットが分断された場合、前のパケットの内容を一部保留して、次のパケットの内容に結合します。
現在、主流となっている処理の方式は2つ:
1. パケットにマークをつける
例えば、パケット内容の先頭に“START”、末尾に"END"という文字列を追加することで、受信側は、“START”と"END"の間の内容は、受信する必要のある内容だと特定することができます。
START123456789END
STARTABCDEFGHEND
12
2. パケットの先頭に内容の長さを説明
発信側は、パケットの先頭に内容の長さを説明すると、受信側は、パケットを受信した後、その長さの説明によって受信する必要のある内容を特定できます。
PACKAGELENGTH:0009123456789
PACKAGELENGTH:0008ABCDEFGH
12