自作プロトコルMSPをPythonで実装|通信構造とコード解説

自作プロトコルMSPをPythonで実装した理由と構造のすべて

通信プロトコルという言葉を聞くと、多くの人はRFC文書のような堅苦しく抽象的な世界を思い浮かべるかもしれません。
しかし、プロトコルは「難しいもの」ではなく、「道具」であり、「美しくデザインされた約束事」にすぎません。
今回私は、Pythonを使ってシンプルな通信プロトコルを自作しました。名前は MSP(Minokamo Secure Protocol)
この記事では、その全体像と実装方法、そして応用の可能性についてご紹介します。

MSP プロトコルの教育的価値 誰に役立つのか、なぜ役立つのか – カスタムプロトコル開発による学習効果 🔧 通信プロトコルを学びたい人 なぜ役立つのか: • TCPの上にどんな構造を載せられるか学べる • パケット設計、ヘッダー、データフローの理解 • 同期バイト、CRC、フレーミングの実装を体験 🧠 レトロPC / 仮想OS実験者 なぜ役立つのか: • COM通信・シリアル転送の教材になる • シリアルプロトコル理解のための学習素材 • 現代PythonとクラシックシリアルIFの橋渡し 📚 学生・教育現場 なぜ役立つのか: • 「自分で作ったプロトコル」で通信できる喜び • 即座に結果が見える実践的学習 • ネットワークプログラミング概念への自信構築 🧪 セキュリティ初学者 なぜ役立つのか: • 暗号なし→暗号ありの進化を段階的に学べる • セキュリティ概念を段階的かつ実践的に習得 • 暗号化レイヤー追加の効果を即座に実感 📦 実験装置開発者(理系) なぜ役立つのか: • TCP/IPスタックに依存しないシンプル送受信を設計できる • 組み込みシステムや実験装置に最適 • 最小オーバーヘッド、最大制御性 MSP による学習の旅 ステップ1 基本MSP パケット構造と フローの理解 ステップ2 COM追加 シリアル通信へ 拡張 ステップ3 GUIツール ユーザー インターフェース ステップ4 暗号化 AESセキュリティ レイヤー追加 ステップ5 ファイル転送 高度な機能 実装 🎯 最終目標 カスタムプロトコル開発の 完全理解 基礎から高度セキュリティまで 💡 主要メリット:読むだけでなく作って学ぶ – 実践的プロトコル開発体験

なぜ自作プロトコルを作ったのか?

私がMSPを作ろうと思ったのは、「既存の通信方式では表現できない体験を、自分の手で作りたかった」からです。
もちろんHTTPやWebSocketのように便利な仕組みは数多くありますが、
それらはすでに“完成しすぎていて”、内部構造を触る余地がありません。

MSPは、TCPの上に非常にシンプルなパケット構造を持たせたもので、通信の本質的な部分を学び直すのに最適な設計にしました。

MSPのパケット構造について

MSPでは、送受信するデータを次のようなパケットとして定義しています。

  • SYNC(2バイト)… 開始を示す固定値(0xAA55)
  • LENGTH(2バイト)… パケット全体の長さ(ヘッダー+ペイロード)
  • VERSION(1バイト)… プロトコルバージョン
  • TYPE(1バイト)… メッセージの種類(データ or 応答)
  • PAYLOAD(可変長)… UTF-8でエンコードされた文字列データ
  • CRC(1バイト)… 単純なチェックサム(ペイロードの合計 mod 256)

図解としてプロトコル構造をまとめましたので、あわせてご覧ください。

MSP パケット構造 SYNC (2B) 長さ (2B) VER (1B) タイプ (1B) ペイロード (可変長) CRC (1B) • SYNC: 固定値 0xAA55 • 長さ: パケット全体の長さ (ペイロード長 + 7) • VER: プロトコルバージョン (現在は 1) • タイプ: 0x10 (データ) または 0x11 (ACK) • CRC: ペイロードの単純チェックサム (合計 mod 256) MSP 通信フロー クライアント サーバー データパケット (TYPE_DATA) 確認応答 (TYPE_ACK) msp.py の主要コンポーネント MSP プロトコル実装 MSPClient MSPServer

