りんけーじ - 開発資料 - TCP Previous Segment Lost



この文書の目的

どういうわけか、TCP Previous Segment Lost で検索して来る人が多いので、そのための対策ページ(ぇ

日記に書いてあるのを読むよりは、きっとマシ。


TCP Previous Segment Lost とは

TCP では、そのパケットが全体の頭から何バイト目であるかを表す値(SEQ/ACK 番号)が付加されていて、この番号をもとにして、再送や、順序通りでないパケットの確認・再構成が行われている。

Ethereal でネットワークを流れるパケットを監視していると、[TCP Previous Segment Lost] と表記されたパケットが流れていることがある。 これは、前のパケットの SEQ 番号 + 前のパケットのペイロード長(データの長さ)が、次のパケットの SEQ 番号に一致しない場合に表示される。

例えば、次の図のような例を考える。150、250、100 バイトのパケットが連続して送信され、受信された場合である。

次に、このうち真ん中の 250 バイトのパケットが、何らかの理由によってロスト(紛失)した場合である。

SEQ 番号は送信側がつける番号なので、パケットに紛失があると受信側では計算が合わず、パケットがロストしたと検出される。このとき、3番目の 100 バイトのパケット、すなわち、ロストしたパケットの次の(ロストしていない)パケットに TCP Previous Segment Lost と表示される

previous (前の) segment (セグメント、この場合はパケットと考えてよい) lost (紛失した) という、文字通りの意味である。


なぜ発生するか

いくつかの発生要因が考えられるが、おおよそ次のいずれかであろう。

物理的な要因。Ethernet ケーブルが痛んでいるとか。
まぁ、あまりないとは思うが、ケーブルなどの問題でパケットそのものが損傷し、ルータなどで破棄される可能性がある。通信相手との間にルータがない場合などは、破損していても Ethereal でパケットは見つかるので、この場合は該当しない。
ほかの原因をチェックして、なお原因が不明なら、一応疑ってみてもいいかも?
機器の問題。NIC や HUB がお馬鹿だとか、ルータが寝ぼけているとか。
負荷が高すぎると、処理が間に合わなくてパケットが紛失することもある。
ソフトの問題。っていうか、OS とかの設定の問題。
MTU (Maximum Transmission Unit) の設定。この値が大きすぎると、ルータや HUB が処理できず、ロストの原因になることもある。
機器と同様に、負荷が高すぎるとロストすることがある。こればっかりはどうにも。

修正・更新履歴

2007/06/24
作成