前回に引き続き、tcp(Transmission Control Protocol)の基礎を勉強していきます。
前回の記事はこちら。
tcpの基礎を理解するうえで必要となる、ネットワーク通信の基礎をメインに書いています。
もくじ
1.前回のおさらい
本題に入る前に、前回の内容を簡単に振り返っておく。
・通信は、リレーのような形で行われる
・通信されるデータは、「パケット」に小分けされ、ネットワーク上を進んでいくが、
各パケットは元のデータの形に戻れるように付加情報も持っている
・通信は必ずしも成功するとは限らないため、通信の確実性を保証する必要があり、
確実性担保の役割を担うのが、tcpである
以上を踏まえ、tcpの特徴・仕組みについて、詳細を見ていく。
2.tcpの特徴
tcpでは、主に以下を行うことで、通信の確実性を担保している。
①通信元と通信先で接続(コネクション)を確立したうえで、通信をし始める(3way-handshake)
②通信時のエラーを検出し再送する
③通信時のエラーを回避する
①~③について、以下、順に詳しく見ていく。
3.tcpの特徴① 3ウェイハンドシェイク
tcp通信においては、通信元が通信先に対して通信したいとき、まず最初に、
1.通信元→通信先 通信確立要求(SYN)を送る
2.通信先 1の要求を受け取る(ACK)+自身からも通信確立要求(SYN)を送る
3.通信元 2で通信先から送られてきた要求を受け取る(ACK)。通信開始
という、3つの手順を踏む。
通信元と通信先で接続を予め確立したうえで、本題のデータ通信を開始するのである。
いきなりデータを送り付けても、通信先がそれを受け取れない状態だった場合、
意図した通信が出来ないために、接続を先に確立させている。
上記の3手順は、「3ウェイハンドシェイク」と呼ばれている。
分かりやすく、LI●Eでたとえるならこんな感じだろうか。
このように「tcpの3ウェイハンドシェイク」は、
L●NEで、いきなり電話しても相手の都合が悪いかもしれないので、先に都合を聞くのと似たものだといえそうだ。
4.tcpの特徴② 送信失敗の検出と再送制御
通信データ、すなわちパケットは、インターネット上をリレー形式で進んでいく。(詳しくは前回記事参照)
しかし、インターネット回線にデータが集中するなどの理由で、
一部のパケット伝送が、失敗してしまうことがある。
tcpでは、このような伝送エラーを検出し、伝送に失敗したパケットを、接続先へ再送する機能を備えている。
tcpでは、接続先が、接続元から送られてきた情報を受け取った印として、
応答(ACK)を返すことになっている。
従って、ACKが返ってくれば伝送成功、
返ってこなければ伝送失敗であると判断することができる。(=失敗検出)
パケット送信が失敗したと判断される場合は、該当のパケットを再送することで、
最終的に接続先が正しいデータを受け取れるようにしている。
5.tcpの特徴③ 輻輳制御
先ほども触れたように、通信データはインターネット上を進んでいくが、
行き交うデータが多すぎて、回線がパンクすることがある。
回線がパンクしてしまうことを輻輳(ふくそう)という。
tcpでは、輻輳を発生させることを避けるため、
突然大量のデータを送るのではなく、一度に送るデータの量を徐々に増やしていく仕組みが取られている。
最初はスロースタートし、データ量を増やして様子を見るといったイメージである。
この増える量だが、基本的には倍々ゲームで増えていくことになる。
すなわち、
初回は1つ送信→うまくいったので次は2つ送信→さらにうまくいったので次は4つ送信……
といったように、送られるデータ量は2乗されていく。
もちろん、永久に2乗できるわけではないため、データ量が多いと、
いつかは輻輳が起きて伝送が失敗してしまう。
しかし、もし伝送が失敗した場合でも、
「4.tcpの特徴② 送信失敗の検出と再送制御」で説明したような再送が行われるため、
最終的には(他のエラー等が起こらなければ)無事に全データを相手先に送ることが可能となる。
また、伝送が失敗したということは、失敗時の送信データ量では輻輳が起きるということだと考えられる。
tcpでは、輻輳が起きた際のデータ量を閾値として動的に捉え、
失敗後の再送や、残りのデータ伝送では、その閾値を超えない量までを送るように制御が働く。
何度も再送することになっては伝送効率が悪い一方、
ネットワークの混戦状態は都度変化していくため、データ通信毎に、動的に閾値を設定する仕組みとなっているのである。
6.参考サイト
以下サイト様、非常に分かりやすく勉強になりましたm(__)m
https://employment.en-japan.com/engineerhub/entry/2020/02/13/103000
次回、tcpシリーズラストは、
実際にネットワークを流れる際の、tcp制御によるパケットの様子を見る方法(tcpdump)について、
確認したいと思います!