読む:ヒヨコでもわかる TCP/IP 入門

これ読む
個人的に最近ネットワークにとても興味があるので基礎を固めたい

そのままレスポンスするんじゃなくて処理をしてからその処理結果をレスポンスするのか、たしかに
サーバーがクライアントに対してサービスを提供するとき、サーバーとクライアント間では、以下のような処理が行われます。
- クライアントはサーバーに対して何らかのサービスを要求する。
- サーバーは要求に応じた処理を行う。
- サーバーは (2) で行なった処理結果をクライアントに返す。
- クライアントは処理の結果を受け取る。
まぁそのまま返すことも可能ではあるのかな
API(APIサーバー)実装を考えてみても、db操作とかいろいろやってから最後にレスポンスを返すのは普通なんだけど、やろうと思えば何も処理を行わずそのままreturnで終了することもできるので

一元的というワードを聞いてピンときたが、このクライアント/サーバーシステムでは無い例って、対照的なものとしてP2Pとかがありそう
このようにサーバーとクライアントで構成されているシステムのことを 「クライアント/サーバーシステム」 と言います。クライアント/サーバーシステムではサーバーを中心としてデータを一元的に、容易に管理できる ことから多くのコンピュータシステムで採用されています。
やっぱりか
クライアント/サーバーが中央集権で、P2Pが分散みたいなの情報の授業で聞いたような記憶があった
「だけどP2Pを必死に唱えてた人は結局敗北したんですよね~はっはっは」みたいなことも言ってたような

すごくわかりやすい
「ネットワーク」という言葉は、「 何かと何かの繋がり 」全般を表しています。
ここでいうネットワークは コンピュータとコンピュータを繋ぐ「コンピュータネットワーク」 を指しています。鉄道会社のネットワークが乗客を乗せて電車を運ぶように、放送網のネットワークが情報を電波に乗せて運ぶように、コンピュータネットワークはデータをケーブル(無線LANの場合は電波)に乗せて運びます。

ん?「地域限定のLAN」って二重表現じゃないか?LAN=地域限定と言えるので
イントラネット
インターネットの技術を使った 地域限定のLAN のことを指します。
地球規模のインターネットと違い、特定の会社や地域内のコンピュータのみに情報を公開したり、データをやり取りします。また、通常は何かしらのセキュリティ対策が施されて、外部のコンピュータからはアクセスできない ようになっています。
この説明だとLANそのものの説明とまったく一緒な気がする、何が違うんだろう
ということで他のサイトを見てみたら、理解できた
要はインターネットと同じプロトコルを使用するという特徴を持ったのがイントラネットらしい
あえて違いをあげるとすると、LANはIPネットワークだけではなく、自由にプロトコルを選択してネットワークを構築することができますが、イントラネットは原則として、インターネットと同じIPネットワークを構築するということです。
インターネットと同じということは、イントラネットもTCP/IPプロトコルを用いたIPネットワークをベースに、HTTPによるWWWシステム、POP・SMTPによる電子メールシステムを構築することができます。
そのため、ユーザーは使い慣れたブラウザやメーラーを使うことが可能になり、仕様や操作方法を新たに習得する必要もなく、コスト削減や業務の効率化を図ることができます。
つまり、プライべートで利用しているインターネットと同じように操作できるのです。
なるほどープロトコルの話なのか、へぇ

へぇ~
サーバーを接続する際は 必ずと言って良いほど「有線LAN」 が使われます。一方で、「 無線LAN 」が使われるのは基本的に クライアントのみ です。
python app.py
コマンドでpythonサーバー(APIサーバー?)立てるとかしかやったことないからそういうガチのサーバー(?)は有線だということは知らなかった
まぁサーバー室みたいなイメージか、確かに線がいっぱい繋がってるイメージはある

なるほど
ネットワークの分野では実際に通信を行う際に使われるルールをルールと呼ばず 「プロトコル」 と呼ぶのです。
プロトコル:会話を成立させるためのルール、約束事

