動的に二次元配列を作成する

$ref_array1 = [apple, banana, cherry, donkey];
$ref_array2 = [monkey, dog, cat, fish, horse, sheep];

push(@a,$ref_array);
push(@a,$ref_array2);

このようにして、配列のリファレンスを変数に格納し、それを配列にpushしていくことはできる。

しかし、STDINとか、ファイルを読むとかして作る配列を、同じようにpushできない。

while(){
    chomp;
    @b=split / /, $_;
    push (@a,@b);
}


こういう風にすると、単に配列を追加するだけになる。そうではなくて、2次元配列にしたい。

dog cat horse
orange banana apple


と入力したら、

@a=([dog cat horse],[orange banana apple]);


という配列にしたいのである。

while(){
    chomp;
    @b=split / /, $_;
    $ref=\@b;
    push (@a,$ref);
}

for $i (0 .. $#a) {
    for $j (0 .. $#{$a[$i]}) {
        print '$a[' . $i . '][' . $j . ']=' . $a[$i][$j] . '   ';
    }
    print "\n";
}





固定文字列のときは、スカラー変数に[]で囲った配列を代入し、そのスカラー変数を配列にpushしたから、

$ref=\@b


として、それを同じように配列にpushしたらできるのかと思ったら、

a b c
d e f
^Z

$a[0][0]=d   $a[0][1]=e   $a[0][2]=f
$a[1][0]=d   $a[1][1]=e   $a[1][2]=f


という風になってしまう。2行目は望みどおりの結果なのだが、1行目も2行目と同じになってしまっている。


「スカラー変数」
「配列」
「リファレンス」
「[]で囲って,で区切ったた複数の文字列」
「()で囲って,で区切った複数の文字列」
「配列に\をつけたもの \@array」
「スカラー変数に\をつけたもの \$var」

これらの意味がよくわからず混同している。

[]で囲った文字列を「無名配列」と呼び、

$ref = ["apple", "orange", "banana"];

のようにした時、$ref に代入されるのは「無名配列へのリファレンス」だそうだ。

つまり、$ref には配列そのものの値が入っているのではなく、配列へのポインタが入っている。だから、さっきのスクリプトでSTDINが2行入力されたときに、1行目のポインタの内容が2行目で上書きされ、@aに入っているポインタが指す内容が同じになる、というわけか。

じゃあどうすればいいのか・・・。リファレンスについては、「続・はじめてのPerl」に書いてあるそうだ。買わなきゃだめか・・・。

while () {
    chomp();
    push(@a, [ split(" ") ]);
}

for $i (0 .. $#a) {
    for $j (0 .. $#{$a[$i]}) {
        print '$a[' . $i . '][' . $j . ']=' . $a[$i][$j] . '   ';
    }
    print "\n";
}

とりあえずこれで、やりたいことはできた。某所からの丸パクリであるが。

MeCab

MeCabというものを知った。あの、食べる「めかぶ」だ。日本語の形態素解析をするソフトである。Yahooのapiとか、「ちゃせん」とかいろいろあるようだが、これが新しくて速いようだ。

形態素解析という言葉は、何度か耳にしている。初めて聞いたのは、コールセンターなどに寄せられた問い合わせ内容を分析するソフトの説明を聞いたときだ。その後、いわゆる「人口無能」というもの、「意味不明だがなんとなく文章として成立している」というものを作るのに使われているということだった。

「言葉をコンピュータで解析する」とか、自動翻訳とかいうものについては、私はとても否定的に考えている。つまり、「そんなのはムリだ」という考えである。実際、形態素解析を使って一番おもしろいのは「無能」であり、自動翻訳はせいぜい、その文章に含まれる単語を辞書で引いて並べるくらいのことしかできていない。

私は語学は好きだが、外国語を読むというのはつまり辞書を引くことである。そして、辞書を引くというのはある単語をリストのなかから探すことでは、ない。それだけなら、コンピューターでできるだろう。

しかし、まったく未知の文章を辞書をひいて理解しようとした人にはわかるだろうが、辞書があっても引けないことがある。まずは動詞の活用。辞書に載っている動詞は原型だけである。そして動詞の活用の仕方は多様で、単純に規則化することもできない。それから同音意義語や、特別な言い回し、とにかく例外だらけなのである。

