ネットワークのプロトコルまとめ【TCP/UDP/ARP/ICMP/DHCP/DNS/HTTP】

院試の勉強でネットワークを勉強したまとめです。ネットワークの「通信規約」=プロトコルについてまとめています。

OSI (Open Systems Interconnection)参照モデル

まずは全体像から。 OSI参照モデルとは、国際標準化機構(ISO)により策定されたコンピュータなどの通信機器の通信機能を、階層構造に分割したモデルのことです。7つの階層に分類しそれぞれの階層の中で規約を定めるというただの「概念」です。

http://image.itmedia.co.jp/ait/articles/0007/19/wi-fig1.gif

プロトコルとの対応は以下のようになっています。

https://qiita-image-store.s3.amazonaws.com/0/130302/0b872bab-378d-6dcd-7ac7-2a361f7d152f.gif

 インターネットプロトコルにおける 5 層のスタックモデル

OSI参照モデルから、セッション層とプレゼンテーション層を省いた、この5層のモデルは、目的の通信をするのに必要な通信プロトコルをひとまとめにしたもの。

http://image.itmedia.co.jp/ait/articles/0106/14/r13zu01.gif

TCP(Transmission Control Protocol)

データの欠落や破損を検知して再送したり、届いたデータを送信順に並べ直したりといった制御を行って、信頼性の高い通信を実現するために使用されるプロトコルです。転送効率より確実性が重視される時に使われます。

通信相手の状況を確認して接続を確立し、データの伝送が終わると切断するという手順を踏むので、コネクション型のプトロコルと言われます。

TCPセグメントは「TCPヘッダ」と「TCPペイロード」の2つの要素で構成されています。

http://www.infraexpert.com/studygif/tcpip23.gif

この、TCPヘッダの「ウィンドウサイズ」と「確認応答番号(ACK)」が、高速で安定したTCP通信を実現するために重要な2つの制御(フロー制御と輻輳制御)において根幹となっています。フロー制御と輻輳制御は以下の記事にまとめています。以下、「ウィンドウサイズ」と「確認応答番号(ACK)」、それらと関連して「シーケンス番号」について簡単にまとめます。

http://kansiho.hatenablog.com/entry/2017/07/28/TCP%E3%81%AE%E8%BC%BB%E8%BC%B3%E5%88%B6%E5%BE%A1%E3%81%A8%E3%83%95%E3%83%AD%E3%83%BC%E5%88%B6%E5%BE%A1%E3%80%81%E3%81%9D%E3%82%8C%E3%82%89%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6kansiho.hatenablog.com

ウィンドウサイズとは何か?

TCPパケットを1つ送信するごとに受信側から一回一回、確認応答してもらうのは、ダルいです(遅くなります)。なので、実際にはパケットに「ウィンドウ」というまとまりを設けて、複数のパケットを連続して(ACK確認なしで)送信するという方式を取っています。3way handshake 時に、お互いに最大ウィンドウサイズを送り合うことによって、相手が処理できる能力より送ってしまうことがないようにしています。

ただ、多数の送信側ホストが同時にデータを送信して負荷が高まると、受信側はデータを処理しきれない場合が発生します。このような場合、受信側はウィンドウサイズを小さくしその値を送り直します。そして受信可能な状態になればウィンドウサイズを大きくして通知します。(この処理の事をフロー制御と言います。)

http://www.infraexpert.com/studygif/tcpip29.gif

確認応答番号(ACK) とはなにか?

ACKによって、データ送信側は「受信側がしっかり受信しているな」と知ることができ、受信側も「送信側がしっかり自分の状態を認識してくれているな」と確認することができます。具体的に言うと、TCPが通信を始める時、「スリーウェイハンドシェイク」という方式をとるわけなんですが、これは、まず、

送信側が「今からデータ送るよ、ここから送り始めるよ、サイズはこれくらい」と送ったとき,受信側が「おっけー、次はじゃあこのデータからってことね」と返せば、送信側は受信側に(1)届いていること(2)データ量を認識してもらえていること の2つが確認できます。

この「次はここからね〜」がACKにあたり、送信側が最初に送ってきたシーケンス番号+1を返す(200バイト目まで受け取ったなら,確認応答番号に「201」と書き込んで送ることになる)わけです。

シーケンス番号とは

パケットはネットワークの混み具合によっていろんな道からやってくるため、順番に届くとは限りません。

シーケンス番号は、バラバラにやってきたパケットを受信側が順番通りに並べる時に参照する番号です。このシーケンス番号の初期値はTCPコネクションの確立時にランダムに決定され、その後は連続した数値が割り当てられます。

(余談になりますが、なんでランダムなのかとゆーと、シーケンス番号がランダムでなければ、そのシーケンス番号を名乗って、割り込み送信できることになってしまうからです。。これをTCPシーケンス番号予測攻撃と言うらしいです)

http://yttm-work.jp/img/network/network_0039.png

UDP(User Datagram Protocol)

