- その2はこちら
引き続きネットワークの世界を泳いでみましょう!
トランスポート層
トランスポート層はネットワークとアプリケーションをつなぐ架け橋です。
実際の物理的なコンピュータは物理アドレスである「MACアドレス」で、ネットワーク上の住所としては論理アドレスである「IPアドレス」が使われます。
しかし、IPパケットを受け取ったとしてもどのアプリケーションに送ればいいのかはわかりません。それを教えてくれるのが、このトランスポート層の「ポート番号」です。ポート番号さえ見ればどのアプリケーションにデータを渡せばよいかわかるようになっています。
他にも、アプリケーションの要件にあわせて、パケットの送受信量を制御したり、転送途中に消失したパケットを再送したりする仕組みを提供してくれます。
データを送信する主なプロトコルとして、即時性が求められるときにはUDP、信頼性が求められるときにはTCPが使われます。
ポート番号
ポート番号には種類があります。
ポート番号「0 〜 1023」がSystem Portで、一般的には「Well-known Ports」として知られています。UDPの123番ならntpdやxntpdなど時刻同期で使用する「NTP」のサーバーアプリケーションに紐づくなどです。
ポート番号「1024 〜 49151」はUser Portで、メーカーが開発した独自のサーバーアプリケーションに一意に紐づいています。TCPの3306番なら、オラクル社のMySQLに紐づくなどです。
ポート番号「49152 〜 65535」はDynamic and/or Portsて、クライアントアプリケーションがコネクションを作るときや、送信元ポート番号としてランダムに割り当てられます。デフォルトで、Windows OSでは「49152 〜 65535」で、Linux OSでは「32768 〜 60999」です。
UDP
UDPは即時性(リアルタイム性)を求めるようなアプリケーションで使われる、送ったら送りっぱなしのプロトコルです。
音声通話(VoIP)や名前解決、DHCPや時刻同期などで使われます。
UDPのパケットフォーマットもシンプルです。
TCP
TCP(Transmission Control Protocol)は、データを送り届けることについて信頼性を求めたいアプリケーションで使用します。
「TCPコネクション」という、「送信パイプ」と「受信パイプ」で構成されている論理的な通信路を作って、通信環境を整えます。
その後、2本の論理的なパイプ使用して「送りまーす!」「受け取りました!」と確認し合って送り、信頼性を向上させています。
2020年では、インターネット上のトラフィックの80%以上がTCPで構成されています。
TCPにおける状態遷移としては、コネクションを確立する前に行うあいさつを表す処理手順である「3ウェイハンドシェイク(3WHS)」でコネクションをオープンする接続開始フェーズ。
「フロー制御」「輻輳制御」「再送制御」という3つの制御を組み合わせて転送する接続確立フェーズ。
接続終了フェーズではコネクションの終了処理として、「4ウェイハンドシェイク」が行われます。接続した状態のまま残ってはいけないので、オープンの処理よりもしっかり進められます。
アプリケーション層
アプリケーション層とは、アプリケーションとしての処理を行い、アプリケーションとユーザーをつなぐ階層です。
先ほど説明したトランスポート層は、転送制御をしながら、アプリケーションごとにパケットを選別してくれるが、それ以上のことはしてくれません。
主なプロトコルとしてHTTPと、SSL/TSL、DNSを紹介します。
HTTP
HTTP(Hypertext Transfer Protocol)で使われる「http://…」は、「HTTPでアクセスしますよー」とWebサーバーに宣言しつつ、リクエストを送信しています。
テキストファイル(HTMLファイル)をサーバーからダウンロードするだけというシンプルなHTTP/0.9から改良が進んで、今はGoogleが開発したQUIC(Quick UDP Internet Connections)をベースにHTTP/3の標準化が進められています。
テキストデータを使ってブラウザなどからWebサーバーに向けてリクエストを送ると、サーバーからレスポンスが返ってきます。
原則として前の状態を保存しないというステートレスなので、1回リクエストを送ったら1回レスポンスが返ってきて、それでおしまいという処理です。
これだと前にやりとりしたことを保存できないので、cookieなどを使って対応しています。
SSL/TSL
SSL/TLSはデータを暗号化したり通信相手を認証したりすることでデータを守る技術です。
SSLは「暗号化」「ハッシュ化」「デジタル証明書」という、3つの技術を組み合わせて使用します。
暗号化で盗聴を防ぎ、ハッシュ化で改ざんを防ぎ、デジタル証明書でなりすましを防ぎます。
SSLのバージョンの歴史は、そのまま脆弱性との戦いの歴史です。
どのバージョンを使用するかは「SSLハンドシェイク」によって決定されます。
「SSL1.0」はリリース前に致命的な脆弱性が見つかって、日の目を見ずに終わったので、SSL2.0がはじまりで、最新はTSL1.3です。
DNS
DNS(Domain Name System)とは、IPアドレスとドメイン名を相互に変換するプロトコルです。
「10.1.1.1」は見てもわからないので「ドメイン名」という名前をつけてわかりやすくするという、インターネットの爆発的普及を縁の下の力持ち的に支えたプロトコルです。
ドメイン名は、「www.example.co.jp」のようなドットで区切られた文字列で構成されていて一つひとつの文字列のことを「ラベル」といいます。
右から順に「ルート」「トップレベルドメイン(TLD: Top Level Domain)」「第2レベルドメイン(2LD: 2nd Level Domain)」……と構成されていて、トップレベルドメインには地域ごとに割り当てられている「ccTLD(country code Top Level Domain、国別コードトップドメイン)」と、特定の領域・分野に割り当てられている「gTLD(generic Top Level Domain、分野別トップレベルドメイン)」の2種類があります。
「jp」は日本を表すccTLDで、「com」は商用サイトを表すgTLDです。
IPアドレスとドメイン名を相互に変換する処理のことを「名前解決」といいます。
これは「DNSクライアント」「キャッシュサーバー」「権威サーバー」が相互に連携しあうことで成り立っています。
参考文献
『ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識』
『マスタリングTCP/IP 入門編(第6版)』
『図解入門TCP/IP 仕組み・動作が見てわかる』
『パケットキャプチャの教科書』
『Linuxで動かしながら学ぶTCP/IP入門』