文法という、なまじ法則化されたようなものがあるから、人は言葉を科学的に扱おうとするが、結局言葉は科学の対象にはならない。極端なことを言うと、言葉というのは科学を拒否するものである。自動翻訳の精度もずいぶん向上したようだが、聞いた話ではとにかく大量の例文を持つそうである。そしてその中から同じ表現をさがしてくる、という方法がとられているようだ。

話がそれたが、perlでmecabを使ってみた。職場のWindows XPで、active perlで使ってみた。おもしろそうなので続きは家で、と思ったら、xpで使えたモジュールがvistaでインストールできなかった。vistaはよく俺を困らせる。

しかし、私はvistaを使うことをやめない。もうvistaもリリースされてずいぶんたつ。これだけたってvistaに移植されていないのには、理由があるのだ。だが、私にはさくらインターネットのレンタルサーバがある。さくらに最近mecabがインストールされたという情報を見て、sshで入って使えることを確認している。cygwinも、virtual pcもいらない。私はすでにfreebsd(だっけ)が動くサーバを持っているのだ。

さて、ではさくらでめかぶを。と、その前にcgiを動かすだけでひと騒動。まず、cgiを動かすディレクトリは決めてある。そしてパスワードを設定してある。パスワードが何か忘れている。なんとか思い出す。mecabを呼ぶperlが動くことをsshで確認する。しかしcgiにするとinternal server errorになる。いろいろ悩んだ末、permissionが777だと動かないことがわかる。755にしたら、動く。

#!/usr/bin/perl -w

use strict;
use Encode;
use MeCab 0.97;

open IN,"<jpsjis.txt";

print "Content-type: text/html\n";
print "\n";
print "<h3>mecab test</h3>\n";

while(<IN>){
    my $str = $_;

    my $t = new MeCab::Tagger("-Owakati");

    Encode::from_to($str, "Shift_JIS", "EUC-JP");
    $str = $t->parse($str);

    Encode::from_to($str, "EUC-JP", "Shift_JIS");
    print "<p>$str</p>\n";
}
close IN;


このソースは、shift_jisで保存してあり、読み込むファイル 「jpsjis.txt」もshift_jisである。そのため、エンコード処理が入っている。

私のcgiは全部UTF8にしており、これもUTF8にしてエンコードなどしたくなかったのだが、utf8だとどうしてもうまくいかない。mecabがeuc-jpなのだろうか?cgiをやるときはいつも日本語の文字コードで悩む。日本人のハンデである。

このスクリプトは日本語でかかれた文章を形態素で「分かち書き」するだけのものである。とりあえずmecabをcgiで動かすテスト用スクリプトである。

本当にやりたいことのひとつが、アクセスログの検索後から名詞を抜き出すことだ。webalizerの検索語一覧は、複数の検索文字列をそのまま表示するので、同じ名詞が含まれていても別の検索語としてカウントされる。

"delphi  ics ftp"
"delphi コンポーネント テキスト ルビ"
"delphi ハードコピー bitblt"


というようになる。この場合、"delphi"というキーワードを数えたいのである。私のサイトだと、"delphi", "tokai", "トーカイ", "whea-logger" などがこれで数えられて上位にランクされるはずだ。

次にやりたいのが、人口無能、あるいはbot、のようなもの。すでにtwitterにたくさんあるbotである。

これらは形態素解析するだけでなく、それを再構成する必要がある。このときに使われるのが「マルコフ連鎖」とかいうリクツである。マルコフなんたらがどういうことなのかはなんとなくわかるのだが、はっきりとはわからない。だが、少なくとも形態素で分解できてその品詞まで判定してもらえば、あとはなんとかなりそうだ。

#!/usr/bin/perl -w

use strict;
use Encode;
use MeCab 0.97;

open IN,"<jpsjis.txt" or die;

print "Content-type: text/html\n";
print "\n";
print "<h3>mecab test</h3>\n";


