Monthly Archives: 6月 2008

ゼミ中 〜UDP

UDPの章。

なめてかかって読んでたらエラい目にあった。

まずIPのフラグメントの説明がここにあったこと。フラグメントはややこしい。かつ、8バイト単位で長さを指定する。それはMore Fragmentなどのフラグのため。パスMTUの話もここに入っている。

上り回線と下り回線のMTUが違う環境を例に示していて、死にそうになった。MTUに関しては、データリンク層で制限を課しているから、データリンクの限界値をネットワーク層IPに伝えているのだ、という認識だった。なぜならMTUはインターフェースごとに設定していくからだ。

上下回線でMTUの値に違いが出る環境がありえるかもしれないという発想に至れなかった。

あの本は、何度読んでも発見がある。

MTUに関しては、BフレッツのMTUサイズ(1492ではなく1454の理由)という話もある。

この場合、ルータでフラグメントをするか、ホスト側でパスMTUディスカバリをする必要がある。ルータでフラグメントをした場合、ルータの処理能力によっては通信能力が大幅ダウンしてしまうので、ホスト側でパスMTUディスカバリをした方がベターだ。

そこでWindowsではパスMTUディスカバリをしているのかどうか調べてみた。

「パスMTUディスカバリ・ブラックホール問題」とは:ITpro
Windows2000はパスMTUディスカバリを実装しているようだが、それが原因でメールが見れなくなったりするようだ。

しかもMTUサイズ1454の”フレッツ網”で。

なかなか奥が深い。

追記:
リビング+:「ルータのブラックホール現象」を解決する (1/2)

なーんとなく、Windows側のパスMTUディスカバリ実装のミスだろうなーっと。DFフラグ立てて届かないならRFCに従ってMTUサイズを小さくしていくべきだが、Windows 2000はそうしなかったようだ。

追記その2:
いや、違う。フラグメント値が正しくないというICMPエラーが届かないとフラグメント値は変更しないのが正しいのか。DFフラグを立てたデータグラムはフレッツ網のルータに拒否される。その拒否したルータがICMPエラーを発信元に返すが、FWが弾く。エラーが届かなければ、ホスト側は単にデータグラムが消失した(破棄された)と思う。だから、DFビットを外さなかった、というのが答えか。

んでも、破棄された場合でも2度くらい連続したらDFビットを外して送信した方がいい・・・はず。暇だったら現在の実装はどうなっているか実験してみよう。

ゼミ中 〜ダイナミックルーティングプロトコル

RIP中心にOSPF、IGP、EGPについて。

ルータ同士がどのようにお互いを発見して、お互いの情報を交換し合うのか、を延々と説明する章。その目的はルーティングテーブルを最適な状態に保つこと。この様々な手法をルーティングアルゴリズムと呼ぶ。

ルーティングアルゴリズムの評価の1つは、収束時間である。故障や追加などによってトポロジが変更された場合、全体のルーティングテーブルが安定化するまでの時間を収束時間とする。収束時間が長ければ、その間にループなど障害を起こす要因が発生してしまう。だから、早く収束した方が良い。しかし早く収束させようとすると、それだけ冗長なメッセージを出さなければならない。

ディスタンスベクターとリンクステート。RIPとOSPF。RIPはメトリック(ホップカウント)しか見ないけれど、OSPFはスループット、遅延時間で判断することができる。

OSPFではロードバランスがあり、2つの経路のコストが同じであるのなら、並列にパケットを配送する。だから、行きと帰りで経路が違うことがある。別の経路で到達することになるので、パケットの順序が変わることがある。

ここまでを大体話した。ここまでが理解できれば、アドホック・ルーティング・プロトコルが、RIPやOSPFで十分ではない何を補完したものであるか、見えてくるはず。アドホック・ルーティングも、基本的にはIPルーティングをしているに過ぎない。個々がルータとして働き、生存確認をし、経路表をやり取りするのも変わりない。それなら、なぜ、RIPなどのIGPとは別に定義する必要があったのか。そういう話が出来れば面白いかもしれない。

さらにEGPとして、BGPの話。自律システム(AS)があって、それらが繋がっているんだという話。ASの中身の情報はお互いにバラしたくないという話。表面上見えるものだけでルーティングする。

CIDRは意味分からんがIPv4アドレスの枯渇があるから、クラスCアドレスを使うけど、ルーティングテーブルにクラスCをいちいち書くのが面倒だから、まとめてみたよという話。

お次のお題はUDP。UDPはシンプルで必要最低限のプロトコルで、TCPに対抗心を燃やしていた頃にこれで対抗しようとしていた愛着のあるプロトコル。必要最低限なのでポート番号くらいしか仕事がない。そのポート番号が大事。

ゼミ中 〜IPルーティング

ルーティングテーブルの見方と処理の方法について勉強。

デフォルトゲートウェイは最後に見る。みなさんの家にルータがあると思うけれど、インターネットにアクセスする場合はデフォルトゲートウェイを使ってルータにたどり着いている、ということが分かってもらえたと思う。さらに自宅のルータはインターネットの構成など知らず、インターネット上の基幹ルータに到達して初めてネットワーク構成を知る。ネットワーク構成を知るからこそデフォルトデートウェイが設定されておらず、ICMP到達エラー(アンリーチャブル)を出すことができる。

フラグとしては、U(利用可能)、H(ホスト/ネットワーク)、G(ゲートウェイ、間接/直接)がある。これはnetstat -rnで見ることができる。

フォワーディング可能かどうかは、ルータのカーネルの設定で選べる。よってフォワーディングすること自体はIPにとってMUSTではない。ルーティングテーブルを見ることは最低限してね、と。

