iPhoneからC言語を使ってTCP通信してみる、その1「TCP通信の流れ」

www.101010.fun

前回、UDP通信をやってみて、以外にも簡単にできるということがわかった。この調子でTCP通信もやってみようと思ったがけっこう複雑で、前提知識が必要そうである。そこで、プログラミングの前に、勉強がてら予習記事を書くことにする。

TCP通信の流れ

さっそくTCPをググってみると、このような図がたくさん出てくる。

f:id:araemonz:20181129140655j:plain

大きく3つの流れ(シーケンス)に別れるようだ。

  1. コネクションの確立
  2. データ送信
  3. コネクションの解放

実際のデータを送るまでに、1と3のコネクション処理が出てくる。

つまり挨拶から始まり、さよならの挨拶で終わる。

まるで、人間のコミュニケーションの様なプロトコルだ。ちなみにプロトコルとは「取り決め」とか、「約束ごと」のようなものである。

プロトコルを決めないと、機械だって人間だって会話できないのだ。

UDPは、User Datagram Protocolの略で、Datagramは、届くかどうかは保証されないっすよ、ということだった。

それに対して、TCPはTransmission Control Protocolの略。Transmissionは送信だから、送信状態を管理できるプロトコルでっせ!ってことなのだろう。一方向的なUDPとは違って、TCPはかなりお行儀が良いことがわる。

しかし、TCP通信に出てくる、SYN、ACKってナンジャラホイ?って感じだ。

記号 意味
SYN Synchronize
ACK Acknowledge
FIN Final

いまいちピンと来ない。

記号 意味
SYN 送ってもいいかな?
ACK おっけー
FIN 終わるねー

このように読み替えたら分かりやすくなった。

TCPパケットの構造だ。UDPパケットよりは複雑になっているが、ポイントを抑えればきっと誰でも理解できるはず。

f:id:araemonz:20181129140651j:plain

まずパケットをみると、先ほどのACKやSYNというのはTCPパケットのコントロールフラグ部に入っている。

なるほど、所詮は1ビット単位の0か1のフラグなので大したことではないな。送信元ポートや送信先ポートはUDPでも出てきたのでおkだ。どうもシーケンス番号とシーケンスACK番号(確認応答番号)がTCP通信では鍵を握るらしい。

大雑把にTCP通信のイメージがわかったところで、次は最初の「コネクションの確立」つまり、「3ウェイハンドシェイク」のやり取りを詳しく見ていくことにしよう。

www.101010.fun