by shigemk2

当面は技術的なことしか書かない

BSDカーネルの設計と実装 読書会 (30) #readDaemon

12.5.2 経路選択

  • 経路を選択するアルゴリズム(集合を与えられたときにどこのルートを使うかをえらぶ)
  • radix検索トライ

基数木 - Wikipedia

f:id:shigemk2:20150125132923p:plain

129.168.2.0 0の場合はセグメントのネットワーク全体を表している。

探索によりループバックアドレスとIPアドレスが検索できる。

サブネットマスク=固定されていないところはなんでもいい

0はネットワーク全体、255はブロードキャストなので、1-254まで

拡張は192.168.0.0 まで 192.168.はローカル

この図はわりと重要で、BSDだけに限ったことではないことに留意する。

サブネットマスクは変えようと思ったら変えられる。

/16 /24 /28

個々の経路はradix木で管理しない。

rtentry構造体はFreeBSD5.2では活用し始めている

12.5.3 経路のリダイレクト

プロトコルがルーティングシステムに対して既存のルーティングテーブルエントリを修正したり、新しいルーティングテーブルエントリを作成することを要求する

古いホスト経路をじどうてきに削除しない

12.5.4 ルーティングテーブル管理インターフェイス

ルーティングテーブルを操作する関数

  • rtalloc()
  • rtredirect()
  • RTFREEマクロ

この図はなんだかよくわからない

f:id:shigemk2:20150125152203p:plain

12.5.5 ユーザレベルのルーティングポリシー管理

カーネルのルーティング機能は、意図的にポリシー上の判断を行うことを避けている

ユーザプロセスがルーティングポリシーを決める

  • routed
  • Quagga

ルーティングソフトウェア quagga の設定

QuaggaはZebraをForkしたやつ。

GNU Zebra - Wikipedia, the free encyclopedia

12.5.6 ユーザレベルのルーティングインターフェース: ルーティングソケット

カーネル内の経路を追加、削除、変更するためにカーネルのルーティングテーブルに対するインターフェースを必要とする

システムコール的なのがあるんじゃないのかっていうやつ。

f:id:shigemk2:20150125152931p:plain

ルーティングテーブル以外から変更が来ても監視しているから通知が来る。

通常はゲートウェイアドレスも必須。

インターフェースとはNICのこと。NICはLANのくち。普通は別のネットワークで運用する。

12.6 バッファ管理と輻輳制御

バッファ管理ポリシーがプロトコルの性能を左右する

ちゃんとしたポリシーがないと…

  • パケットの取りこぼし
  • プロトコルによる適切なウィンドウ情報の選択
  • メモリの断片化
  • ホスト全体の性能低下

メモリ領域を拡張することはできるが、拡張されたメモリについてはシステムに戻すことはできず、領域の再利用について検討されることはなかった

ネットワークのデータを処理するメモリ領域、データが増えるとメモリ領域が増えるが、データ量が通常に戻ってもメモリ領域はもとにもどらない

12.6.1 プロトコルのバッファ管理ポリシー

ソケットを作成するとき、プロトコルは送信および受信キューのために、一定量のバッファを確保する

通信するときにソケットを作る ファイルハンドリングを想定したらいい(ファイルディスクリプタ)

高水位線 閾値(いきち しきいち) データ処理を止めるかどうかを判断する閾値のこと

12.6.2 キューの制限

到着したパケットはメモリ割り当てに失敗しない限り受け付けられる

キューの長さを調整することは可能であるが、適切なデータ量を決める必要がある

(でも誰がどうやって調整するのかは知らないけど、防衛機構って書いてあるならそういうシステムが存在することは間違いないのであろう)

ただ、実際のコードは長大すぎるので探しづらい。。

12.7 RAWソケット

パケットにはヘッダがある

データだけではなくヘッダ、データ全部を見たい場合にRAWソケットを使う。

ICMPソケットを用いて実装されている。

Geekなぺーじ:簡単なpingの作成(ICMPの送受信)

12.7.1 制御ブロック

  • rawcb 管理ブロック

f:id:shigemk2:20150125160854p:plain

12.7.2 入力の処理

RAWソケットフィルタリングするraw_input

f:id:shigemk2:20150125161324p:plain

マッチしたものはいろいろなところにコピーされる。

12.7.3 出力の処理

raw_usendを使う。プロトコルファミリ固有の出力関数を実行する。

12.8 ネットワークシステムに関するその他の話題

12.8.1 帯域外データ

ストリームソケットとシークエンスパケットによってのみサポート

そもそも帯域外データってなんぞ

  • 別枠で送られるデータ
  • 緊急データ
  • 異常データ

SO_OOBINLINE OutOfBind

帯域外データが来たら1バイト削除する→次の緊急データを受け取るときに問題が発生する

12.8.2 アドレス解決プロトコル

アドレス解決プロトコル(ARP)はIPアドレスをMacアドレスに対応させる例のやつ

ネットワークアドレスがIPで、リンク層アドレスがMACアドレス

ARPの中にはいっていないやつはまずブロードキャストする

ローカルのEthernetに対する経路は包括経路

f:id:shigemk2:20150125165328p:plain

タイムアウトしない完全な変換

20秒間はないものとする。

ARPの返事待ち

arp

マシンごとでMACアドレスをくださいって送り合っている。

  • DNS FQDN⇔IP
  • ARP IP→MAC
  • RARP IP←MAC

直接経路 マシンごとにMACアドレスをARPでひもとく。

13 ネットワークプロトコル

ネットワークプロトコルの実装について考える

通信ドメインのサポート

  • IPv4
  • IPv6
  • XeroxNSプロトコル
  • ローカルドメインなど

4.2BSDのネットワークアーキテクチャ上で最初に実装されたプロトコル

4.3BSDでXeroxNSプロトコルが実装された

IPv4プロトコルの構成と実装に焦点をあてる。

しばらくIPv4について話

複数のプロトコルに対応しようとした話

13.1 IPv4 ネットワークプロトコル

TCP/IPは多くのプロトコルのひとつにすぎない

バイトが8ビットじゃないやつもある ので、厳密化するためのオクテット

ホップ 中継地点の一つ一つにジャンプすること (tracerouteで)