Open2

基礎からわかるTCP/IPネットワーク実験プログラミング第2版の雑なmemo

koheiyamayamakoheiyamayama

目的

  • これの雑な書評というか、作業ログというか、理解を書きなぐるというか、なんというか。
koheiyamayamakoheiyamayama

2章 TCP/IPプロトコルとヘッダの構造

書きなぐり

プロトコルはパケットの構造(=ヘッダーフォーマット)と動作の定義から構成される。

EthernetではMACアドレスがEthernetフレームを送受信するときの終点や始点のアドレスとして使われる。
Ethernetはブロードキャストでパケットを同一Ethernet上のホストに送信し、宛先のMACアドレスと自分のMACアドレスを比較して同じ場合、パケットを受け取る。
複数のホストが同じ信号線を使って同時にパケットを流すとパケットが壊れてしまう。なので、EthernetではSCMA/CDと呼ばれる仕組みで同時にパケットを流さない仕組みがある。

ARPは一般的にIPアドレスからMACアドレスを調べるためのプロトコル。

IPは目的のホストまでパケットを届ける役割がある。
ルーターとホストの違いはパケットを転送する機能があるかどうか。他のホスト宛のパケットを受け取った時に、ホストはそれを破棄する、ルータはそれを転送する。
ルーティングテーブルはまぁだいたい覚えている。前々職の情シスの方と家庭用ルータで実験した(色々と教えてもらってた)のはいい思い出ですな、、、。
IP Fragmentとは下位プロトコルのMTUを超えた場合にパケットを分割する仕組みのこと。
IP Fragmentには通信品質上の問題がある。それを解消するために経路MTU探索という仕組みがある。これは通信経路上の最小MTUを調べて、IPパケットがその大きさ以下になるように分割すること。またIPパケットにはIP Fragmentを禁止するデータが入っている。

ホストAが3500オクテットのパケットをルータBを介した別ネットワークにあるホストCに送ると仮定する。また、ホストAからルータB間のMTUは5000MTU、ルータBからホストC間のMTUは500とする。この時にホストAはルータBへ3500オクテットのパケットを送る。ルータBはホストCに送信しようとするが、MTUより大きいサイズなので、送ることができない。この時にルータBはICMP到達不能メッセージをホストAに送る。このメッセージにはルータBとホストCのMTUが記載されており、ホストAはそのMTUをもとにパケットの分割を行い、ルータBに送り、ルータBはホストCに送る。

ICMPはIPの補助的なプロトコル。ヘッダーはいくつかの種類があり、union型で表されている。

ヘッダーの構造はLinux(?)なら/usr/include/**/*.hに定義されている。書籍では/usr/include/netinet/以下が紹介されているっぽい雰囲気。

メモ

ふと思ったけど、Linuxはどうやってネットワークを扱っているのか、ソースコードを見てみたいと思った。
ブロードキャスタ型のプロトコルはどうやって偽物検知しているのか?
ヘッダーの構造とか覚えている人、まじですごいな。仕事でやってたら覚えるのかもしれないけど、、。

ラズパイにNIC2枚刺すの、そこまでお金かからなそう。自作ルータするときは買ってみたい。
ビット演算が掛け算わり算よりも高速だから使うっていうのは理解できる。が、こういう領域以外でやられたら雷落ちそう。

経路MTU探索、今回の例はルータが1つだし、ネットワークも単純だから良いけど、世の中のネットワークはもっと複雑で、もっとICMP到達不能メッセージを受け取る可能性がありそうだなと思った。ヤバそう。