あーそういうことなのか
ネットワークを勉強する際に、最初に理解しておかなければならない概念は「 TCP/IPモデル 」です。TCP/IPモデルは米国国防高等研究計画局(DARPA)がコンピュータの通信機能を階層構造に分けて整理したモデルです。正直、はじめのうちは「 頭の良い人たちが作った通信するときのプロトコルの集まり 」程度の認識でOKです。
通信のルールをプロトコルと呼んで、そのプロトコルが集まったものをTCP/IPモデルと呼ぶのか

多分これ間違いだな...
TCP/IPでは, ネットワークを5つの段階に分けて 考えます。各段階を 層(レイヤー) といい、層を分けることを 階層化 と言います。
どのサイト見ても4層だと記述されてるし、基本情報技術者試験のテキストでもそう習った
TCP/IP階層モデル(DoDモデル)とは、インターネットなどで広く普及しているIP(Internet Protocol)を中心とする、いわゆるTCP/IPプロトコル群の役割を階層構造で整理したモデル。7階層のOSI階層モデルよりシンプルな4階層となっている。
しかも、使用している図が4層では...?
とりあえず読み進めていく

「物理層」とかも述べられてるので、おそらくOSI基本参照モデルと混同しちゃってる気がする

責任の分離が目的なのか
TCP/IPの階層化では、それぞれのレイヤーが全く違う役割を持ち、別々の動作 するようになっています。こうすることにより、あるレイヤーが 他のレイヤーに影響に及ぼすことがないようにする ことはもちろん、システムに何らかの以上が発生した際に レイヤーごとに検証を行なっていくこと が可能です。

へぇ~、こういうヘッダがついてるのか
ちなFCSとは
はーなるほど
FCS(Frame Check Sequence)とは、通信途上でデータに誤りが生じていないか調べるため、送信時にデータに付加される誤り検出符号のこと。プロトコル(通信手順)の仕様の一部として規定される。
FCSはフレーム全体から一定の計算手順で算出した固定長の短いデータで、フレームの末尾(ペイロードの後ろ)などに付加して送信される。
フレームの構成要素の1つってことか
ていうかデータリンク層ってイーサネットつまり有線のLANケーブルとかそういうもののことか、イメージついてきた。物理的なリンクってことか。んで物理そのものつまりPCそのものがlayer1の物理層って感じか
イーサネット(Ethernet)などの通信規格では、データを固定長のフレーム(frame)と呼ばれる単位に分割して送受信する。
フレームとパケットは似てる。層の違い(フレームがL2でパケットがL3)

うぉぉそうなのか知見だ
ネットワークの通信ではTCP/IPモデルのレイヤーを越えるたびにデータを付加したり、取り除いたりします。データを送り出すサーバーでは、 通信に必要なデータを付加する「カプセル化」 が行われ、データを受け取るクライアント側では、不要になったデータを取り除く「非カプセル化」 が行われます。
んで、最終的に物理層ではビット列になるのか、なるほど

なるほどぉぉ付加されていくデータが「ヘッダ」か
また、ここで データの前(または後ろ)に取り付けられる通信に必要なデータのことを「ヘッダ」 と呼びます。(下の図では緑色の部分がヘッダに該当します)

なるほど
例えば、インターネットでサイトを見に行ったとします。すると、次のような要求がネットワークを通して行くようになります。
- ブラウザがリクエストメッセージを作成する
- OSのTCP/IP処理ソフトがトランスポート層と呼ばれるところにデータを渡す
- トランスポート層のTCPというプロトコルでTCPヘッダが付けられる(データの先頭にそういうデータがくっつく)
- 続いて、ネットワーク層というところにデータは送られ、ここでIPヘッダ(行き先などのデータ)がくっつく
- 次にデータリンク層MACヘッダなどのヘッダ情報がさらにくっつき、LANアダプタからデータが送られる
OSI基本参照モデルで考えると
- L4/トランスポート層:TCPプロトコル
- L3/ネットワーク層:IPプロトコル
- L2/データリンク層:MACアドレス
って感じでそれぞれ使われてるのか
ちなmacアドレスとipアドレスの違いはこれ
どちらも機器の識別情報なんだけど、macアドレスは次の目的地として機能する、ipアドレスは最終的な目的地として機能する

