平文のTCP/IPにおいて転送されたデータの信頼性を期待してはいけない

TL;DR 平文のTCP/IPの通信では送信したデータの完全性は期待できないので、経路にはSSL/TLSを使いましょう

 

TCP/IPUDPと違い、信頼性のある通信を実現するためのプロトコルという説明がよくされる。なのでTCP/IPでやり取りしたデータは1bitの狂いもなく転送先に届くと思われがちだ。TCP/IPが信頼性のある通信を確保してると言われているのは下記の理由による。

 

1. データが届かなかった場合の再送処理がプロトコルに入っている
2. TCPパケットにペイロードチェックサムがあり、不具合が検知されると修正もしくは再送される(ただし16bit)
3. IP層の更に下の層にチェックサムがあり、不具合が検知されると修正もしくは再送される(イーサの場合32bit)

 

しかしチェックサムはそれぞれ16/32bitのため、昨今の超大量データを取り扱うにはかなり心もとない。

 

1. ざっくり1600万〜100億パケットに1回の確率で検知できないエラー(データ化け)が起き得る

When the CRC and TCP checksum disagree


2.  数百ギガバイトのインターネット経由の転送でデータ化け

2005-01-30 - 登 大遊@筑波大学大学院コンピュータサイエンス専攻の SoftEther VPN 日記

 

10年ほど前はIPより下の層は技術向上によりどんどん信頼性が増すものだと思っていたけど、技術革新が故にモバイルや衛星間通信など今まで信頼性を確保できなかった領域に物理層が拡充するようになってきて大分怪しくなってきたと思う。

 

というわけで平文のTCP/IPにおいて転送されたデータの信頼性を期待してはいけないことは理解してもらえたと思う。ではどうすればいいか?その答えはSSLを噛ませば良い。


SSLは暗号化の技術なのになんでデータの信頼性に関係あるの?」と思うかもしれない。SSLには暗号化を行って第三者からデータを秘匿する機能の他に第三者によるデータ改ざんを防止する機能もある。

データ改ざんの防止

→データが改ざんされることなく届く

→データの信頼性の確保ができる

 というわけだ。TCP/IPの上位にさらに改ざん防止がつくためTCP/IPとは比べ物にならない信頼性を確保できる。

 

# SSLの改ざんに対する強度についてはちょっと力尽きました。誰か教えて。。

 

今回職場でストリーミング処理基盤の話をしている際、違うチームで同じ話になったり、いくつかのストリーミング処理基板の初期実装で転送部分がSSL非対応だったりしたので、もしかしたらこれは一般的に知られてる話ではないのかもしれない。

 

 「インターネット越しの通信は盗聴がやばいからSSLにしとこう」ということでSSLにしといたので意図せずデータが救われてるケースもあるが、データセンター間の専用線の場合「秘匿の必要がないから平文で大丈夫」と考えるのはとても危険な考え方だと思う。

 

莫大なデータをやり取りするようになった昨今、TCP/IPは信頼できると無邪気にインターネット越しにデータ転送してたら実はデータが壊れてたみたいな話は今後ありそうなので、気をつけていきたい。

(おしまい)