再送制御などを行わず「送りっぱなし」にする仕組みなので、TCPほど信頼性が高くはないですが、そのぶん速いので、高速性やリアルタイム性を求める通信に使用されるプロトコルです。TCPがコネクション型と言われるのに対して、UDPコネクションレスプロトコルと言われます。TCPみたいに丁寧に、3way handshake… なんてしません。いきなり、データどばー、です。

  • ポート番号によるアプリケーションの識別
  • チェックサムによるデータ正常性確認

しかしないシンプルさ。 「動画・音楽」などリアルタイム性が重要で、かつ、一部分のデータがちょっと抜けていても問題ない類のデータが増えたことによってニーズが生まれ、TCPのあとに開発されたプロトコルです。

http://www.infraexpert.com/studygif/tcpip33.gif

UDPヘッダには、

  • 送信元ポート番号 16 bit
  • 宛先ポート番号 16 bit
  • パケット長 16 bit –> 「UDPヘッダ」の長さと「UDPデータ」の長さを合計サイズの値。
  • チェックサム –> TCPヘッダとデータ部分のエラーチェックを行うために使用される値

の4つの要素しかありません。

UDPTCPの1対1の限定通信でなく1対Nの多局通信が行えるため、緊急信号による一斉(ブロードキャスト)制御を含めた通常通信が可能だったりします。TCPは一個一個、応答確認したり相手のウィンドウサイズに合わせたりと細やかな気配りをするプロトコルなのでできません。。

ブロードキャストするには、UDPヘッダで、IPの「ホスト部」を「全部1」にします(つまり10進法なら255)。

ARP ( Address Resolution Protocol)

IP アドレスからMACアドレスを調べる仕組み。イーサーネットで通信するとき、送信相手のMACアドレスを知りたいクライアントが、「このIPアドレスのやつ、MACアドレス教えてー」とブロードキャストしてみんなに叫ぶ。これをARPリクエスという。そうすると、「あ、そのIP私だ。MACアドレスはーーですよ。」みたいな、ARPリプライが返ってきます。これをARPテーブルに保存すれば通信が便利になるという仕組みです。

ちなみにmac ユーザーは

$ arp -a

で自分のmac アドレスが確認できます。

ICMP ( Internet Control Message Protocol)

pingのような、ネットワークの疎通を確認するための目的に使われるプロトコルをICMPプロトコルといいます(Protocol プロトコル、というのは変な感じがするがそう言うみたいです)。

$ transroute コマンドでもICMPプロトコルを利用する(ただしwindows OSの場合のみ。LinuxUDPプロトコルを利用する)。transrouteがネットワークをたどってくれるコマンドだというのはよく知られていますが、仕組みはどうなっているのかというと、IPヘッダのTTLを1にして目的のアドレス(もしくはIP) を指示して、1こめのルータに届いた時TTL=0となるのでTime Exceeded ということで戻ってくる… というのを、TTL = 1, 2, 3… と順次増やして行って到達するまで行うことで、どこをたどっているのか一個一個判明させて行くと言うように実現させているそうです。なんかまどろっこしい…。

DHCP(Dynamic Host Configuration Protocol) プロトコル

これは、あるクライアントがネットにつなぎ始める時、DHCPサーバーから、一元管理されたIPアドレスを与えてもらうときに利用するプロトコルで、ブロードバンドルーターなどがこのDHCPサーバの機能を持っていたりします。

DNS(Dynamic Name System) プロトコル

ドメイン名をIPアドレスに自動的に変換してくれるアプリケーション層プロトコル。クライアントがDNSサーバに行うドメイン名からのIPアドレスの名前解決にはUDP(ポート番号53)を使用します。  一方、DNSサーバとDNSサーバとがゾーン情報のファイル転送を行う場合 TCP(ポート番号53)を使用します。IPとドメイン名を対応させるデータベースは膨大な情報なので、階層的なデータベースとして分散的に保存されています。

http://image.itmedia.co.jp/ait/articles/0112/18/r3zu04.gif

mac ユーザなら

$nslookup google.com

DNSサーバに問い合わせることができる。

HTTP(Hypertext Transfer Protocol)プロトコル

http://image.itmedia.co.jp/ait/articles/1703/29/wi-httpfig01.png

HTTPでは、データを要求するHTTPリクエストとそれに応答して要求されたデータを送り返すHTTPレスポンスの2つのやりとりを繰り返してWebページを表示しています。

リクエスト↓

http://www.infraexpert.com/studygif/tcpip48.gif

メッセージ↓

http://www.infraexpert.com/studygif/tcpip49.gif

レスポンスのステータスコードは、

  • 100番台:続きあり
  • 200番台: 成功
  • 300番台: リダイレクト
  • 400番台:クライアントエラー
  • 500番台:サーバーエラー

を指します。アプリ開発者にはおなじみですが。

参考

e-words.jp

第7回 TCPとUDPの違い,深層の真相:教科書には載っていない ネットワークエンジニアの実践技術|gihyo.jp … 技術評論社

図解で学ぶネットワークの基礎:UDP編 - Lesson4:一斉同報やストリーミングはUDPならではの通信方法:ITpro

基礎から学ぶWindowsネットワーク:第14回 信頼性のある通信を実現するTCPプロトコル(その1) (3/3) - @IT

引用画像はクリックで引用元に飛びます。