なるほどなー
クライアントで行われる「非カプセル化」
クライアントではサーバーとは逆に レイヤーの下流から上流に向かって非カプセル化 の処理を行い、受け取った通信用のデータからオリジナルのアプリケーションデータを取り出してます。

なるほど、並列処理しやすくするためにパケット単位でデータ分割して通信してるのか
トランスポート層には「データを通信に適した形に変換する」という役割があります。その具体的な内容は「アプリケーションデータの分割」です。
一度に送るデータの大きさが大きすぎると、そのデータが1つの回線をずっと使い続けてしまい、同時に様々なデータが送られる場合にそれらを並列処理することが出来ません。
その為、TCP/IPではアプリケーションデータを 一定の大きさに分割 して送受信する パケット交換 という方法でデータのやり取りを行います。
また、このような通信方法を パケット通信 といいます。
ただパケットってL3のネットワーク層では?トランスポート層はセグメントという話だったと思うが
どっちもパケットと呼ぶのか?よくわからん

ふむ
アプリケーションが通信を行う際、アプリケーション毎に通信するデータの送受信を行うための出入り口が用意されています。この出入り口を ポート といい、各ポートには ポート番号 が割り振られています。なので通信を行う際は、このポート番号を使って情報をやり取りします。
そういえばPCの穴(USB Type-AとかType-CとかHDMIとか)ってポートって呼んでたけどそれと同じ読み方なのか?
まぁポートで良さそう。あとはコネクタとかインタフェースとかかな

へぇー
ポート番号には、0~65535番 まであります。このうち、0~1023番 までは通信サービス毎にあらかじめ予約されており、 ウェルノウンポート といいます。
あーFTPは21だったとかでハマったことあるなそういえば
主なサービスのウェルノウンポート

ふむふむ
ウェルノウンポート以外のポート番号に関しては、ユーザーが独自で設定することが可能 です。ただし、その場合は通信するコンピュータ同士で、 どのポート番号を使うのか についての認識が統一されている必要があります。

信頼性と即時性、なるほど
TCPとUDP
トランスポート層は通信の制御を行うレイヤーです。トランスポート層ではアプリケーションが求める通信要件を 「信頼性」 と 「即時性」 の2つに分類し、それぞれ、信頼性は「TCP」、即時性は「UDP」 というようにプロトコルを用意しています。
そういえば、ストリーミングはUDPだと思うが、これしょっちゅう止まったりするし即時性別に求めてない、結構待てるよ、みたいな時はTCPに手動で変えるみたいなことできるのかな?と個人的に気になってる
できるのならしたい

これ通りやったらできたぁぁすごい
だが別に何も変わった感じがない。。。

うわーそういうことかおもしろ

なるほど、TCPはめちゃくちゃ慎重にやるな

すごく賢い、すばらしい

へー複数の相手に送るのはUDPしかできないのか。tcpは同時に1人しか見れない、浮気しないプロトコルか

コントロールフラグっていうのが肝要だなー
TCP (電子メールやWWWで利用)
- データを確実に届けるために 1対1での通信 を行う。
- 通信を確実にする為に、受信側がデータを 受け取れる状態なのかを確認する 。
- 意思疎通を行う手段として コントロールフラグ が使われる。
- 受信側はデータを受け取った場合は 送信元に「受け取ったよ」という報告 をする。
- 受け取ったという返答が得られない場合は 再度送り返す 。

へー
ネットワークの分野では、TCPのような信頼性を重視した通信を「 コネクション型通信 」、UDPのような即時性を重視した通信を「 コネクションレス型通信 」と呼びます。

tcpもudpも、ポートを見てサービス(アプリケーション)識別するのは一緒
TCPもUDPもどちらも ポート番号 を利用して、「 コンピュータの中のどのサービス(アプリケーション)にデータを渡せば良いのか 」を識別しています。

ふむ
ネットワーク層では「誰が誰に届けるのか?」という、通信において最も重要な情報を扱います。
なるほど、内部で最適化アルゴリズムが実装されてそう
ネットワークは文字通り「 蜘蛛の巣 」のようにコンピュータが相互に接続されています。その為、あるコンピュータからあるコンピュータまでの 経路が複数パターン存在する 場合があります。宛先までの経路が複数ある場合に、適切なルートを決定するして届けるのもネットワーク層の役割です。

