SDNとNFVについて
SDNとは?
ソフトウェアの制御によってネットワーク全体を作るという考え方。そのためにOpenFlowとという仕様が注目されている。
OpenFlowとは?
データ転送と経路制御の二つの機能を分けて行うアーキテクチャ。
その中にNFVという概念がある。
OpenFlowの書き換える時に何を書き換えるのかというと送信元のMACアドレスと宛先MACアドレスである。
NFVとは?
だいたいOpenFlowの概念と同じでデータ転送と経路制御の機能を分離して行う考え方。
Routing tableで次のルータに転送するときに複数の目的地にマッチしてしまった場合は最もプレフィックスが長い宛先に転送される。だいたい、プレフィックスの長さはIPアドレスの最後の数字を見れば長さがわかる。
ネットワークの回線について
同時に複数の通信を行う際に発信先と目的地を合わせて通信すること→交換方式という。
なぜ交換が必要なのか?
例えばそれぞれの通信元をすべて線でつないだ場合線の数が端末の数*(端末の数-1)/2で小数点は繰り下げとなり、膨大になる。→これをフルメッシュという。
フルメッシュでn台の端末からn+1に増やすときに増やす線はn本である。なぜなら新たに追加した端末はこれまでにある端末のすべてとつながなけらばならないから。
しかし間に交換機をつなげば線の数は端末と交換機をつなげばいいだけになるので端末の数だけで通信ができるようになる。
回線交換とは?
通信元と目的地の間に一つの経路を設定し独占して通信する方法。一つの線しか使えないから通信の要求がたくさん発生した場合、呼損が初声精してしまう。
パケット交換とは?
通信のデータをパケット化する。一つのルータをパケット化されたデータがそれぞれ分けられ通信元に向かっていく方法。たくさんのパケットが同時にルータにたどり着くこと(輻輳)があるとパケットの遅延やロスが発生してしまう。
ARPとは?
Address Resolution Protocolの略である。データをやり取りする際に目的地のインターネットアドレスに紐づけられたリンク層アドレスなどが検出できるプロトコル。
例えば目的地のIPあどれすがわかっていればそのMACアドレスを検出することができる。
ARPの手順
目的地のIPアドレスがわかっている場合は単純にそのIPアドレスのMACアドレスを見つけることができる。
例えば192.168.1.0/24のネットワークがあり、そのデフォルトゲートウェイは192.168.1.1としたとき発信地192.168.1.3が192.168.1.15と通信したときARPテーブルに記録されるIPアドレスは192.168.1.15である。なぜならこの場合は同じネットワーク内にあるときの通信だから。なぜ同じネットワーク内にあるかと分かったかというと168の後がおなじ1であるから。
次に192.168.2.10への通信を行ったとするとARPテーブルに記録されるIPアドレスは192.168.1.1になる。なぜなら違うネットワークへの通信だから発信地のデフォルトゲートウェイが記録されるから。なぜ違うかというと168の後が2と発信地と異なるから。
Routing
とどいたパケットが次のルータのどことマッチするかを当てはめてデータのやり取りをする方式。
例えば192.168.1.115のパケットがルータに届いたとしてそのルータが次のルータにデータを渡すときに参照する方法が、
最初に届いたアドレスを2進数に変換する。→今回は11000000 10101000 00000001 01110011になる。
次に見るところが次のルータのアドレスの最後の数字。これが26であれば左から26桁を使う。→11000000 10101000 00000001 01 110011
この残りを全部0すると→11000000 10101000 00000001 010000000になる。これを10進数に直すと192.168.1.64となる。これで次の渡す先とマッチさせる。
確証バイアスについて
確証バイアスとは?
とあるニュースで確証バイアスと言う言葉が使われていて気になったので調べてみました。
バイアス(bias)は傾き、先入観、偏見などの意味を持つ英単語です。確証バイアスとは、自分の都合の良い情報のみを集めて反対する情報にを向けないことを示します。
Paizaやってみた
gayaです。PaizaというITの転職サイトにあるプログラミング学習をしてみました。
Paizaとは
Paizaとは自分のプログラミングを直接企業に見てもらい、転職や就職をするサイトです。その中にAランクからDランクまでの問題があり、今回はDランクの問題をやりました。Dランクの問題は一通り解けると感じました。毎日コツコツ問題を解いていこうと思います。
C言語のマクロについて。
C言語にはマクロという機能がある。
#define マクロ名 置き換える値
と書くことで、今後プログラムにそのマクロ名が出現するとそれは置き換えた値として計算される機能である。
たとえば
#define pi 3.14
double area(double r)
{
return pi * r * r;
}
と書くと、return には3.14* r * rという動作になる。
これはpiという変数に3.14を代入しているように見えるがそうではないので注意が必要。
#define マクロ名(引数1, 引数2) 置き換える内容
とかけば関数のようなマクロを定義することができる。
たとえば
#define sum(a, b) a + b
int main()
{
int x = sum(3 + 8);
double y = sum(3.2 + 4.8);
}
などとするとその通りの計算結果が返ってくることになる。これはC言語の関数とは違い、型に関係なく計算を行ってくれる。
マクロの場合、置き換える内容が複数行にわたるときはdo{...}while(0)でまとめる。さらに、それぞれの行末に¥を書く必要がある。
C言語の文字列について
C言語は一つの文字に一つの数字が対応している。
また、整数はprintfの際に%dで表すが、文字は%cを使って表す。
文字列はchar型の変数に格納する。
例えば、char a = 'A'と書けばそれはAの数字も格納しているのと同じ意味になる。
printf("%a = &d , %c\n", a, a)と書くと、出力はa = 65, Aとなる。
文字列はchar型の配列によってあらわせる。それを定義する際、文字列の最後に\0をつける必要がある。これは日本語で表すところの。である。
文字列を表現するときに""で文字列を定義すれば\0を書くことを省略できる。
printfの際、文字列は%sだが、文字は%cである。ここは注意が必要。
文字列はポインタと互換がある。
そのため文字列に対して演算するとそれは基本的にポインタの演算になってしまう。
文字列を数値に変換するにはライブラリを使う。
例えば文字列"234"を整数に変換するにはint atoi("234")とすればよい。