re:annkara

日々学んだことを書き留めておく。

低レイヤープログラミング

@dekokunさんや@DQNEOさんに触発されて、低レイヤのプログラミングに興味が湧いてきている。

dekotech.dekokun.info qiita.com

最初は9ccの写経をしていたのだけど、途中からTCP/IPの理解を深めたいなと思って積読していたソースコードで体感するネットワークの仕組み ~手を動かしながら基礎からTCP/IPの実装までがわかるを写経し始めて、やっと第二章まで終えた。

この本の面白いところは、ネットワークのL2レイヤ(イーサネットフレーム)のデータの送受信から自前で実装するという点で、普段ならカーネルがやってくれている部分を実装を通じて理解することができる点だと思う。

第二章が終わった段階では、ホスト上のNICを利用しつつも仮想的なMACアドレスIPアドレスを持つ仮想ホストが実装され、ARP、ICMPなどのL3レイヤまでのプロトコルが実行できる。

イーサネットARP、IP、ICMPとネットワークの低レイヤから高レイヤにかけて段階的に実装していくと、階層化されたネットワークというものを実感できるし、高レイヤのプロトコルはヘッダ情報が複雑化する分、表現力が増すし実装も複雑になるのだなと思った。

例えば、イーサネットレイヤにおけるデータ転送できる最大サイズは1500バイト(もちろん変更できる)に対して、IPレイヤにおけるパケット最大サイズは65535バイトで、その際にはパケットのフラグメンテーションが発生して、1500バイト毎にパケットが分割されて転送されるみたいな。

TCPの実装にはまだ取り組めてないけど、TCPとなるとピア間の接続状態の管理だとか、輻輳制御だとか再送機能だとかもっとできることが増えるのでその分実装も難しくなるんじゃないかなと思っている。これはそのうちちゃんと取り組みたい。

この本自体は実装がメインでネットワークの仕組みだとか、コードの説明だとかあまり載っていないのでネットワークを初めて学ぶような人とか、C言語初心者ですみたいな人には向かない本だと思う。

かといって自分もC言語バリバリ書けるとかではなく、なんとなく読める程度であとはググればなんとなくわかるくらいなので、何冊かC言語の本読んで簡単なサンプルが書ければ大丈夫なんじゃないかと思う。ネットワークに関する知識はどうだろう。基本情報とか応用情報とかの知識があれば大丈夫な気がする。。。

環境面としてはLinuxでやった方がよい。自分はWSLを利用していたけど、コンパイルは通るけど実行はできなかった。多分、socket周りでWindowsがサポートしていないシステムコールを利用しているからだと思う。WSL2は試してないからわからない。そのうちやってみようと思う。

3か月間いろいろアウトプットさぼってきたので、これを機に定期的にブログ書いていきたいなー