はじめに
いまから2ヶ月ほど前、TCP/IPについては基本情報技術者試験の学習により概念的な部分を理解している状態でした。あくまで概念理解にとどまり理解もふわふわしている状態でした。そこで出会ったのが、「Linuxで動かしながら学ぶTCP/IPネットワーク」です。TCP/IP関連の書籍は概念説明に留まるものが多い中、本書では「動かしながら学ぶ」をコンセプトにハンズオンで学習できるため非常に理解が深まりました。本記事ではこの書籍から得られたことを踏まえてTCP/IPについてまとめていきます。
※Linuxの環境構築については趣旨がずれるため省略します。
TCP/IP
TCP/IPとは
- TCP/IPとはインターネットを構成するプロトコルの総称。
- プロトコル・・・決めごと。(例えば世界共通語として英語がある。TCP/IPはコンピューターの世界における英語のような存在である。コンピュータがお互いにやり取りするための共通語がTCP/IPと考えると良い。)
※TCP(Transmission Control Protocol)
※IP(Internet Protocol)
プロトコルの階層構造
TCP/IPに含まれるたくさんのプロトコルは役割ごとに階層構造で分類できる。
プロトコルの階層構造を説明するときに、よく用いられるのがOSI(Open Systems
Interconnection)参照モデルである。このモデルではコンピュータの持つべき通信に関する機能を、役割ごとに階層構造で規定している。
- アプリケーション層
- プレゼンテーション層
- セッション層
- トランスポート層
- ネットワーク層
- データリンク層
- 物理層
IPアドレスとは
- IPアドレスはIP(Internet Protocol)というプロトコルで通信するのに必要な識別子の一種である。
- IPアドレスはインターネット上で一意である(ただし、グローバルアドレスのみ)。
- IPはパケット(データグラム)を運ぶ→つまりIPでデータをやり取りする際の単位がパケットである。
- IPによって運ばれるパケットのひとつひとつには差出人と宛先のIPアドレスが載っている。この部分をヘッダーという。
※ヘッダー・・・IP以外のプロトコルにも存在する。ヘッダーにはそのプロトコルで通信するために必要となる様々な情報が含まれている。また、ヘッダーの中で情報を記載する領域のことをフィールドという。
- IPアドレスはネットワーク部とホスト部に分かれている。特定のビット数を境目にして前後に分けて、前半部分をネットワーク部、後半部分をホスト部という。
- ネットワーク部が同じIPアドレスは同じセグメントに属している。
例)192.0.2.2/24 は24ビット目までがネットワーク部であることを表している。ビット境目までの長さをプレフィックス長という。
※セグメント・・・同じセグメントに属しているIPアドレス同士はルータを介さずに通信することができる。
ルーターとルーティングテーブル
- パケットが目的地までに通る道順は、具体的にはパケットが目的地に届くまでに通過するルータというネットワーク機器を表している。
- ルータの仕事は別のルータまたはホストから送られてきたパケットを次のルータまたはホストに送ること。
- パケットは目的地に届くまでにたくさんのルータを通過している。
※ホスト・・・IPアドレスを持ってネットワークにつながっている、ルータではない コンピュータのこと。また、ホストやルータといった区分をしない、ネットワークにつながったコンピュータの総称をノードという。
- パケットを次に渡すべき相手をルーティングテーブルで管理している。
- ルーティングテーブルを構成する二大要素は「宛先」と「次にパケットを渡す相手である」後者をネクストホップという。
イーサネット
イーサネットとは
- イーサネットはプロトコルを含んだ規格の一つである。IPを含む上位層の通信を運ぶという役割がある。IPが荷物の入ったダンボール箱だとしたら、イーサネットはそれを運ぶためのトラックである。イーサネットでデータを送る単位のことをフレームという。IPのパケットは異なるフレームに積み替えられながら最終的な目的地まで運ばれていく。
- イーサネットはプロトコルの階層構造においてIPの下に位置している。OSI参照モデルであれば、データリンク層と物理層に対応する。
- フレームの送信元と送信先を管理することに使われるのがMACアドレス(Media Access Control Address)という識別子である。イーサネットのフレームを送受信するネットワーク機器ごとに付与される。
※MACアドレスは原則的には機器ごとに一意であることが望まれているが、ブロードキャストドメインの範囲の中で重複しなければ問題にならない。
- IPアドレスに対応するMACアドレスはARPというプロトコルにより解決される。
※ARPもIPと同じようにイーサネットのフレームで運ばれている。ARPリクエストを送る際はブロードキャストアドレス(フレームが届く限りの範囲で全ての機器にリクエストしている。)に向けてリクエストする。ARPリプライを送るネットワーク機器は、ARPリクエストのフレームを見れば送信元となった機器のMACアドレスはわかるためブロードキャストアドレスではない。
- 一般的にブロードキャストドメインの範囲はネットワークセグメントと同じになる。
- ネットワーク層でパケットを転送する機器はルータと呼ばれる。それと同じようにデータリンク層でフレームを転送する機器のことはブリッジと呼ばれる。
- ブリッジの仕事は自身のどのポートにどのMACアドレスの機器がつながっているのか管理すること。
トランスポート層
トランスポート層のプロトコル
- トランスポート層のプロトコルでは以下の課題を解決する。
- コンピュータが扱う通信には色々な種類がある。(メールやブラウザなど)送受信するパケットがどのアプリケーションで使われているかIPのヘッダに含まれている情報だけでは分からない。
- パケットが経路上で破棄される恐れがある。
- トランスポート層の代表的なプロトコルとしてTCP(Transmission Control Protocol)とUDP(User Datagram Protocol)がある。
- コンピュータが扱うさまざまなアプリケーションの通信はポート番号で区別する。
- アプリケーションが使うポート番号はやり取りするプロトコルによって決まる。
UDP
- UDPはトランスポート層のプロトコルなので、階層構造でIPの上位に位置する。→UDPのヘッダはIPのヘッダの直後にペイロードとして連結される。UDPのヘッダ内にアプリケーションを区別するための情報が入る。
- UDPのヘッダには「Sourse Port」と「Destination Port」というフィールドがある。前者に送信元、後者に送信先のポート番号が入る。
- UDPはコネクションレス型という送ったら贈りっぱなしのプロトコルで、経路上でパケットが破棄されてもUDPは何も検知しない。→速さを重視したいとき向け。
TCP
- UDPと同じように通信しているアプリケーションをポートで区別できる。
- UDPの機能に加えて、信頼性のある通信が実現できる。データが相手の相手までちゃんと届いたことを確認しながら通信を行う。(コネクション型のプロトコル)
- もし、パケットが経路上で破棄されるなどして相手に届かなかった場合、同じデータを再び送る。(再送制御)
- パケットは経路上で破棄される以外にも、送った順番と到着する順番が入れ替わることがある。(アウトオブオーダー)ICPではアウトオブオーダーが生じたときもデータの順番を正しく認識して通信できる。
- TCPでは通信を始めるときに3つのセグメントをやり取りする。目的は通信する相手とこれからデータを送り合うことについてあらかじめお互いに確認すること。この通信のことを「スリーウェイハンドシェイク」という。スリーウェイハンドシェイクが完了するとTCPのコネクションが確立したとみなされる。
- TCPのヘッダ中にFlagというフィールドがある。ここはコントロールビットが格納される。コントロールビットの中でも以下2つのフラグのたったセグメントを送る。
SYN(Synchronize sequence numbers)
このビットが立ったパケットを送り合うことでお互いにシーケンス番号を同期する。シーケンス番号はTCPがデータの順番を管理するのに使うフィールド。シーケンス番号があることでセグメントの到着する順序が入れ替わったとしても順番を間違えて解釈することがなくなる。
ACK(Acknowledgment field significant)
データがちゃんと届いているかを確認する。TCPのセグメントを受信した側は、自分がそのセグメントをちゃんと受け取ったことをACKの立ったセグメントを送ることで示す。TCPのセグメントを送信する側はセグメントに対応するACKが帰ってこないときに同じセグメントを何度か送り直す。
アプリケーション層
アプリケーション層のプロトコル
OSI参照モデルでいえば最も上に位置する層。(TCP/IPではOSI参照モデルのセッション層から上の3つの層を全てアプリケーション層としてまとめて扱う。)
HTTP
- TCPの80番ポートを使ってやり取りされるテキストベースのプロトコル。
- Webブラウザを使ってWebページを閲覧するときにコンテンツを転送するのに用いられる。
DNS
- UDPの53番ポートを使ってやり取りされるバイナリベースのプロトコル。
- ドメイン名をIPアドレスに変換する(名前解決する)。
- ドメイン名の解決はOSの中でリゾルバと呼ばれるプログラムが担当する。リゾルバはコンピュータの中にあるhostsと呼ばれるファイルを参照したり、外部のサーバーに問い合わせることで名前解決する。
- hostsファイルを使ったドメイン名の解決は、とても単純な仕組みで実現されている。具体的にはテキストファイルにドメイン名と対応するIPアドレスが書かれている。
- hostsファイルが見つからなかったときは外部のサーバに問い合わせる。リゾルバが問い合わせるDNSサーバのことをネームサーバという。
DHCP
- UDPの67番ポートを使ってやり取りされるバイナリベースのプロトコル。
- コンピュータがTCP/IPのネットワークを使うのに必要な設定作業を自動化する。
- 空いているIPアドレスを自動で配布したりルーティングテーブルを自動で設定できる。
NAT(Network Address Translation)
- NATはIPアドレスを変換するという概念を指している。(具体的にはパケットのヘッダにおいて、IPアドレスの入ったフィールドを書き換える操作を指している。)
- 多くのネットワークでNATが使われる背景→IPv4アドレスの総数は約43億個であるが、インターネットが急速に普及することで足りなくなった。
- NAT、厳密にはNATの一種であるNAPT(Network Address Port Translation)が使われている。NAPTを使うと少数のグローバルアドレスを多数のプライベートアドレスで共有することができる。→インターネットを利用するホストの台数に比べて必要なグローバルアドレスが少なくなる。
- NATの中でも家庭やオフィスのネットワークで目にする機会の多い二種類を以下に示す。
Source NAT
- パケットの送信元IPアドレスを変換する。LANでしか通用しないプライベートアドレスをインターネットで通用するグローバルアドレスに書き換える。
- 一般的にはルータが実施する。ルータは送信元のプライベートアドレスを自身のインターフェイスに付与されているグローバルアドレスに書き換える。
- グローバルアドレスとプライベートアドレスを1:Nの関係で扱うには、IPアドレス以外にもトランスポート層のポート番号も書き換える必要がある。
- NAPTではインターネットに転送するパケットのIPアドレスとポート番号を必要に応じて書き換えるとともに記憶しておく。NAPTではこの書き換える前と書き換えた後の対応関係をセッションとよんで管理している。
Destination NAT
- Source NATを使う環境では一般的にインターネットからLANに向けた一方的な通信はできない。理由の一つはインターネットではプライベートIPにアドレスを宛先にしたパケットをルーティングできないため。
- Destination NATを使うとインターネットから到来したパケットをLANにつながっているノードに転送できる。つまり、送信先がルータのグローバルアドレスになっているパケットをプライベートアドレスに書き換える。
- 何でもかんでも書き換えるわけではなく、指定したトランスポート層のプロトコルで特定のポートに関してだけはインターネットを起点とした通信を許可する。この振る舞いをもとに「ポートを空ける」という表現につながった。
終わりに
最後まで読んでくださりありがとうございました。これからも実務や自己学習で学んだことについて積極的にまとめていきたいと思います。もし良かったらツイッターもフォローしてください!
コメント