SMSって何ぞや

一部界隈ではSNSより当たり前の通信サービス SMS (Short Message Service) ですが、
「そもそも、それって何？」をわざわざ書いている記事が少ないっぽいので[^1]
Qiita のイベント「この記事誰得？」に乗っかって書いてみます。

[^1]: そりゃ需要がないからでしょう。わかる。


# 記事の概略

SMS が生まれ、流行り、そして現在も使われ続けている理由や経緯を話しています。
SMS のプロトコルとかレイヤー構造とかGSM 7bit default alphabetとかWAP Pushとかは、今回は書いていません[^2]。
需要があったら、別途、書きます。

[^2]:力尽きたので。


# SMSは1990年代の技術

いまや5Gだ、いや田舎はまだまだ4Gだって話ですが、
SMSが組み込まれたのは **2G** の携帯電話網です。

2Gにはいろいろ種類がありまして、
残念ながら日本で使われていたPDCってやつは日本限定で[^3]
世界的には **GSM** っていう方式が大流行しました。

[^3]:movaってサービス、知っている人いますか。

この GSM、実は「音声通信」すなわち電話しか対応していません。
インターネットに繋がるパケット通信 (データ通信) は GPRS という後付けオプションになっています。

日本に生まれ育った皆さんは、メッセージを送るなら多分、
某アプリ、某SNS、Eメールなんかを思い浮かべると思うのですが[^4]
その辺は全部パケット通信です。
音声通話＝電話もパケット通信にしてしまった4G以降は SMS も勿論パケット通信になっていますが、
3G以前は、電話と同じ仕組みで動く、かなり特殊なmessagingでした。

[^4]:ポケベルを思い出したアナタはすごい。けど、それとSMSはまったく別のサービスです。
ポケベルは Pager と呼ばれる専用サービスで、SMSと違うのは、端末からメッセージを送れない (単方向通信) ことです。

なんでそうなったかというと...
そもそも、世界的にパケット通信できる携帯電話網がなかった時代に始まっているからです。

前述のとおり、世界の大半ではGSMが使われましたが、
GPRSの登場はそれより遅かった　＆　人のあまりいない地域には導入されませんでした。
アメリカの砂漠とか、ヨーロッパの山岳地帯とかでは、GSMしか繋がらない、という期間が長かったのです。

もう1つは、当時の回線スピードの遅さです。
GSM網で音声データ (つまり、会話の声) を送るスピードは、初期で **9.6kbps**。
改善に改善を重ねて、他の利用者の帯域を奪ってでも[^5]、345.6kps。
実際には、どう頑張っても **ISDNよりずっと遅い** のです。

[^5]:事業者として、そんなことしたら非常に不利益なので、実際にサービスとして提供されたことはないらしい。知らんけど。

そんな回線で、テキストベース＝データ量デカいEメールを、音声通話と一緒に送受信できるわけ、ないんです。

なので、ヨーロッパの技術者は全員「インターネットはインターネット。携帯電話網は携帯電話網」と考えました。
で、携帯電話網にぴったりなサービスを考えて[^6]、できあがったのがSMSです。

[^6]:Eメールの代わりのサービスが考えられたのと同じように、HTMLで書かれたWebサイトと同じようなものを、データ量少なく通信できないかなーと考えられたのがWAPです。
iモード時代、iモード対応Webサイトは特殊な書き方をしないとダメでした。それと同じ発想ですが、WAPはHTTP/TCPから置き換えちゃう強者です。

もし、SMSのプロトコルやメッセージ構造を理解しよう、というのであれば、
このテクノロジーは以下2点の解決が至上命題だったということを覚えておいてください。
* ネットワーク回線がとても遅い (通信速度が出ない)
* ネットワークリソースがとても少ない (同時接続数が限られる) 

# SMSが流行った理由

:::note info
知らんけど。
という免罪符を置いときます。
:::

もちろん、GSMの普及が一番大きいのでしょうが、
それだけで 5G の時代まで生き延びるはずがありません[^7]。

[^7]:というか、4Gで音声通話もデータ通信に切り替わるときに、SMSは捨てられると思ってたんですよー。
まさかSIPメッセージのbodyにTPパケットを丸まま乗せて解決するとは思わなかったー。
ほんと、なんでそこまでするのー!? て叫んだ。