練習問題めっちゃ復習になったし普通に1問目間違えた。
アドレスプレフィックス表記法からの所属ネットワークアドレス導出、毎回間違えるんだよなー。3枠目のとこ、最初の4ビットでネットワークアドレス終了するのでその部分だけで考えちゃってたが、残りの0になった部分も含めて、8ビットとして計算しないといけなかった、当然なんだけど忘れてた
ちな2問目のサブネットマスクは10進数じゃなくて2進数でも良いはず(基本情報技術者試験のテキストでは2進数で紹介した上で10進数で表記するのもあるよ、という説明だったし)
重要
- ネットワークアドレスはホスト部が全部0のアドレス
- 所属ネットワーク自体を表す
- ブロードキャストアドレスはホスト部が全部1のアドレス
- ネットワーク内のすべての機器に一斉データ送信する際に使われる
- IPアドレスでは ホスト部が全て 0 or 1 のアドレスに機器を割り振ることができない 。
- ホスト部が全て 0 のアドレスは ネットワークアドレス と呼ばれる。
- 用途:ネットワーク自体 を表す。
- ホスト部が全て 1 のアドレスは ブロードキャストアドレス と呼ばれる。
- 用途:ネットワーク内の 全ての機器に一斉にデータを送信する ときに使用される。

これ、わざわざブロードキャストする理由がわからん。DHCPサーバーに直接問い合わせるだけで良いのでは?
他のサイトを見たら良い説明があって疑問解決。なるほど、「最初はDHCPのサーバーのIPアドレスすらわからないから全部に送信(ブロードキャスト)するしかない」てことか。理解
最初はDHCPクライアントは自身のIPアドレスも知らなければ、DHCPサーバのIPアドレスも知らないので全ての宛先(ブロードキャスト)にDHCP Discoverメッセージを送信して、ネットワーク全体に問い合わせ。

これもわからん。
もう手順2でIPはクライアントに対して割り当てて通知してるのでは?
またさっきのサイト見てみるか
んーなるほど..まぁ「渡してくれてありがとう!それ使うね!」というただの報告ってことか、理解
次に、DHCPクライアントは提案されたIPを使用する事を通知するためにDHCP Requestをブロードキャスト。

うん、なるほど。4つの流れはやはりこの記事がわかりやすい
- DHCP Discover(発見)
DHCPサーバいませんか?IPアドレスの設定情報くれませんか?
- DHCP Offer(提案)
このIPアドレス設定などはどうですか?
- DHCP Request(要求)
通知してくれたIPアドレス設定情報をください。
- DHCP ACK(承認)
それではこのIPアドレス設定情報でお願いします。
多分4のACKはacknowledge(認める)の略だな

なるほど、あくまで一時的レンタル

へーおもしろ
また、DHCPプロトコルでDHCPクライアントにIPアドレスを割り当てられる際、DHCPクライアントは IPアドレスをまだ持っていない為、TCP通信のような信頼性の高い通信ができず、UDP通信が利用されます。
逆に言えばIPアドレスなくてもUDP通信はできるってことか
まぁUDPはコネクションレス型通信だから相手を慎重に確認する必要とかも無いからなのかな

あー確かにルーターもネットワーク層の機器だし、パケットもネットワーク層のヘッダだ
ルータはネットワーク間を繋いで、 パケットが宛先に届くまでの道案内をする機器です。
ルーターはパケットを見張ってくれていたのか
んでパケットにはIPヘッダという構成要素があるので、IPヘッダも当然見るという感じ
ルータのネットワーク層では、IPヘッダーに記載された宛先のIPアドレスをみて、次の転送先を決定 します。当然ですが、ルーターの次の転送の決定先は最終到着地点のこともあれば、次のルーターの場合もあります。
ただ次の転送先を決定するにあたってはMACアドレスが使われるのでは?IPアドレスだけで決定できるのか?そこは気になる

