| GnutellaNet上では、まるで人々のようにこれらのパケットがうろうろ動き回っている。 それぞれのパケットは数字を持っている。僕のクライアントがネットワークに何かを送る場合、パケットに番号をくっつける。 他のGnutellaクライアントがそのパケットをフォワードする場合、本来の番号を付けられたパケットをフォワードする。クライアントがそのパケットに応答する場合、元々割り当てられた番号をつけたまま返される。それで僕のクライアントは質問と返ってきた返事を照合できる。置きらかに、このことは非常に重要なことだ。
事実、それは見かけよりもずっと重要なことなんだ。クライアントがパケットをフォワードすべきかどうかはGUIDでのみ知ることができる。もし、そのクライアントが既に見たことのあるGUIDと機能IDのペアを運んでいるパケットだったら、それはフォワードすべきじゃないということがわかる。たとえば、GUID123123を持つPINGパケットを既に見たことがあれば、クライアントはGUID 123123をもったPINGパケットをフォワードすべきではない。わかったかなぁ? どうして既に見たものをそういう風に扱うんだろう?
うん。君のクライアントがあるパケットを送る場合、そのパケットのGUIDを記憶する。返事がきた場合、送られてきたGUIDがメモリのなかにあるかを見て、もし返ってきたパケットのGUIDが自分のGUIDと同かどうか調べて、それからそのパケットを処理する。そして明らかに既に見たパケットなら、君のクライアントはそのパケットをフォワードしない。 |