while(<IN>){
    my $m = new MeCab::Tagger ("");
    my $str2 = $_;

    Encode::from_to($str2, "Shift_JIS", "EUC-JP");

    for (my $n = $m->parseToNode ($str2); $n ; $n = $n->{next}) {
        if($n->{posid}==38){
            my $surf=$n->{surface};
            Encode::from_to($surf, "EUC-JP", "Shift_JIS");
            print $surf."<br>";
        }
    }
}

close IN;


これで名詞だけを抜き出せる。$n->{posid} というのが品詞IDで、これは自由に設定できるようだが、さくらでは38になっていた。区別さえできればよいので、そのまま、「38だったらと」いう条件で$n-{surface}を表示した。

そして文章のなかで名詞の出現回数をかぞえるには、名詞を保存していき、すでにあるかを検索して、

なかったら追加する、ということをすればよい。私がやろうとしている規模であればたいしたことはないが、大量に処理するならDBが必要かな。

今、「英単語はどうなるのかな」と思ってアクセスログを読ませてみたら、逆に英単語しか表示されない。そう、日本語はエンコードされているからデコードしないといけないのだ。メンドクサイ・・・。

ログから検索文字列を抜き出し、それをデコードする処理が必要だ。これは以前作ってある。

さっきeuc_jpでデコードするのがどうこう、と言っていた件は、めかぶの辞書がeuc_jpだからだそうだ。そして辞書をUTF8に変更できるようだ。あとでやろう。

さくらのログを表示させようとして、残っているのが前日の日付であることに気づいた。1日引けば・・・と思ったところで月初だったら、年初だったら・・・とそう単純ではないことに気づいたが、

調べると簡単にできた。

my $yesterday = DateTime->now->subtract( days => 1 );


とりあえずmecabがどんなものか試すスクリプト。htmlからpostしたテキストを形態素に分割して品詞等を表示する。

#!/usr/bin/perl -w

use strict;
use CGI;
use utf8;
use Encode;
use MeCab 0.97;


my $q= CGI->new;

my $value=$q->param('text');

print $q->header(-charset=>'utf-8'),
$q->start_html(-title=>'mecab'),
$q->p($value),
$q->br;


print "\n";
print "<hr>\n";

my $m = new MeCab::Tagger ("");
my $str2 = $value;

Encode::from_to($str2, "UTF8", "EUC-JP");

for (my $n = $m->parseToNode ($str2); $n ; $n = $n->{next}) {

    my $surf=$n->{surface};
    Encode::from_to($surf, "EUC-JP", "UTF8");
    print '<font size="5">'.$surf.' </font>';

    my $feature=$n->{feature};
    Encode::from_to($feature, "EUC-JP", "UTF8");

    print '<font size="2">'.$feature.' </font>';

    print '<font size="1">'.$n->{posid}.' </font>';

    if($n->{posid}==4){
        print "<br><br>";
    }
    if($n->{posid}==9){
        print "<br>";
    }
}

print $q->end_html;

exit;





cgiを呼び出すhtml。cgiもこのhtmlファイルも、文字コードはutf-8で保存する。

<html lang="ja" xml:lang="ja" xmlns="hxtp://www.w3.org/1999/xhtml">
<head>
<meta hxtp-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>just post</title>
</head>
<body>
<form action="meca6.cgi" target=_self method=post>
<textarea name="text" rows="20" class=input cols="100"></textarea><br>
<input type=submit value="post">
</form>
</body></html>


とりあえず名詞の抽出をする。頻出単語を数えるなどをしてみるが、一般名詞と固有名詞の区別も簡単ではない。たとえば「中国国家発展改革委員会」という言葉は

中国[47]国家[38]発展[36]改革[36]委員[38]会[51]

という風に分離される。カッコ内の数字は品詞の種類を表す数値である。こういうものはくっつけたいが、なんでもくっつけるわけにもいかない。とりあえず、いろんな文章を形態素分離させてみて、どういうパターンがあるかを見て、38->36はくっつける、などとひとつひとつ決めていくしかないか。

「人口無能」であれば、その辺はテキトーにやって、頻度や乱数をつかって文章を切り貼りしていけばいい。だが、まったくの「無能」ではやっぱり面白くない。「圧縮新聞」はそれを新聞でやることによって、ある程度のもっともらしさを保っている。ツイッターのツイートやブログなどでは、文体が多様すぎて混沌としすぎる。

