コネクション型通信の長所、短所
リンク元をみると、「コネクション型通信 長所」でyahoo検索してここに来る人が多数。理由は不明だが興味深いのでもう少し詳しく書いてみる。
コネクション型通信の長所
以前に述べたことの焼き直しになるが、コネクション型通信最大の長所はその場でデータが相手に届いたかどうかが確認できる点にある。
コネクションを確立することで相手が通信可能な状態にいることが確認でき、さらにデータを送ればちゃんと届いた旨を示す返答がくる。信頼性の高い通信が実現できるわけだ。
仮に何らかの理由でデータが届かなかったときにも、一定時間相手からの返答がない、あるいはデータが来ないむねの要求がなされ、送信に失敗したことを認識できる。
また、相手ノードが通信途中にダウンして受信不能になった場合もちゃんとそれに気がつくことができる。返答があることを前提に機能しているため「応答無し=異常」と認識できるわけだ。
この辺の高信頼性がコネクション型通信の長所といったところか。
(せっかくなので別の単語にも対応できるようにしておこう。コネクション型通信のメリット。コネクション通信の長所。コネクション型通信の利点。コネクション型通信の特徴あるいは特長。)
コネクション型通信の短所
一方で、当然長所があれば短所もある。
まず最初に挙げられる短所は通信量が増大することである。すべての通信に対して返答をがあること前提に設計すると言うことは、逆に言えば2倍の通信量が発生するということである。(ただし、ここで言う「2倍の通信量」とは通信される"データ量"ではなく、通信"回数"であることに注意。返答はほとんどの場合転送されるデータそのものよりサイズが小さいので。通信環境にもよりますが・・・)
また、データ転送以外のプロセスが発生するため、その分速度が低下するのも欠点である。コネクションを確立するまでの時間、返答をするまでの時間、返答を待つ時間、コネクションを解放(通信を終了)する時間、コネクション無しの通信なら存在すらしないタイムロスが多々発生する。(もちろん、これらを可能な限り短くするための工夫は随所に凝らされていますが、構造上ゼロにはできませんので。)
あとは、データの送受信以外の機能を実装する必要が生じるって点も短所といえるかもしれない。コネクションを確立する機能や返答の送受信を確認する機能など、これまた、コネクションを確立しないなら実装しなくて済むわけだから。
(そして例によって コネクション型通信の短所、欠点、弱点、問題点)
コネクションレス型通信の長所
続いて、コネクションレス型通信に移りますよう。
コネクションレス型通信の長所はコネクション型通信の短所を裏返したものになります。
すなわち、コネクション確立に要する様々なロスをすべてカットできるということ。
返答を待たずどんどんデータを送れますから通信速度が(コネクション型通信と比べて)向上しますし、「コネクション確立」とそれに付随する余計なプロセスに時間や処理をとられずに済みます。
シンプルかつ高速。これがコネクションレス型通信の長所ですね。
コネクションレス型通信の短所
同様に、コネクション型通信の長所が裏返ればコネクションレス型通信の短所になります。
相手に対する確認を一切とらないので、データが途中で喪失しても気づきませんし、そもそも相手が通信可能な状態になくてもわからない。(ケーブルが抜けていた、電源が落ちていたなどの致命的な状況でもわからないわけです)
その点で信頼性はかなり低いといえるかもしれません。
ゆえに別の方法で送受信の成功・失敗を確認する必要が出てくる場合が多いです。(実用上は、より上位のプロトコル――アプリケーションなどが確認の役割を担います。)
2つの通信方式のうちどちらを使うべきか
さて、そういうわけで対照的な2つの方式が出てきました。
実はどちらもインターネット、TCP/IPに限らず通信という営みが始まった頃から存在しています。(普通郵便やのろしはコネクションレス。電話や手旗通信はコネクション型です。さらに言えば日常会話もある意味コネクション型通信かもしれません。)
長年相反する2つが共存していると言うことは、どちらが優れている、どちらが劣っているという議論は不毛で、いわゆる、「状況に応じてそれぞれを選ぶ」ことが大事だということを示唆しています。
まあ早い話「確実性ではコネクション型通信」、「簡略さと速度ではコネクションレス型通信」なわけですが、それだけが結論ではおもしろくない。というわけでここでは、少し異なる視点でも考えてみようと思います。
2方式の関係
なお、ここからは筆者の私見で、文献とかから引っ張ってきてる知識じゃないのであまり信頼しない方がいいかもしれません。あくまで、「筆者個人の解釈」として読んでください。
で、結論から言うと、(過去の様々な通信手段はともかく)「現在のデータ通信においては、この2方式は見方によってどちらにも解釈でき、明確に分離はできない」ってことです。
うまい表現が見つからなかったので意味不明かもしれませんが、現在のデータ通信において「完全に純粋なコネクション型通信」ってのが存在しないということだと思ってくださればたぶん合ってます。
というのは、すべての通信においてコネクションを確立するとしたら、「コネクションを確立するための通信のためのコネクション」が必要になり、そのまたコネクションを・・・と無限にコネクションが必要になってしまうわけです。(返答についても同様。返答を受け取ったという返答をして、そのまた返答を・・・)つまり、コネクション通信もそれぞれのデータ転送を切り離して見るとコネクションレス型通信な訳です。
逆に、コネクションレス型通信も同様に、返答を一切求めない通信なんて滅多にないわけです。(大学の講義とかSPAMとか、怪しいのはありますが・・・)一般にコネクションレス型通信のUDPが使われる通信だって、(先の短所の項で述べたとおり)実際はアプリケーションとかが自前でコネクションを確立してたりする場合がほとんどな訳です。あるいは、現実社会でコネクションが確立されているという見方もあります。(ここまでくるといささか強引ですが、理屈としては人と人との通信を下位のデータ通信で実現しているという見方は階層構造の一例としてアリだと思います)
要は、解釈するレベルによって、同じ通信方式がコネクション型にもコネクションレス型にもなると言うことです。
実際、今回は主にTCPとUDPという「トランスポート層のプロトコル」においてどちらの方式なのかかを中心に意識して書いています。一つ下位のデータリンク層で考えれば(TCPを採用しているものも含めて)多くの通信がコネクションレス型になりますし(IPがコネクションレス型なので)、逆に最上位のアプリケーション層であれば、(UDPを採用した通信も含めて)多くがコネクション型と解釈できます。(セッション層とプレゼンテーション層は勉強不足故言及できません。ごめんなさい)
2方式という表現が誤解を招いているようにも思えますが、これらは「通信方法の違い」というより、「あるレベルの動作でコネクションの確立がなされているかどうか」の議論だと思うのが適切なのかもしれません。
と、だんだん話が実用レベルを離れて概念的な方向にシフトしているのでこの辺でやめておきますが、開発時のアプローチとして「どちらを選ぶか」ではなく「どこで何を実装するか」という方向の方がよりTCP/IPとかの設計思想に即している気がしたので、ちょっとこういうことを考えてみました。
どうでもいいんですが、こういう(自分の勝手な解釈の)話を誰かにするとたいてい2,3日後によりスマートでより実際的な、同じアプローチの文献が見つかるんですよね…。方向性が正しいことが証明されたと喜ぶべきなのか、今回も凡庸な発想だったと反省すべきなのか、解釈は難しいところですが。