技術的に一番大きかったのが
「音声通話と同じ仕組み」
を採用したからだと思います。

携帯電話でも固定電話でも、とにかく音声の電話がかかってくるときと
Eメールを受信するときで、まっったく違うことって何かわかりますか。
答えは「Push型かPull型か」です。

釈迦に説法ですが、
Eメールは、クライアントが定期的にサーバに「新しいメールない？」て問い合わせています。
この問い合わせ、回線がよわよわなGSM時代には「絶許」です。

なのでSMSは、電話がかかってくるときと同じ仕組みを使って、
サーバにメッセージが届いたら
ネットワーク側から、一方的に、端末に新しいメッセージを送りつけます。

無駄な通信発生しないし、
ポーリングよりリアルタイム性高いし、
**最高やん！！！**

そう、最高すぎたんです...。

はじめ、ユーザが短文を送受信するだけのサービスだったSMSですが、
すぐに利用が拡大していきました[^8]。
留守番電話サービスで「伝言お預かりしています」の通知に使われたり、
携帯電話網でEメールみたいなことするMMSというサービスの「新着あります」通知に使われたり、
OMAってとこが決めたDRM規格の、購入者に権限を送りつける方法として使われたり、
とある会社の独自サービスのアプリにデータを送りつける方法として使われたり、
たり、たり、たり....

[^8]:これに伴いSMS規格も改版されて、バイナリデータが送れるようになったり、
EMSというちょっとしたEnhancedが生まれたり、扱える文字コードが増えたりしました。

3G、4Gと回線が強くなって
「インターネットで良いやん」という場面が増えても
既存サービスとの互換性のためSMSは生き残りました。
それだけでなく。
ちょっとしたテキストを送れば良いだけなら、確かにSMSのが便利だし安い。
そんな理由で、インターネットサービスの認証等、新規にSMSが使われる場面は微増していきました。

さらに、IoTを利用場面の1つとする5G時代が来て。
通信量が少ない＝**省電力**なSMSは、再び、強いサービスになったのです。

繰り返しになりますが、GSMのカバー地域はとても広かったです。
この中で3～5Gに移行した地域も多いですが、SMSは **ほぼ変わることなく**
W-CDMA (3G) や 4G、5G規格に含まれています。
いまだ2G網を使っている地域もあるようですが、それはGSMです。
つまり「携帯電話が繋がるところではSMSが使える」のです。

さらに5Gは「ローカル5G」「プライベート5G」というものがあります。
4Gまではキャリアの電波が届かないところや、回線契約がない端末ではSMSが送れませんでしたが、
5Gでは、うまく組めば、
電波の届かない工場で動く数十台のロボットの情報を、SMSで、東京本社の監視センターに送る
ということができるのです[^9]。

[^9]:IoT系のオンラインセミナーとかで頻出する事例ですね～。
そういうシステムの詳細は、私はさっぱりわかりません。

し　か　も。
GSMやSMSのプロトコルスタックは、いまやOSSで転がっています[^10]。

[^10]:使ったことないですけれど。

SMSはもはや、HTTPと同じぐらい、捨てられないプロトコルになってしまったのです[^11]。
考案者のマッコネン氏は、こんな未来を予想していたんでしょうか[^12]。

[^11]:言い過ぎ？言い過ぎじゃないと思うなあ...。
[^12]:2015年に亡くなったそうなので、5G　&　IoT の隆盛を見られなかったと思います。惜しい。

# SMSの優れていたところ

Qiitaなので、歴史の話だけではなく、少し技術的な話をしましょう。[^13]

[^13]:過去形なのは、プロトコルとして規格がfixされたのが2000年代 (Rel5) だからです。
それ以降もupdateはありますが、下回りへの追従等の些細なものなので。
考案した当時の皆さんが賢かった、ということで過去形。

:::note info
SMSというプロトコルとガチで付き合ったことがあるソフト屋としての私見です。
:::

もちろんPush型という最大の強みがあるのですが、
それは説明済みだしGSMの範疇かなとも思うので。

SMSのスゲェところは、以下2つだろうと思います。
* User Data を運ぶただの箱、として作った
* 通信相手でlayerを分けた

## User Data を運ぶただの箱

3G時代は、実は携帯電話網は2種類ありました。
日本国内でも2種類あったので、覚えている人もいると思います。
3GPPが定めた W-CDAM (UMTS) と 3GPP2が定めた CDMA2000、
国内キャリアでいうと DoCoMo や ソフトバンク と au です。