BSCI合格

受かった・・・。844点・・・。危なかった・・・。「簡単じゃん」と思ったが、どうやらシミュレーションを間違えたようだ。シミュレーションはあまり時間をかけられないと思いろくに確認せずに終わった。確認コマンドで何を入力したかも採点されるのか?それはないか・・・。時間は10分くらいあまったかな。最後に「次へ」を押してかなり待った。3分くらい?もっと?待ちながら、『だいじょぶだいじょぶ、受かったって、絶対ダイジョブ、900点くらい取れてるって』と心の中でつぶやいていた・・・。達成感よりも安堵感、そして得点がイマイチだったことにちょっとがっかりした。

今回はガイドも買わず、クラムメディア問題集もやらず、買ったのは黒本のみ。マルチキャストの本も買ったがほとんど読まず。実機は2610を3台、合計で1万円くらいを買って、dynamipsも使った。これなしには絶対に受からなかっただろう。2610のみでも、dynamipsのみでもダメだったと思う。勉強期間は、3ヶ月弱。けっこう時間はかけた。効率はあまりよくなかったかもしれないが。おかげで問題を読んで意味がわからないものはほとんどなかった。いつもは数問は何を言っているのかすらわからないものがあるものだが。


ciscoのCLIは、何の変哲もないようで、非常に工夫されていて使いやすい。
今仕事で使っているルータとは雲泥の差だ。というのが一番感じたことだ。

だが、各プロトコルによる実装の違い、サマリーの仕方とか、パラメータの変更の仕方とか、show コマンドの名前の付け方とか、もうちょっと統一した一貫性のあるものにできないのかな、と思った。
おそらくプロトコルごとに開発者が違うのだろう・・・。

さて次だが、3月までにTSHOOTか、ISCWとONTのどちらかをとらねばならない。
TSHOOTは英語本を買ってあるのだが、パラパラと見るとcatalystとかwirelessとかQoSとかRIPngとか、いろいろあって大変そうだ。まあ、科目数が減ったわけだから試験範囲は広いのだろう・・・。英語でTSHOOTをとる気で、それも年内に、いたが、まず無理だろうな・・・。でも、それを目指すくらいで勉強してちょうどいいくらいだろう。

BSCIの準備 BGPいろいろ

show ip bgp route というコマンドはない。 weightと、local preferenceと、MED、この3つの意味がさっぱりわからない。 WEBからの引用を貼る。

local preference
LOCAL_PREF属性は,IBGP専用の属性で,AS内のBGPスピーカーに,経路情報の優先度を知らせる用途で使います。 「低速回線のピアよりも高速回線のピアを使いたい」などという場合に使います。 IBGPで同じあて先の経路情報を複数取得したとき,LOCAL_PREF値の大きい方をベストパスとして採用します。 設定できる値は0~4294967295で,何も設定しなければデフォルトで100が設定されます。
内部ASのネイバールータに対して、外部ASへの優先パスを示す属性です。Local Preferenceはルータ自身に設定される値であり、Local Preference値はデフォルトで「 100 」です。この値は高い値を持つパスが優先され使用されます。Local Preference値は、同一のAS内のルータ間でのみ交換され、発信トラフィックに影響します。
Local Preference属性は、発信トラフィックに影響を与える属性。内部ASのネイバールータに対して、外部ASへの優先パスを示す。ルータ自身に設定する。デフォルト値は「100」。高い値を持つパスが優先される。
Local Preference値は、同一のAS内のルータ間でのみ交換され、発信トラフィックに影響する。
自AS内部において、他ASに行くときに、どの対外ルータを経由すべきか指定。 AS_PATHの長さよりもLOCAL_PREFの値が優先される。 上りのトラフィック制御に適用。
ローカル プリファレンスは AS に対する指標で、その AS から特定のネットワークに到達する際にどのパスが優先されるかを示します。ローカル プリファレンス値の高いパスが優先されます。ローカル プリファレンスのデフォルト値は 100 です。
ローカル ルータにだけ関連するウェイト アトリビュートとは異なり、ローカル プリファレンスは、同じ AS 内のルータ間で交換されるアトリビュートです。
MED
着信トラフィックに影響を与える属性
  • 外部ASのネイバールータに対して、自身のAS内への優先パスを示す。
  • 外部ASから自身のASへ、どのパスを優先させるのかを指示する唯一の属性
  • デフォルト値は、「0」
  • 低い値を持つパスが優先される。
  • MED属性を加えた経路情報が伝わるのはは隣接するASまでで、その次のASには伝わらない。