へぇ、通過したルータの数が距離の遠さとして考慮されるのか~~
ネットワークの世界では、コンピュータ同士の距離を 通過したルータの数 で表します。この時に使用する単位を ポップ と言います。
そしてその数をポップと言うのか!

両方で使われてるんか(プロトコルというか規格では?と思ったが規格もルールみたいなもんか)
イーサネットは データリンク層と物理層で使用されているプロトコル です。

あーデータリンク層がフレーム作成をやるのは知ってるが、具体的にはイーサネットがやってたのか
イーサネットではネットワーク層から受け取ったパケットに以下の情報を付加することによって フレーム を作成します。
- プリアンブル: 受信側にフレームを 受け取る準備 をさせ、フレームが 始まること を示す値。
- イーサネットヘッダー: 宛先と送信元の MACアドレス(後述) などが記載される。
- FCS: フレームが破損していないかをチャックするための値。
データリンク層の中でイーサネットがいろいろやってるみたいなイメージかな

ふむふむ、カプセル化と非カプセル化の話
データリンク層では、こうやって生成された フレームをビット列(0と1で構成された数列)に変換 したり、物理層から 受け取ったビット列をフレームとして認識 したりします。

ん?データリンク層と物理層は別のレイヤーの話だと思うんだけど、この説明だとデータリンクの部分集合が物理層みたいなことになるな...どういうことだろう
物理層
データリンクの中で信号が流れている部分を物理層といいます。
ふむ、物理層では、データリンク層でいうイーサネットみたいな決まったプロトコルは無い
ここでは、ビット列を 電気信号, 光信号 などの信号に変換、復元 が行われます。その方法はコンピュータ自体が持つ性質に依存しているため、決まったプロトコルは持ちません。
へー、wifiアダプターとかのことかな
また、コンピュータとネットワークを繋ぐ玄関口となるのが ネットワークカード(通称: NIC) という機器です。LANカードやネットワークアダプタとも呼ばれます。

MACアドレスは16進数なのか。ipv6と同じだ
MACアドレスは「a8:66:7f:00:80」や「00-50-56-c0-00-01」のように8bitハイフンやコロンで区切って、16進数で表現されます。
ほー
MACアドレスは、各コンピュータの ネットワークカード に割り振られており、データリンク層では、この固有の番号を使って 機器を特定 します。
へぇ~、半々に分かれてるのか
また、MACアドレスの上位24bitと下位24bitにはそれぞれ異なる意味があります。
上位24bitは ベンダーコード(OUI) と呼ばれており、機器を作成したメーカーを識別 できる番号です。
上位24bitは ノード番号 と呼ばれており、機器を一意に特定する ためにメーカーが独自に割り振った番号です。
まぁでもIPアドレスのネットワーク部とホスト部も同じような意味での分かれ方(ネットワークと、機器の特定のためのホスト部)と言えるな

IPアドレスじゃ機器レベルでは特定できないのか...?へー
データリンク内ではMACアドレスを使って宛先の機器を特定するので「宛先のIPアドレスはわかるけど、MACアドレスがわからない」という場合は宛先にデータを届けることができません。
なるほど
ARPプロトコル はそのような時に IPアドレスから相手のMACアドレスを調べるプロトコル です。

んー、2でいきなり受信側って出てきてるのがよくわからない。受信するのはまずブロードキャストMACアドレスで、そのあと全体に発信して受信して...みたいな流れなのでは?なのでちょっと飛躍があるかも?
この具体的な手順は以下の通りです。
- MACアドレスを知りたいコンピュータのIPアドレスを ブロードキャストMACアドレス(後述) 宛てに送信する。
- 受信側は送信されたIPアドレスが自分のものと一致した場合、 MACアドレスを送り返す。
ブロードキャストMACアドレス
同じデータリンク内に存在する全てのコンピュータに同時にデータを送ることができるMACアドレスを ブロードキャストMACアドレス といいます。ブロードキャストMACアドレスは、 全てのビットに1が入っている ので 「ff:ff:ff:ff:ff:ff」 と表されます。
詳細な順序を図解つきで説明してくれてる記事を探して見るか

さっきと同じサイトで調べてみたらARPのページもあったので見てみる

