【NW基礎】tcpについて理解を深める② | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

前回に引き続き、tcp(Transmission Control Protocol)の基礎を勉強していきます。

 

前回の記事はこちら。

tcpの基礎を理解するうえで必要となる、ネットワーク通信の基礎をメインに書いています。

 

 

もくじ

 1.前回のおさらい

 2.tcpの特徴

 3.tcpの特徴① 3ウェイハンドシェイク

 4.tcpの特徴② 送信失敗の検出と再送制御

 5.tcpの特徴③ 輻輳制御

 6.今回のまとめ、参考サイト

 

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)について、

確認したいと思います!