外部ASのネイバールータに対して、自身のAS内への優先パスを示す属性です。MEDはAS内部にどのようにしてトラフィックを流し込むのかを制御できる唯一の属性です。MED値はデフォルトで「 0 」です。MED値は低い値を持つパスが優先され使用されます。MED値はAS間で交換され、その渡されたAS内では搬送されそのAS内で使用されますが次のASに送信される事はありません。MEDは着信トラフィックに影響を与えます。
MED はオプションの非推移的なアトリビュートです。 MED は、複数のエントリ ポイントがある Autonomous System(AS; 自律システム)への優先パスに関して、外部隣接ルータへの手掛りとなります。 MED は、ルートの外部メトリックとしても認識されています。 大きな MED 値よりも、小さい MED 値の方が優先されます。
weight
ウェイト アトリビュートは、Cisco で定義されたアトリビュートです。このアトリビュートは、ウェイトを使用して最適なパスを選択します。ウェイトは、ルータにローカルに割り当てられます。この値が意味を持つのは、特定のルータだけです。この値は、別のルータに伝搬されたり、ルート アップデートによって伝達されたりはしません。ウェイトは 0 ~ 65,535 の数値を取ることができます。このルータが発信元のパスのウェイトはデフォルトで 32,768 に設定されており、他のパスのウェイトは 0 に設定されています。
WEIGHT属性はCisco独自の属性で、対象のルータでのみ使用される属性であり他のルータに伝達されることはありません。そのルータ自身が接続しているルートにはデフォルトで"32768"の値が割り当てられ、それ以外のルートの値は"0"になります。(WEIGHT値は0~65535で割り当てられる。)WEIGHT属性が大きいパスが優先されます。
メトリック
メトリック アトリビュートは、MULTI_EXIT_DISCRIMINATOR、MED(BGP4)、または INTER_AS(BGP3)とも呼ばれます。このアトリビュートは、AS への優先パスに関する外部隣接ルータへのヒントです。このアトリビュートは、AS への入口ポイントが複数ある場合に、特定のルートに到達するように、別の AS に対して動的に影響を与える方法を提供します。メトリックの値の小さい方が優先されます。
ローカル プリファレンスとは異なり、メトリックは AS 間で交換されます。別の AS に伝達されたメトリックは、その AS からさらに別の AS へ伝達されることはありません。特定のメトリックを持つアップデートが AS に到達すると、AS 内部ではメトリックを使用してルートが決定されます。同じアップデートが第 3 の AS に送信される場合、メトリックは 0 に戻ります。このセクションの図は、メトリックの設定を示しています。メトリックのデフォルト値は 0 です。
multi exit だから、出て行くトラフィックの区別かと思ったら逆で、入ってくるトラフィックを制御するとか・・・ でも、そもそも経路の比較に使うんだから、着信も発信もないと思うんだけどな・・・ ルーティングってのは全部出て行くトラフィックのためにあるんじゃないのか・・・?

BSCIの準備 bgp peer group

BGPのピアグループを設定してみる。

