TCP/IPの話をしようとして、IP(レイヤー3)についてはざっくりとお話してみました。
今回からレイヤー4に入りたいのですが、それがTCP/IPの前の方、TCPとなります。
ただ、掲題に挙げたUDPというのもあるのでそちらも合わせて少しだけ説明しておきます。
TCPの特徴は「コネクションの確立」といえます。
電話をかける時、「もしもし、俺だよ俺」って言いますよね。
そこで「ああ、○○だね、なんか用かい。」と返すとコネクションが確立します。
つまり通信において相手側にいきなりデータを送りつけるのではなく、
A)「通信していいですか」
B)「いいですよ。こういう形式で送ってください。」
A)「わかりました」
というやり取りが発生します。
これを「3way-handshake」と呼びます。
「通信していいですか」=SYN
「いいですよ。こういう形式で送ってください。」=ACK+SYN
「わかりました」=ACK
このACKとかSYNは、サインだと思ってください。
転送許可要求がSYN、転送許可がACK
ちょっと専門的になっちゃうかもですが、パケットのキャプチャなどをおこなうと必ず直面するので絶対に覚えておいたほうがいいと思います。
★障害調査でパケットキャプチャなど行う場合は、NACK(拒否)も覚えておくといいでしょうね。
もう少し詳しくみていきましょう。
ホストA、Bの状態を表す用語とともに理解しましょう。
・初期状態
A)状態:Close
B)状態:Listen
★LISTENは待ち受けている状態を示す
・AからSYNが送信される
A)状態:SYN_SENT
B)状態:LISTEN
★AはSYNを送ったのでSYN_SENTに状態遷移する
・BがACK+SYNを返す
A)状態:SYN_SENT
B)状態:SYN_RCV
★BはSYNを受け取ったのでSYN_RCVに状態遷移する
・AがACKを返す
A)状態:ESTABLISHED
B)状態:SYN_RCV
★AはACK+SYNを受け取ったのでESTABLISHEDに状態遷移する
・BがACKを受け取る
A)状態:ESTABLISHED
B)状態:ESTABLISHED
★BもACKを受け取ったのでESTABLISHEDに状態遷移する
実際のデータが送信される前にこれらのやり取りが発生します。
こうすることで確実性を高めているわけですね
また、データ通信を終了する際には、FINというサインを送ります。
パケットをキャプチャして障害調査などする際には上記の内容によく慣れているといいですね。
ほかにも機能があるのですが、例えば「再送要求」というようなものもあります。
これが割と重要で、無線環境でパケットのロスがたまにあるとか、ケーブルが破損しててたまにパケットが届かないとか発生すると、「○○番まではデータ受け取ったので△△番からのパケットをもう一度ください」といった処理も行っています。
さて、上記でTCPの素晴らしさを説いたうえで、それらの手続きがあまり意味を産まないシチュエーションについてお話しましょう。
例えばIP電話や動画ストリーミングなど。
ひとつやふたつ、パケットを取りこぼしたとしましょう。
ここで、再送要求をして何になります?
そう、もう刻は過ぎ去ってしまっているのでいまさらパケットをもらっても意味がないのです。
それよりも、そんな煩雑な手続きをするくらいならどんどんパケットを送ってほしい。
つまり、通信の内容によってはTCPの利点が利点でなくなる場合があるのですね。
そういうときにはUDPを使用します。
取りこぼしちゃってももういいや、どんどん送ってね
というときはUDPだと思ってください。
TCPとUDP、まだまだ語り尽くせない部分があるのですけど、このあたりで次へ