no-image

TCPとUDPの特徴をざっくり知る

勉強会でTCPとUDPの違いについて発表したのでまとめます。

【参考】ざっくりTCP/UDP

 

4階層のTCP/IPモデル

アプセトネデブで有名な7層のOSI参照モデルとは異なり、TCP/IPモデルは4層のレイヤーアーキテクチャです。
OSI参照モデルよりも前に構築されたもので、TCP/IPプロトコルはこのモデルに沿っています。

レイヤーの名称 用途 代表的なプロトコル コンピュータ上の処理
アプリケーション層 アプリケーション間のやりとり HTTP/FTP/SMTP 通信アプリケーションプログラム
トランスポート層 プログラム間の通信、通信の制御 TCP/UDP/QUIC  OS
インターネット層 インターネットワークでの通信 IP OS
ネットワークインターフェース層 同一ネットワーク上での通信 WiFi, Ethernet デバイスドライバ、NIC

【参考】TCP/IP 4階層モデルとは? | Think IT(シンクイット)

今回見ていくTCP/UDPも同じトランスポート層で動作するプロトコルです。

TCPとは、信頼性の高いコネクション型のプロトコル

TCPとは「Transmission Control Protocol」の略で、以下のような特徴があります。

 

  • 信頼性が高い
  • 1対1の通信
  • 比較的低速
  • ステートレス性

TCPは1対1でコネクションをつないでデータのやり取りをします。
TCPはヘッダが大きかったり接続時の手続きなど、プロトコル上のオーバーヘッドがあるため比較的低速です。
また、TCPはHTTPと同様にステートレス性のプロトコルです。

「信頼性が高い」については後述しますが、まずはTCPの接続時の手順を見てみます。

TCPの接続手順

TCPの接続時は「3 way handshake」という3ステップの手順を踏みます。
TCPのヘッダにはフラグを格納する部分があり、これを利用して「SYN」や「ACK」などの信号をやり取りします。

  1. クライアントがサーバーにSYNパケットを送信
  2. サーバーは、それを了承するACKと、サーバー側からのSYNを一緒に送信
  3. クライアントはサーバーから送られてきたSYNに対するACKを返す

これで1対1の通信を確立し、その後データのやりとりができます。

【画像引用元】Networking 101: Building Blocks of TCP – High Performance Browser Networking (O’Reilly)

ちなみにSYNとは「synchronize(同期)」のことで、ACKは「acknowledgement(了承)」の略です。

「信頼性が高い」とは

さきほど見た「信頼性が高い」という特徴は、「送信したデータが送信した順番に確実に相手に届く」ことを保証することを指します。

一見すると、それで当たり前と思ってしまいますが、通信間には様々なトラブルが起こりうるので簡単なことではありません。

例えば、ネットワークの混雑による通信の遅延が起きたり、通信途中にエラーで化けたり、ハード的なリソース不足でデータそのものが破壊されたりなどです。

TCPでは、こういったトラブルが途中で起きても確実にデータを届けるための機能が実装されています。

今回はその機能の中から再送制御、ウィンドウ制御、フロー制御について簡単に見てみます。

再送制御

さきほどの接続手順時に見たように、受信側はデータを受け取ったことを送信者に伝えるためにACKフラグを返します。

送信側から見れば、自分がデータを送った後にACKが一定時間内に返ってくれば届いたことがわかります。
しかし、何らかのトラブルでデータが上手く届かなかったときはACKが返ってこないので送信に失敗したことがわかります。

その場合は、データを再送信し、確実に届くまで繰り返します。

こういった処理のことを再送制御と呼びます。

ウィンドウ制御

1つのデータを送るたびにACKなどの受信確認フラグが返ってくるのを待っていては時間がかかりすぎます。

そこで、ある程度の量のデータを一つにまとめて送信し、それに対して一つの受信確認フラグを受け取ります。

一度に送る量は自分で設定することができ、これのことをウィンドウサイズといいます。

こういった処理のことをウィンドウ制御と呼びます

フロー制御

一つのまとまりで受信したデータが大きすぎたり、たくさんのデータが届き受信側の負荷が高まり処理しきれなくなったときは、送信側に「ちょっとしんどいんでこれくらいデータ減らしてくれへん?」とウィンドウサイズを伝えます。

たとえば、ここで「0」と伝えれば、新たにデータを送るべきでないという合図になります。

そして、処理を進め余裕が出てきたら再びウィンドウサイズを大きくしその値を伝えます。

こういった処理のことをフロー制御と呼びます。

TCPの用途

以下のような普段よく使うプロトコルはTCP上のものです。

 

  • World Wide Web
  • 電子メール
  • FTP
  • HTTP
  • Telnet
  • SSH

UDPとは、信頼性の低いコネクションレス型のプロトコル

次はUDPについてです。
UDPは「User Datagram Protocol」の略で、以下のような特徴があります。

 

  • 信頼性が低い
  • 一対多
  • 高速性、リアルタイム性
  • ステートフル性

UDPはTCPの対になるような特徴が多いのがわかります。
「信頼性が低い」という特徴通り、送信したデータが確実に相手に届いたかどうかの確認はしません。

また、3 way handshakeのような接続時の手順も踏まず、一対多の通信ができます。

ネットワーク上でのパケット検証もしなかったり、ヘッダが小さかったりすることで、高速に通信することができます。

Googleが新たに作っているプロトコルであるQUICもUDPをベースに開発されています。 

UDPの用途

UDPでは、前述したような特徴を持つことから以下のようなことに用いられます。

 

  • DNS
  • DHCP
  • NTP
  • SNMP

わかりやすい例でいうと、音声や動画のストリーミングサービスなどで使われています。

人間の耳では判断できないくらいの微量の音が飛んだことは気にせずに、それよりも音が途切れずに流れ続けることを重視します。

TCPとUDPの比較

ここからはネタですが、TCPとUDPの通信の仕方は、「恋人間の会話」と「夫婦間の会話」によく例えられます。

TCPの場合、相手の返事を確認してから自分の要件を話します。

 

一方、夫婦間は、相手の返事は気にせず、自分の要件を発信し続けます。切ないですね・・・。

ラインの会話風画像はこのサイトで作りました。

まとめと所感

TCPとUDPの比較をざっくり見ていきました。
信頼性のあるTCPと、それ以外の部分の性能を保ったUDP。

少し前まではアプリケーション層のHTTPなどを調べ、やっとトランスポート層まで降りてきたという感じがします。

これより下のIPや、Ethernetはまだ全然わからないですが、どこかのタイミングで調べてみたいと思います。

参考