R1(config-router)#neighbor 10.1.1.2 ?
  activate                 Enable the Address Family for this Neighbor
  advertise-map            specify route-map for conditional advertisement
  advertisement-interval   Minimum interval between sending BGP routing updates
  allowas-in               Accept as-path with my AS present in it
  capability               Advertise capability to the peer
  default-originate        Originate default route to this neighbor
  description              Neighbor specific description
  disable-connected-check  One-hop away EBGP peer using loopback address
  distribute-list          Filter updates to/from this neighbor
  dmzlink-bw               Propagate the DMZ link bandwidth
  ebgp-multihop            Allow EBGP neighbors not on directly connected
                           networks
  fall-over                session fall on peer route lost
  filter-list              Establish BGP filters
  inherit                  Inherit a template
  local-as                 Specify a local-as number
  maximum-prefix           Maximum number of prefixes accepted from this peer
  next-hop-self            Disable the next hop calculation for this neighbor
  next-hop-unchanged       Propagate the iBGP paths's next hop unchanged for
                           this neighbor
  password                 Set a password
  peer-group               Member of the peer-group
  prefix-list              Filter updates to/from this neighbor
  remote-as                Specify a BGP neighbor
  remove-private-as        Remove private AS number from outbound updates
  route-map                Apply route map to neighbor
  route-reflector-client   Configure a neighbor as Route Reflector client
  send-community           Send Community attribute to this neighbor
  shutdown                 Administratively shut down this neighbor
  soft-reconfiguration     Per neighbor soft reconfiguration
  timers                   BGP per neighbor timers
  translate-update         Translate Update to MBGP format
  transport                Transport options
  ttl-security             BGP ttl security check
  unsuppress-map           Route-map to selectively unsuppress suppressed
                           routes
  update-source            Source of routing updates
  version                  Set the BGP version to match a neighbor
  weight                   Set default weight for routes from this neighbor

R1(config-router)#neighbor 10.1.1.2 peer-group ?
  WORD  peer-group name

R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
% Configure the peer-group first


まずpeer-groupを作りなさい、と言われる。
どこで作るのか?さがしたがわからない。
bgpでしか使わないから config-routerモードだと思うのだが・・・
調べてようやくわかった。

R1(config-router)#neighbor ?
  A.B.C.D     Neighbor address
  WORD        Neighbor tag
  X:X:X:X::X  Neighbor IPv6 address

R1(config-router)#neighbor GROUP1 ?
  activate                 Enable the Address Family for this Neighbor
  advertise-map            specify route-map for conditional advertisement
  advertisement-interval   Minimum interval between sending BGP routing updates
  allowas-in               Accept as-path with my AS present in it
  capability               Advertise capability to the peer
  default-originate        Originate default route to this neighbor
  description              Neighbor specific description
  disable-connected-check  One-hop away EBGP peer using loopback address
  distribute-list          Filter updates to/from this neighbor
  dmzlink-bw               Propagate the DMZ link bandwidth
  ebgp-multihop            Allow EBGP neighbors not on directly connected
                           networks
  fall-over                session fall on peer route lost
  filter-list              Establish BGP filters
  inherit                  Inherit a template
  local-as                 Specify a local-as number
  maximum-prefix           Maximum number of prefixes accepted from this peer
  next-hop-self            Disable the next hop calculation for this neighbor
  next-hop-unchanged       Propagate the iBGP paths's next hop unchanged for
                           this neighbor
  password                 Set a password
  peer-group               Configure peer-group
  prefix-list              Filter updates to/from this neighbor
  remote-as                Specify a BGP neighbor
  remove-private-as        Remove private AS number from outbound updates
  route-map                Apply route map to neighbor
  route-reflector-client   Configure a neighbor as Route Reflector client
  send-community           Send Community attribute to this neighbor
  shutdown                 Administratively shut down this neighbor
  soft-reconfiguration     Per neighbor soft reconfiguration
  timers                   BGP per neighbor timers
  translate-update         Translate Update to MBGP format
  transport                Transport options
  ttl-security             BGP ttl security check
  unsuppress-map           Route-map to selectively unsuppress suppressed
                           routes
  update-source            Source of routing updates
  version                  Set the BGP version to match a neighbor
  weight                   Set default weight for routes from this neighbor

R1(config-router)#neighbor GROUP1 peer-group ?
  nlri  Specify nlri type supported by peer-group
  <cr>

R1(config-router)#neighbor GROUP1 peer-group
R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
% Specify remote-as or peer-group remote AS first


remote-asを先に設定する。

R1(config-router)#neighbor 10.1.1.2 remote-as 65000

R1(config-router)#neighbor 10.1.1.2 peer-group GROUP1
R1(config-router)#end
R1#sho run

!
router bgp 65000
 no synchronization
 bgp log-neighbor-changes
 neighbor GROUP1 peer-group
 neighbor 10.1.1.2 remote-as 65000
 neighbor 10.1.1.2 peer-group GROUP1
 no auto-summary