GSM、4～5G は W-CDMA の前後です。なので 生き残っているSMSもこっちです。

消え去った3GPP2の規格にも、同じ名前で同じようなサービスが定義されていました。
ただ、そっちのSMS、ほんとに全然まったく流行りませんでした。
CDMA2000が流行らなかった点を除いても、そっちのSMS、使いにくかったと思います。

消え去ったほうのSMSは、
データ構造の先頭に「どんなサービスのデータを運んでいるか」の識別子がありました。
その識別子で、以降のデータ構造が変わるんです。
SMSのデータを解析したり作ったりするのは楽なんですが、
新しいサービスを入れようとすると、規格に追加しなきゃいけないし、
ネットワークの対応も必要だし、古い端末は追従できないし...。
という作りでした。
これ、IoT時代を考えると、かなり不便ですよね。

一方で、生き残っているSMSは、データ構造は固定です。
そのSMSのデータがなんのサービスのデータなのか (どのアプリが受信すれば良いのか) すら
User Data の中に識別子を入れるという仕様。
人間が端末に打ち込んだテキストかもしれないし、特定アプリのデータかもしれない User Data は
受け取った端末 (の中のOSやアプリ) が 判断してうまくやってください[^14]、という方針。
SMSはただの箱であるが故に、上のアプリケーションが変わっても揺るぎません。
だから様々なシステムの「足」に採用されているのだと思います。

[^14]:いまどき大抵の端末は、解釈できない User Data が乗ったSMSを受信すると、サイレントに捨てます。
これも「お任せ」の範疇です。
3G時代は、解釈できないバイナリデータを無理矢理表示した化けらったメッセージを表示する端末も、そこそこありましたねぇ。


## 通信相手で layer 分け

End-to-Endで考えたとき、SMSは以下のentitiesによって運ばれます。

端末 --- 基地局 --- SMS Centre[^15] --- 基地局 --- 端末

[^15]:誤字にあらず。
古い3GPP規格は「英語」で書かれているので、Centre と Center は別単語です。

ネットワーク、ちゃんと知っている人が設計したんでしょうね[^16]。
SMSのレイヤは「端末 --- 基地局」「端末 --- SMS Centre」「端末 --- 端末」の3層になっています。
それぞれのレイヤーでACK/NACK (Report) が定義されているので到達確認ができます。

[^16]:あたりまえ。

プラスメッセージっていうアプリがわかりやすいのですが、
メッセージを送ると
①「メッセージ履歴に追加され↖が表示されている」
　→②「↖が消える」
　　→③「すぐに✔が付く」
　　　→④「少しして二重の✔になる」
となります。

自分の端末からSMSの送信を開始すると①になります[^17]。
動きを観察しただけなんですが、たぶん、自キャリアのSMSCentreに到達したタイミングが②です。

[^17]:送信ボタンを何回おしても、メッセージが入力欄から消え去らない経験、ないですか。

相手の端末にSMSが到達すると②になります。
相手キャリアのSMS Centreが「相手に送ったよ！」というACKを返して、
それが自キャリアのSMS Centre経由で端末に返ってきたタイミングです。

相手端末のプラスメッセージがメッセージを表示すると③になります。
受信したアプリが「読まれたよ！」とReportを投げて、
それがSMS Centre経由で、送信元アプリに届くのです。

ユーザにしてみれば、ちょっと状態がわかる程度、ですが
IoTを考えたとき、
このlayer階層のおかげで障害箇所の特定が楽になるというメリットはデカいと思います。

また、キャリアをまたいだり、全然違う実装のSMS Centreを使ったり、という場面を考えても
関心の分離ができるのは、かなり良い設計だろうと思います。

端末だけを考えると、
CP-ACK、RP-ACK、TP-SUBMIT-REPORTって3つもあって面倒くさーと思ったりもするのですが、
全世界を飛び回っていろいろなネットワークに接続しながら同じ品質でサービスをと考えると、
十分で最低限を実現しているなと思います。

# 〆

何十年前の技術をこれから何十年使い続けるんだよ！と言いたくなるSMSですが
それだけの理由があるんだなと諦めていただけると、幸いです[^18]。

[^18]:同じ気持ちの仲間が増えた、という意味で私が嬉しいだけ。