なるほど~~
ARP(Address Resolution Protocol)は、IPアドレスからEthernetのMACアドレスの情報を得られるプロトコルです。LANに接続されたコンピュータ間で通信するためには、IPパケットは下位のレイヤでL2ヘッダが付加された上で伝送されることからMACアドレスの情報が必要となります。しかしこれらのIPアドレスとMACアドレスは自動的な関連づけがないので、ARPでMACアドレスを得る必要があります。
たしかにL2のヘッダはフレームで、そのフレームの中にMACアドレスが構成要素として存在する
だからMACアドレスが無いとフレームとしての機能を果たせなくなり、L2, L1が機能しなくなる、よってLAN内の機器同士で接続することはできなくなるという論理か、なるほど

やはりちゃんと名称がついていたか、詳細に見ていく
ARPには「ARPリクエストとARPリプライ」という2種類のパケットがあります。ARPは、これら2種類のパケットを利用し、宛先となるIPアドレスを持つノードのMACアドレスの情報を得ます。

あ~~~そういうことか、シンプルにブロードキャストアドレスというものを勘違いしていたかも
「すべての機器に送信することができる存在」のアドレスだと思っていた、つまり仲介者みたいなものだと思っていたが、そうではなくブロードキャストアドレスを使って送信すればその時点で、その瞬間に全機器に送られるのかも。何も仲介せずに。
だから全機器は、自身のMACアドレスを持っているのに加えて、ブロードキャストアドレスの一員として、ブロードキャストアドレスもアドレスとして持っていると言える気がする
なので各機器はアドレスを2つ持っていると言えそうだ。理解
- ARPリクエストをブロードキャスト
- 該当機器がARPリプライをユニキャスト
- MACアドレスを教えてあげる

で、LAN外つまり完全に外部のIPアドレスと通信したいなら、グローバルレベルの機器つまりデフォルトゲートウェイ(ルータ)に頼らないと意味無いので、デフォルトゲートウェイのMACアドレスを得る(探す)ためのARPリクエストを送ることになるのか
これらがARPの基本的な動きとなりますが、たとえば、コンピュータAが通信したい相手のコンピュータのIPアドレスが172.16.0.1だとします。その場合、172.16.0.1と通信したいので172.16.0.1のMACアドレスを得るためのARPリクエストではなく、デフォルトゲートウェイのIPである192.168.0.254のMACアドレスを得るためのARPリクエストを送信します。一般的に「デフォルトゲートウェイのIP = ルータのIP」です。

へぇーそういう機器もあるのか、なるほど
RARP (Reverse Address Resolution Protocol) とは、EthernetのMACアドレスからIPアドレスの情報を得ることのできるプロトコルです。ARPとは逆の動きのこのプロトコルは、現在ほぼ使用されていません。どのような場合に使用されるかというと、IPアドレスを持たないと通信できない機器であるにも関わらずIPアドレスの設定ができない(またはIPアドレスの設定が保存できない)機器がある場合に使用されます。
このような機器は起動時には自分のIPアドレスが分かりませんが、インターフェースのハードウェア部分にMACアドレス情報としては保持していることから、「自分のMACアドレスはこれですが、私のIPアドレスは何でしょうか?」という要求(RARPリクエスト)をすることでRARPサーバからIPアドレスを取得できます。
よし、ARPとRARPはok、元記事に戻る

確かにそんな気はするんだけど、MACアドレスのスプーフィングってやつ聞いたことあるんだよな、あれだと変更できるのではないだろうか?調べてみる
MACアドレスはコンピュータごとに割り振られる物理的なアドレスです。これは製品の出荷時に割り振られるもので あとで変更することはできません 。
やっぱできそうではあるな...?まぁ深くは見ないので頭の片隅に入れとく
MAC スプーフィング攻撃では、ネットワークデバイス(ネットワークカード)の MAC アドレスを変更します。

ふむふむ、なるほどたしかに
「宛先はどのアドレスか?」というIPアドレスは 送信元で決定 され、「次にどの機器に伝送されるか?」というMACアドレスは ルーターを経由するごとに更新 されていきます。