!
!


やれやれ・・・

BSCIの準備 route map

route-mapの適用場所は二つある。

ひとつは、redistribute コマンドのオプションとして。わたしはこれしかやったことがない。

もうひとつは、IFで ip policy routemap MAPNAME として。

distribute-listは、IFには適用しない。 router-configモードで設定する。

route-mapを ip policy routemap で指定すると、受信したパケットについて処理をおこなう。 出力IFに設定するのではない。

R1#sho ip policy

Interface      Route map
Serial1/0      MAP1

BSCIの準備 フレームリレー

フレームリレーの実機(dynamipsだけど)演習をやるかな・・・。
CCNAのときからずっと逃げ続けてきたフレームリレー・・・。

dynamipsのサンプルラボにフレームリレーもある。 image名だけ書き換えて起動してみるがrouterにtelnetできない。

.netファイルを見てみると autostart がどうのこうのというのがある。こんな設定があるのかとコメントにすると起動する。

たいした設定はない。フレームリレースイッチがあり、3台のルータのs1/0がつないであるだけだ。 

とりあえず3台のs1/0に同じサブネットのアドレスを振ってno shutする。

が、通信できない。

pingを打ったらifがdownしてしまった。

encapusulationとかdlciとかあるんだっけ、ととりあえず

encapsulation frame-relay


だけ設定するとpingはできた。

では ospfをやってみる。
etherのときと同じようにnetworkコマンドを設定するが、neighborが出てこない。

sho ip os intをやると

R2#sho ip os interface
Serial1/0 is up, line protocol is up
  Internet Address 10.10.10.3/24, Area 0
  Process ID 100, Router ID 10.10.10.3, Network Type NON_BROADCAST, Cost: 64
  Transmit Delay is 1 sec, State WAITING, Priority 1
  No designated router on this network
  No backup designated router on this network
  Timer intervals configured, Hello 30, Dead 120, Wait 120, Retransmit 5
    oob-resync timeout 120
    Hello due in 00:00:24
    Wait time before Designated router selection 00:01:24
  Supports Link-local Signaling (LLS)
  Index 1/1, flood queue length 0
  Next 0x0(0)/0x0(0)
  Last flood scan length is 0, maximum is 0
  Last flood scan time is 0 msec, maximum is 0 msec
  Neighbor Count is 0, Adjacent neighbor count is 0
  Suppress hello for 0 neighbor(s)
R2#

NON_BRODCAST ...。これが、NON_BROADCASTか・・・。

nighborを明示的に指定すればいいのかな?と、一台で設定する。
では対向も・・・と設定しようとしたら

*Oct  1 14:56:20.579: %OSPF-5-ADJCHG: Process 100, Nbr 10.10.10.3 on Serial1/0 from LOADING to FULL, Loading Done

が。

R1#sho ip os neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
10.10.10.3        1   FULL/DR         00:01:50    10.10.10.3      Serial1/0
R1#

DRが検出されている。


R1#debug ip os eve
OSPF events debugging is on

R1#
*Oct  1 14:59:20.351: OSPF: Rcv hello from 10.10.10.3 area 0 from Serial1/0 10.10.10.3
*Oct  1 14:59:20.355: OSPF: End of hello processing
*Oct  1 14:59:31.979: OSPF: Send hello to 10.10.10.3 area 0 on Serial1/0 from 10.10.10.1
*Oct  1 14:59:50.351: OSPF: Rcv hello from 10.10.10.3 area 0 from Serial1/0 10.10.10.3
*Oct  1 14:59:50.355: OSPF: End of hello processing
*Oct  1 15:00:01.983: OSPF: Send hello to 10.10.10.3 area 0 on Serial1/0 from 10.10.10.1
R1#

debug してみると、helloの間隔が30秒になっている・・・。
これがNBMAか・・・。

もうひとつ方法がある。neighborを指定せずに、network typeをbroadcastに変えるのである。 これは両方変える必要がある。

あーこういうことか。

