目次
TCPの動作の流れ
TCPでアプリケーションプロトコルのデータを送受信する流れについて見ていきましょう。
- TCPコネクションの確立
- TCPでのデータの分割(アプリケーションのデータの送信)
- TCPでのデータ受信の確認
- TCPコネクションの切断
TCPコネクションの確立
TCPを利用しているアプリケーションプロトコルは、アプリケーションのデータを転送するときにTCPコネクションを確立します。データを転送する前に、アプリケーション間のデータの転送がきちんとできることを確認しています。また、コネクションの確立のときに初期のシーケンス番号やデータを分割する単位であるMSSを決めています。
TCPコネクションの確立は3つの手順で行うことから3ウェイハンドシェイクと呼びます。
- クライアントアプリケーションからコネクション確立の要求を送信します。(SYNフラグ)
- コネクション要求に応答するとともにサーバアプリケーションからもコネクション確立の要求を送信します。(SYN/ACKフラグ)
- サーバアプリケーションからのコネクション要求に応答して、クライアントアプリケーションとサーバアプリケーション間の双方向のTCPコネクションが確立します。(ACKフラグ)
TCPでのデータの分割
TCPにはデータの分割機能もあります。TCPでアプリケーションのデータを分割する単位をMSS(Maximum Segment Size)と呼びます。MSSを超えるサイズのデータはMSSごとに分割して送信します。MSSの標準的なサイズは1460バイトです。ほとんどのアプリケーションのデータはMSSよりも大きいので、TCPで分割されて転送されます。
Webアクセスの際のWebサーバアプリケーションからWebサイトのデータを送信する場合について、TCPで分割する様子を考えます。アプリケーションプロトコルとしてHTTPを利用するのでWebサイトのデータにHTTPヘッダが付加されます。これがTCPにとってのデータです。MSSごとに分割してそれぞれにTCPヘッダを付加して複数のTCPセグメントとします。元のデータをどのように分割しているかは、TCPヘッダ内のシーケンス番号を見るとわかります。
TCPのMSSの標準的なサイズが1460バイトとなっているのは、ネットワークインタフェース層にイーサネットを利用していることが多いからです。イーサネットでは1つのフレームで送信できるデータのサイズの最大値であるMTUは1500バイトです。イーサネットのMTUにおさまるように、TCPのMSSが1460バイトとなっています。TCPヘッダは20バイトでさらにIPヘッダの20バイトが付加されたものがイーサネットにとってのデータです。1500バイトからIPヘッダ20バイトとTCPヘッダ20バイトを引いて、MSSを1460バイトとしています。
TCPでのデータ受信の確認
TCPで正しくデータを受信できたことを表すのがACK番号です。ACK番号は次にまっているデータ(TCPセグメント)のシーケンス番号です。
サーバアプリケーションからシーケンス番号1000で1460バイトのデータを転送した場合を考えます。クライアントアプリケーションは、データを受信できたことを知らせるためをACK番号2460(1000+1460)としてサーバアプリケーションへ送信します。これは、「次はシーケンス番号2460になっているデータを待っています」という意味です。そして、サーバアプリケーションはシーケンス番号2460で次のデータを送ります。次のデータのサイズが1460バイトとすると、クライアントアプリケーションは確認としてACK番号3920で返します。
以上のように、ACK番号によって正しくデータを受信したことを確認することで信頼性の高いアプリケーション間のデータ転送ができるようにしています。ただし、1つのデータを送って確認してから次のデータを送る・・・とすると、効率がよくありません。そのため、実際には1つのデータごとに確認をしているわけではなく、複数のデータを一括して転送して、確認も一括して行っています。
TCPコネクションの切断
TCPでアプリケーションのデータの送受信がすべて完了したら、TCPコネクションを切断します。TCPコネクションは双方向で確立していて、双方向のTCPコネクションを4つのステップで切断します。TCPコネクションの切断要求を表しているのがFINフラグです。
サーバアプリケーション側からTCPコネクションを切断する様子を見ていきます。
- サーバアプリケーションのデータの送信がすべて完了するとコネクション切断要求を送信します。
- クライアントアプリケーションは切断要求に応答します。
- クライアントアプリケーションからコネクション切断要求を送信します。
- サーバアプリケーションは切断要求に応答します
コネクションの切断に4つのステップを踏んでいるのは、データの送信処理や受信処理が確実に完了していることを確認するためです。コネクションの切断要求ですぐに双方向のコネクションを切断してしまうと、送信するべきデータや受信するべきデータの処理がきちんと完了できていない可能性があります。そこで、4つのステップを踏んで、少し時間をかけてTCPコネクションの切断処理を行うようにしています。
なお、通常のTCPコネクションの切断はこの4ステップですが、強制的にTCPコネクションを切断することもできます。強制的なTCPコネクションの切断を行うときに、RSTフラグを利用します。
TCP/IP
- TCP/IPの階層
- IP(Internet Protocol) ~データを送り届ける~
- ICMP ~きちんとIPで転送できますか?~
- Ping ~きちんとデータは届きますか?~
- Windows OSのPingコマンド
- トレースルート ~データはどのルータを通っていますか?~
- tracertコマンド(Windows OS)
- ICMPリダイレクト
- トラブルはどこ? ~Pingとトレースルート~
- ARP ~IPアドレスとMACアドレスを対応付け~
- ARPフォーマット
- Gratuitous ARP(GARP)
- ポート番号 ~どのアプリケーションのデータなの?
- TCPの概要
- TCPの動作
- UDPの概要
- アプリケーションのデータが届くまでのまとめ
- DNS ~宛先IPアドレスを求める~
- nslookupコマンド ~DNSの名前解決の確認~
- DHCP ~IPアドレスを自動割り当て~
- Cisco IOS DHCPサーバの設定と確認コマンド
- Ciscoルータ DHCPサーバの設定例
- DHCPリレーエージェント
- DHCPリレーエージェントの設定例[Cisco]
- DHCPサーバ配置のまとめ
- TCP/IPの設定のまとめ
- ipconfigコマンド ~Windows OSのTCP/IP設定を確認~
- Linux(Ubuntu)でのTCP/IP設定の確認コマンド
- Webサイト
- HTMLとCSS ~Webページを作る~
- URL ~Webサイト(Webページ)のアドレス~
- HTTP ~HTMLファイルを転送する~
- Webアプリケーション ~Webブラウザだけあればいい~
- HTTP Cookie
- Webアプリケーションのセッション管理
- Webプロキシサーバ ~Webアクセスを代わりに~
- Webアクセスのまとめ
- 電子メール
- SMTP ~電子メール送信用プロトコル~
- POP3 ~メール受信用プロトコル~
- IMAP4 ~メールサーバ上でメールを管理~
- 電子メールのまとめ
- FTP ~代表的なファイル転送プロトコル~
- TFTP ~簡易的なファイル転送プロトコル~
- Windows10/11のTFTPクライアント
- ネットワークのトラブルの切り分け手順