このような構造にすることで、通信が途切れても「同期(SYNC)」で復帰でき、
受信したデータが壊れていればCRCで検出できます。

クライアントとサーバーの処理フロー

MSPは、クライアントがサーバーにメッセージを送り、サーバーがACK(応答)を返すという非常に明快な仕組みです。
内部的にはPythonのソケット通信を使い、バイナリデータとして上記のパケットをやり取りします。

以下は、その全体フローです。

MSP プロトコル詳細フロー クライアント処理 初期化 サーバーに接続 データパケット作成 build_packet(TYPE_DATA, message) パケット送信 応答受信 & パース parse_packet(response) 終了 サーバー処理 初期化 ソケットバインド & リッスン 接続待機 クライアント接続受付 パケット受信 & パース parse_packet(data) ACK パケット作成 & 送信 build_packet(TYPE_ACK, ‘OK’) データ送信 ACK 応答 プロトコル定数: • SYNC: 0xAA55 • VERSION: 1 • TYPE_DATA: 0x10 • TYPE_ACK: 0x11 • デフォルトポート: 9009

実際のコードでは、build_packet()parse_packet() という関数がそれぞれ
「送信側でパケットを組み立てる」
「受信側でパケットを分解する」
という役割を果たします。

実行方法と試してみる価値

MSPは非常に軽量で、依存パッケージは一切ありません。
msp.py という1つのファイルだけでクライアント・サーバーの両方が動作します。

例えば次のように使います。

サーバー起動:

python msp.py --mode server --host 127.0.0.1 --port 9009

クライアントから送信:

python msp.py --mode client --host 127.0.0.1 --port 9009 --message "Hello MSP"

応答として、ACK(応答パケット)が返ってきたら通信成功です。

さらに、Linux(Ubuntu)から別PC経由での接続にも成功しました。
その場合、クライアント側では次のように実行します。

python3 msp.py --mode client --host 192.168.0.15 --port 9009 --message "Hello MSP"

ここで 192.168.0.15 は、MSPサーバーを起動しているWindowsマシンのローカルIPアドレスです。
これに対応して、サーバー側は次のように起動しておきます。

python msp.py --mode server --host 0.0.0.0 --port 9009

0.0.0.0 を指定することで、全てのネットワークインターフェースからの接続を受け付けます。

🔒 注意:Windowsファイアウォールの設定

このように外部(Linux)からWindowsへ接続する場合、
Windows側のファイアウォールが通信をブロックしていないことを確認してください。

以下のように、受信の規則にポート9009を許可する設定を追加しておく必要があります。

設定の例:

  • プロトコルの種類:TCP
  • ローカルポート:9009
  • アクション:接続を許可する
  • プロファイル:プライベートまたはドメインネットワーク

応用の可能性と今後の展望

MSPは「自作の通信プロトコル」であるがゆえに、あらゆる応用が可能です。
たとえば、以下のような展開を計画しています。

  • 通信内容をAES暗号化してセキュアに(MSP v0.2として予定)
  • GUIツール(Tkinter)で視覚的に送信
  • COMポート(シリアル通信)にも対応し、レトロPCやFreeDOSとの連携を目指す
  • ファイル転送やリモート制御のプロトコルとして発展

GitHubと動画紹介

今回紹介したコードはすべてGitHubに公開済みです。
また、実際の通信の様子を動画でもご覧いただけます。

最後に

このプロトコルは、決して実用重視ではありません。
それでも私は、「あえて自分で作る」ことの価値を信じています。
通信という“目に見えない世界”を、自分の言葉(構造)で形にする──
それは、プログラミングの原点のように感じます。

MSPが、誰かの学びや試みに役立つことを願って。
ここまでお読みいただき、ありがとうございました。

タイトルとURLをコピーしました