この記事は2007年に勉強しながら書いた旧ブログ記事をまとめたものです。
パケットの流れについて勉強していました。
この記事を書いた数年前に通信系のシステムを扱う会社にいたので、その知識が入っていると思います。
Excelに詳しいというと必ずネットにも詳しいよね、LANも構築してよ、なんて平気で言われる時代に書いたものですね。
この勉強はIPAの試験を受験する時にも役立ちました。
パケットの流れをメールの送信で説明する
ネットには物理層という考え方がありますが、それをメールのやり取りの動作で説明しています。
アプリケーション層の仕事(レイヤー7)
人間が、メールソフトを使い、あて先を付け、手紙を作成し、送信する。
この時点で送り元、あて先(CC、BCC含む)、表題、内容、添付ファイルの情報がバラバラになるといけないので、1つにまとめ、下位のプレゼンテーション層に渡される。
プレゼンテーション層の仕事(レイヤー6)
アプリケーション層からやってきた情報はコンピュータ同士で全世界で取り決められたルールに基づき、世界中のコンピュータが理解できるよう変換される。この情報は更に下位のセッション層へ。
セッション層の仕事(レイヤー5)
以上の情報を確実にその下の層に渡すための経路を確保し渡す。
トランスポート層の仕事(レイヤー4)
SMTPという封筒に入っているデータを送り易い大きさに分けなければ、ネットの中を一つのデータが占有してしまうので細かく分ける。これがパケット。
小分けにすることで、ネットワーク全体がスムーズにやり取りできるようになる。
ただ、小分けにしてしまうとあとでくっつけるときにどこにいったかわからなくなるので、小分けにした1つ1つの頭にどのデータの続きのデータかインデックスをつける。
また、このデータの発信元はメールソフトという情報(Port情報)を頭(ヘッダ)に書き加える。これがTCPヘッダ。
で、この小分けにしたデータを封筒に入れる。この封筒がプロトコル。
そしてTCPのプロトコルの封筒を下の層に渡す。
ネットワーク層(レイヤー3)
TCPプロトコルの封筒を送るためにあて先を確定する。
この場合のあて先はメールのあて先ではなく、メールサーバー(SMTPサーバー)であるので注意。メールソフトに設定してあるSMTPサーバー名を読み込んで、それをインターネット上にあるDNSサーバーに問い合わせ、送り先のIPアドレスを取得する。
送り元の情報も必要であるが、それは自分なので問い合わせることは無い。
TCPプロトコルの封筒の頭に送り先IPアドレス、送り元IPアドレスを追加し、IPプロトコルの封筒に入れる。
データリンク層(レイヤー2)
IPアドレスは自由に変更可能なアドレスなので、実際に相手のコンピュータなのか、もしかしたらIPアドレスの引越しのようなことが起きていれば、別のコンピュータに送られてしまう。
そこで、絶対に不変的なアドレスが必要になる。そこで、ネットワークカードそれぞれに、1つ1つ違うMACアドレスというものが存在している。
相手にこのMACアドレスを問い合わせる。世界中、不特定多数のネットワーク装置すべてに対して相手のIPアドレスを送り、該当するIPアドレスの場合、MACアドレスを返信してもらう。それで相手のMACアドレスが確定するので、IPプロトコルの封筒の頭に送り先MACアドレス、送り元MACアドレスを追加し、イーサネットプロトコルの封筒に入れる。
ちなみに、不特定多数すべてに送ることをブロードキャストと言う。
イーサネットのプロトコルの封筒に包めば、あとはネットワークの電線に乗せて送るだけだが、ただ送ると、誰かが通信していたら衝突してしまう。
なので、ネットワーク上に存在するネットワークカードのうち、始めに衝突を検知したカードがすべてのネットワークカードに対し、衝突信号を出して知らせる。
衝突信号を検知したカードのうち、送信していたカードは直ちに送信を停止する。衝突信号は衝突が無くなり止まる。送信を停止したカードはランダムな時間を待って再送する。これを繰り返す。どうやら実験の結果、繰り返し回数は3,4回で済むらしい(本当か?)
物理(フィジカル)層(レイヤー1)
イーサネットのプロトコルの封筒を、決められた速度で、決められた方法(有線か無線か)で送る。
パケットの流れをメールの受信で説明する
メールをサーバーから引き取ってくるまでのデータの流れで説明しています。
まず、送信時の方法で自分のPCからサーバーにメールが無いか問い合わせ。
サーバーはそれに対し、返事を送信時の方法で送信する。その返事のデータの流れを見ます。
物理(フィジカル)層(レイヤー1)
とにかくサーバーや他のネット上のPCからデータがやってくる。
データリンク層(レイヤー2)
サーバーからネットワーク上のコンピュータ全てに対し、荷物を届けるが、その荷物にはMACアドレスが指定してあるので、自分のものでなければ破棄する。
自分のものなら、パケットの末尾に記載されているチェック符号(FCS)にて正常かチェックする。
チェックでエラーであればパケットを捨てる。
正常なら、イーサヘッダ(MACアドレス部)を外し、上位層に渡す。
ネットワーク層(レイヤー3)
IPヘッダ(IPアドレス部)を外す。多分この時点でIPアドレスのチェックはしているのではないだろうか?
トランスポート層(レイヤー4)
TCPヘッダ(データのインデックスとPort番号)を外し、データのインデックスの順番に並べる。
もしかしたら本来後に来るデータが先に来てしまうこともあるかも知れない。
Port番号に従ってデータを渡す。
セッション層(レイヤー5)
Port番号の経路を開き、アプリケーションソフトに渡す。
プレゼンテーション層(レイヤー6)
コンピュータが理解できる情報から人間にわかりやすい情報に変換される。
組み立て、変換されたデータを人間のわかりやすい形にして見せる。
(3通のメールがあります…とか)
パケットのデータの内容
電気を使ったデータの通信は、一度で確実に正確に届くかというと難しいところがあって、たとえばテレビを見ていてもノイズとは入ってしまいますよね。これからの話はそれが背景としてあります。
TCPのプロトコルというのは、データ内容が間違いなく届いたかチェックを行い、また、小分けにしたパケットの順番を整えてくれます。なので、それなりにデータの通信が遅いので、リアルタイム通信や、動画などのやり取りには向いていないです。
そこで、登場するのがUDPのプロトコル。これは、小分けにすることはするけど、送りっぱなし、受けっぱなしのプロトコル。だから早い。うーん、だからWeb見ながら動画見てるとき時々ノイズが入ったり止まったりするのか。納得。
ところで。
厳密にはTCPのプロトコルのデータをTCPセグメント、UDPのプロトコルのデータをUDPデータグラムというらしい。多分使い分けられないな。
どうやってTCPとUDPを使い分けているのか?
TCPとUDPはトランスポート層のお話。で、その下位層であるネットワーク層であるIPのヘッダにトランスポート層のプロトコル番号が記入されているしくみになっています。
ヘッダを含んだフレーム全体を図示するのが一番わかりやすいですが、ちょっと今回はずるしてテキストベースで。縦書きで表します。
プリアンプル
イーサネットデータの始めに必ず送られる同期信号。これからがデータだよと宣言する。
データ長は64bit=8byte
絶対決まっている信号「01010……01011」というように「01」が続き、その間に受信側が
同期を取る。
最後に「11」が続いたところで、次からがフレームデータとして受け取る。
イーサネットヘッダ
プリアンプルに続き送られるもの
あて先のMACアドレス
データ長は48bit=6byte
受信側は、自分以外のあて先のものは破棄する。
送り元のMACアドレス
データ長は48bit=6byte
受信側は、誰からのデータか判断する。
パケット長またはデータタイプ
データ長は16bit=2byte
データタイプって何?
データ
イーサネットヘッダの後は、IPヘッダ、TCPヘッダ(UDPヘッダ)、実際の内容データがデータ本体となる。※後述
もし、このデータの総長さが46byteよりも小さいときは詰め物(パディングという)をし、46byteにする。
もし、総長さが1500byte以上になるときは分割される(ようにTCPやUDPのプロトコルがうまくやってくれるのだろう)。
イーサネットフッタ
FCS(フレームチェックシーケンス)
データ長32bit=4byte
イーサネットのデータの一番最後につく、チェック用のデータ。CRCとも言う。
このデータと実際のデータ内容をある法則に従って求めた値が一致すれば正常に送られたといえる。
コメント