「ブロードキャストネットワークであるか」かどうかで、neighborを自動検出するかが決まる。 
「マルチアクセスネットワークであるか」どうかで、DRが選出されるかどうかが決まる。

 NBMAはその名の通り、「ブロードキャストではないが、マルチアクセス」なので、neighborを指定する必要があり、DRは選出される。 

ただし、今回NON_BROADCASTになったが、networkタイプを BROADCAST に変更することができ、そうするとethernetと同じようにneighborを自動検出し、DRも選出された。

 「ブロードキャストかどうか」は、名前でわかる。 「NBMA」と「ポイントツーマルチポイントノンブロードキャスト」の二つだ。 このモードでは、ネイバー設定が必要になる。

マルチアクセスかどうかは、「ポイント」があるかどうかで決まる。「ポイントツーポイント」は一対一だから、マルチアクセスでないのはわかる。「ポイントツーマルチポイント」は、複数の接続があっても、単位はP-to-Pであり、P-to-Pの集合なので、「マルチアクセス」ではない。

 
R1#sho running-config
 !
 hostname R1
 !
 interface FastEthernet0/0
  ip address 192.168.1.1 255.255.255.0
  duplex half
  speed auto
 !
 interface Serial1/0
  no ip address
  encapsulation frame-relay
  ip ospf network broadcast
  serial restart-delay 0
 !
 interface Serial1/0.1 multipoint
  ip address 10.10.10.1 255.255.255.0
  frame-relay map ip 10.10.10.5 102 broadcast
  frame-relay map ip 10.10.10.6 103 broadcast
 !
 router ospf 100
  log-adjacency-changes
  network 10.10.10.0 0.0.0.255 area 0
  network 192.168.1.0 0.0.0.255 area 0
  neighbor 10.10.10.6
  neighbor 10.10.10.5
 !
 end
 

 
 R2#sho running-config
 !
 hostname R2
 !
 !
 interface FastEthernet0/0
  ip address 192.168.2.1 255.255.255.0
  duplex half
  speed auto
 !
 interface Serial1/0
  no ip address
  encapsulation frame-relay
  ip ospf network broadcast
  serial restart-delay 0
 !
 interface Serial1/0.1 multipoint
  ip address 10.10.10.5 255.255.255.0
  frame-relay map ip 10.10.10.1 201 broadcast
  frame-relay map ip 10.10.10.6 203 broadcast
 !
 router ospf 100
  log-adjacency-changes
  network 10.10.10.0 0.0.0.255 area 0
  network 192.168.2.0 0.0.0.255 area 0
 !
 !
 end


 
 R3#sho running-config
 !
 hostname R3
 !
 interface FastEthernet0/0
  ip address 192.168.3.1 255.255.255.0
  duplex half
  speed auto
 !
 interface Serial1/0
  no ip address
  encapsulation frame-relay
  ip ospf network broadcast
  serial restart-delay 0
 !
 interface Serial1/0.1 multipoint
  ip address 10.10.10.6 255.255.255.0
  frame-relay map ip 10.10.10.1 301 broadcast
  frame-relay map ip 10.10.10.5 302 broadcast
 !
 router ospf 100
  log-adjacency-changes
  network 10.10.10.0 0.0.0.255 area 0
  network 192.168.3.0 0.0.0.255 area 0
 !
 !
 end

R1#sho ip os neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.3.1       1   FULL/DR         00:01:40    10.10.10.6      Serial1/0.1
192.168.2.1       1   FULL/DROTHER    00:01:53    10.10.10.5      Serial1/0.1

R1#sho ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     10.0.0.0/24 is subnetted, 1 subnets
C       10.10.10.0 is directly connected, Serial1/0.1
C    192.168.1.0/24 is directly connected, FastEthernet0/0
O    192.168.2.0/24 [110/65] via 10.10.10.5, 00:07:57, Serial1/0.1
O    192.168.3.0/24 [110/65] via 10.10.10.6, 00:07:57, Serial1/0.1
R1#

びっくりしたのは、ATTEMPT という neighbor Stateが登場したこと。
10秒くらいかな、しばらくこのStateになっていた。



R1#sho ip os neighbor

Neighbor ID     Pri   State           Dead Time   Address         Interface
N/A               0   ATTEMPT/DROTHER 00:01:37    10.10.10.5      Serial1/0.1
R1#