あとはICMPリダイレクト。パケットを”出した相手”が出す相手が違うと分かれば、ICMPリダイレクトによって本来出すべき相手に出せるようにルーティングテーブルの変更を促す。一見して攻撃しやすい。この理由から、ホストは自分がデータグラムを出した相手から受信したICMPリダイレクトしか利用しない。ICMPリダイレクトではホスト単位しか指定せず、ネットワーク単位ではリダイレクトはしない。相手のネットワーク構成をそのルータが知らないから、とした。

ネットワーク単位ではリダイレクトするべきではない、という明確な答えは出てこなかった。勉強不足だ。

IPルーティングで重要なことは、IPルーティングは分散なアーキテクチャで部分部分のネットワークを知っておればよく全体のネットワークを知る必要はない、ということ。

IPルーティングとダイナミックルーティングプロトコルとの関係は?との質問が出たが、ダイナミックルーティングプロトコルはルーティングテーブルを自動で交換を行い、その情報を元にIPルーティングの静的な設定方法で設定しているに過ぎない・・・という説明をした。

来週はダイナミック・ルーティング・プロトコルについて。TCPはまだか。

ゼミ中 〜ICMP

自分がこんなことを教えて良いのだろうか・・・と思いつつICMPの説明について。

ポイントなのは、自分でデータグラムを出して自分で問題が分かった場合は自分で理解する、他者からデータグラムをもらって問題が分かった場合はICMPで問題を伝える。IPで来たデータグラムの問題はIPで伝えなければならない。だからIPヘッダがICMPについている。

さらにICMPはユーザプロセスではなくカーネルプロセスで動作する。よって通常であればユーザが意識せずともICMPエラーが返る。

ICMPエラーに対してはICMPエラーで応答しない。ループになっちゃうから。

ゼミ中 〜ARP

ARPとRARP…、IPアドレスからMACアドレスを引く、MACアドレスからIPアドレスを引く、という目的を達するために利用される。

ARPではARPキャッシュと呼ばれるキャッシュ機構に触れる。時間切れになると、再度ARPで聞きに行く。

なぜ、静的(スタティック)にARPテーブルを構築してはいけないのか?
なぜ、キャッシュを用意するのだろうか?
なぜ、時間切れを用意するのだろうか?

実際にwiresharkにてARPをキャプチャした結果を見せて、形式について理解を求めた。このキャプチャ結果では、ARPリクエストの宛先MACアドレスがブロードキャスト(FF:FF:FF:FF:FF:FF)になっておらず、あらかじめ分かっている一台に聞きにいっていた。面白い現象だ。

あわせてさくらインターネットにてARP spoofingが発生した事例に触れた。ARPテーブルを静的に構築しても良いが、業者がルータを交換してしまうとMACアドレスが変更されてしまい、サーバ側のARPテーブルも変更しなければならないことが分かってもらえたと思う。さらにSSHにて管理しているサーバの場合、ARPテーブルの不整合によってネットワークがつながらない状態になってしまい、管理すらできなくなってしまうだろう(シリアルコンソールなら良いが…)。

ARP Proxyについては上手い説明ができなかった。勉強不足だ。

Gratuitous ARPについては2つの機能があることを勉強した。IPアドレスの重複確認、キャッシュの更新。

ゼミ中 〜ネットワーク層

リンク層とネットワーク層の形式を上手く説明するためにどうすればよいか考えて、Wireshark(Ethereal)のプロトコル解析結果とネットワークバイト列のスクリーンキャプチャの印刷したものを配布してゼミを行った。

結果として、ネットワーク層の宛て先アドレスは変更されず、リンク層の宛先アドレスはよく変わるという点がそのプリントを用いたことで分かりやすかったと思う。Webサーバにアクセスした場合のキャプチャを例に示したが、リンク層宛て先アドレスはCiscoであり、IP的にはWebサーバ(正確にはプロキシ)を宛先としているが、途中でルータを経由しているのでリンク層では宛先をルータにしている、という説明がしやすかった。

またデータグラムの形式と実際の値を参照しつつ話を進めていくと、IPのヘッダ長は標準で20バイトなのに、5という数字が入っている、なんで?的な疑問も生まれた。IPデータグラムにおける長さは32ビット単位なので、5×4バイトで標準の20バイトになるわけだ。

そんなこんなでIPの3章は終わった。次はARPについてだ。

ゼミ中 〜リンク層

詳解 TCP/IP vol.1を使って、イントロダクションとリンク層について本読みをした。

この本はIPやTCPについては詳しいのだが、リンク層については詳しくない。TCP/IPを理解する上で最低限のことしかリンク層のことを書いていない。TCP/IPの本なので当然だが…

EthernetフレームとPPPプロトコルがどのような形式か、しか教えていない。これだけではリンク層が良く分からないと思うので、補足をしようと考えた。

リンク層の話では、ダムハブを用いた半2重回線の時代、スイッチングハブを用いた全2重回線の時代、そして、無線LANでは半2重の世界が広がっているということを理解したい。

半2重回線の時代では、自分の声が聞こえる範囲があり、相手と自分でどのように折衝して衝突しないように注意をしていたか、という話がメインになる。全2重回線の時代では、そのような問題から開放されたこと、FDBの仕組みがメインになる。無線LANでは、半2重回線と同じ問題を抱えており、そのためにフレームを出す行為そのもののオーバーヘッドが大きいということ、またインフラストラクチャーモードやアドホックモードがどのような仕組みになるのかメインになる。

と、考えていったら、やはり、リンク層はスルーして早いところTCP/IPにたどり着いて、必要ならリンク層に戻る程度の方が話が分かりやすいな、と、考えを改めた。深い話、細かい話は全体の概要が見えてから掘り下げていくほうが理解しやすそうだからだ。

とりあえず今は漠然と分かるように努力しよう。次はIP(ネットワーク層、第3章)についてだ。