TCP/IPをマスタリングしたい

最近、ネットワークの事ちゃんと理解したいなーと思って、積読されてた「マスタリングTCP/IP」という本を読んでみた。TCP/IPを言いつつそれより下のレイヤーのイーサネットとか上のレイヤーのSMTPとかHTTPとかまで解説してくれてるので、親切な本だと思う。いろんなとこでオススメされてるし、良さげ。

とりあえず、内容をざっくりとまとめてみる。

ネットワークの階層構造

僕らは普段当然の様にネットワークを利用して様々な情報をやり取りしてる訳だけど、実はその背後には様々な複雑な仕組みがある。 例えば、僕らが最も頻繁に行うであろう「ブラウザを使用してのWebブラウジング」を考えてみても、HTTPのリクエストを送る為にまずTCPのコネクションを張る必要があって、TCPのコネクションを張る為にIPアドレスで宛先指定する必要があって、IPでパケット送るには物理層(LANケーブルとか光ファイバーとか無線とか)で繋がっててかつMACアドレスが割り振られたネットワークインターフェースを持ってる必要があって、って感じで階層下された沢山の仕組みを使って通信を行う事になる。 URLからIPアドレスを取得するにしてもDNSサーバにUDPで通信する必要があって、UDPはやっぱりIPやそれより下位のレイヤーに依存する事になる。

こういった階層化は一見複雑に見えるけど、むしろ適切な抽象化をもたらして全体の理解を容易にしてくれる。関心事を分離してレイヤー毎に自分の仕事に専念させる事で、上位のレイヤーからは下位のレイヤーのプロトコルの詳細を知らなくてもその役割だけを理解してれば良い事になる。一度に考える事を減らせるので、複雑性を減らす事が出来る。とっても良い。

TCP/IPOSI参照モデル

ネットワークの階層はよく「OSI参照モデル」で説明される。

  1. 物理層(LANケーブル、光ファイバー、無線)
  2. データリンク層(イーサネット)
  3. ネットワーク層(IP)
  4. トランスポート層(TCP)
  5. セッション層
  6. プレゼンテーション層
  7. アプリケーション層

の7つの層から構成されてるとか言うやつ。下に行く程上位になっている。

これらは実際の実装との対応付けを行う事が出来て、例えば1の物理層はLANケーブルや無線みたいな物理的な送信路(と電気や電磁波による信号をビットに直す仕組み)に対応してる。2のデータリンク層は同じLAN内にある機器(PCやルータ)同士の、MACアドレス(ネットワークインターフェースに個別に割り振られた番号)を用いた通信に対応してる。3のネットワーク層が多くの人によっておそらく一番馴染みが深いIPを用いた通信に対応してて、IPアドレスによる宛先の指定なんかはこのレイヤーが責任を持っている。4のトランスポート層TCPUDPに対応してて、何をする為の通信なのか(サーバーへのHTTPリクエストなのかSSH通信なのかFTPによるファイル転送なのか)を管理してる。5~7はアプリケーションプログラムの責任としてひとまとめにされる。

マスタリングTCP/IPでは、これらの各レイヤーについて説明がなされてた。特に、IP(というかIPアドレス)については何となく知っててもデータリンク層トランスポート層については意識しないとあんま触れる機会は無いと思うので、勉強する良いきっかけになった。

それぞれのレイヤーの詳細な説明は、機会があればまた後日する。だいぶ短くなっちゃったけど眠いので許して欲しい。

Go言語触ってみた その3

今週も、Goを触ってみて気になった点とかについてまとめてみる。

先週の振り返り

先週はGoの型システムについてブログを書いた。新しい型を定義する際に、

  1. 既存の型に別名(?)をつける場合
  2. struct型を定義する場合
  3. interface型を定義する場合

の3通りの方法があると述べた。

今週は、先週ちょろっと触れながら詳しくは説明しなかったembedding typeについて触れる。

続きを読む

Go言語触ってみた その2

昨日は眠さに負けて寝ちゃったので、続きを書く。

Go言語の特徴的な点

印象に残った点を書いて行く。

Goはオブジェクト指向???

Goには、現代的なオブジェクト指向言語の大半に存在する「クラス」というものが存在しない。というか、今サラッと「オブジェクト指向言語」と書いたがそもそもGoがオブジェクト指向言語かどうかは微妙なところで、公式のFAQでも「Goはオブジェクト指向言語か?」という問いに対して「Yes and no.」と答えている。

参考: The Go Progrraming Frequently Asked Questions (FAQ)

続きを読む

Go言語触ってみた

今をときめくGo言語を触ってみた。ときめくとか言いながらGo言語が一番話題になってたのは登場したばかりの頃だったと思うけど、今はプロダクトレベルでの浸透が進んでる気がする。気がするだけで実情は知らない。

ただ、サーバーサイドにGoを使ってるGunosyみたいな企業がいたり、go製のCLIツール(例えばpecoとか)がもりもり登場してきたりしてて、少なくとも自分の感覚としては流行ってきてるなーとか思ってる。

で、何番煎じか分からないくらいだけれども、とりあえずGo言語を触ってみた。

続きを読む

Dockerを触ってみる

最近は、Immutable Infrastructureという文脈だとDockerがかなり注目を集めているので、例に漏れず触ってみる事にした。

そもそもDockerって何?

Dockerは、「コンテナ技術による仮想化ソフトウェア」である。中身の動きを知らないと正直ピンと来ないんだけど、ざっくり言うと「プロセスからのリソースへのアクセスを制御する事で、独立したコンテナ環境を作るソフトウェア」みたいな感じ。 これもあまり上手く説明出来ている気がしないけど、以下のページなどを読むとイメージがつかめるかも。

続きを読む

Vagrant+Chef Soloでのサーバー環境構築自動化を試してみる(参考: パーフェクトRuby on Rails 第8章「Railsのインフラと運用」)

ちょっと前から「パーフェクトRuby on Rails」という本をちょこちょこ読んでいる。 Railsについては、「RailsによるアジャイルWebアプリケーション開発」を一通り読んだり自分でも簡単なWebアプリ作ったりしてたのでざっくりとは理解してるつもりだったんだけど、ポロポロ知らなかった内容も取り上げられてたので楽しく読めている。

続きを読む