
執筆者
M.N.
「なぜこれをやるのか」

PHPカンファレンス2025の振り返り、第3回です。
今回は「PHPで作るTCP/IPプロトコル」というセッションについてです。
正直に言うと、このセッションは前のセッションが少し早く終わって時間が空いたので、いわば「時間つぶし」で聴講したものでした。
当時のメモにも「時間潰しで聴講しているので、内容が薄いレポートですみません」と書いてあって、自分の正直さに笑ってしまいました。
ただ、内容自体はなかなか面白いものだったので、せっかくなので振り返ってみます。
なぜTCP/IPをPHPで実装するのか
セッションの冒頭では、「なぜこれをやるのか」という話がありました。理由として挙げられていたのは次の3つです。
・仕事に役立つ
・実装すると理解でき、記憶に残る
・楽しい
ここで言及している「楽しい」の理由として、プロトコルは仕様がきっちり決まっていて、通信相手が正しく動作するという前提のもとで実装が進められる、という話がありました。
普段の業務だと、仕様が曖昧だったり、相手の実装が想定と違ったりして苦労することが多いので、「仕様が決まっていて、通信できたときに達成感がある」というのは、なんだか羨ましいような、新鮮な感覚で聞いていました。
新鮮な発想・前提

PHPでソケット通信を扱う
PHPでソケット通信を行うには、ソケット拡張機能を使うとのことでした。
普段Webアプリケーションを書いているときは、HTTPより下のレイヤーを意識することはほとんどありません。
リクエストが届いて、レスポンスを返します。
その間にTCPやIPがどう動いているかは、フレームワークやサーバーが全部やってくれています。
従って、
「PHPでTCP/IPを扱う」という発想自体が新鮮で、「そんなこともできるんだ」という気持ちで聞いていました。
今回実装した範囲
セッションで紹介されていた実装範囲は、トランスポート層(第4層)の一部で、具体的には以下のような内容でした。
01 3ウェイハンドシェイク
02 Ack応答
03 クローズ処理
04 通信が落ちない前提の範囲
「通信が落ちない前提」というスコープの切り方も、なるほどと思いました。本来TCPは再送制御やエラー処理なども含む複雑なプロトコルですが、まず動く部分だけを切り出して実装する、という進め方は、何かを学ぶときの良いアプローチだと感じました。
TCPはOSが管理している、という壁
セッションの中で「TCPはOSが管理しているが、実装できるのか?」という問いが出てきました。
普段意識することはありませんが、TCP/IPのスタックは基本的にOSのカーネルが処理しています。
アプリケーションはその上に乗っているだけ、というのが通常の構成です。
これを回避するために、セッションでは「RAWソケット」を使う、という話がありました。
RAWソケットを使うとTCP以下の層を直接読み書きできるようになりますが、その代わりROOT権限が必要になるとのことです。
「OSがやっている処理に、アプリケーション側から踏み込んでいく」という感覚は、普段のWeb開発ではまず触れない領域なので、聞いているだけでも「裏側はこうなっているのか」という発見がありました。
実感できてデモとセッション所感

3ウェイハンドシェイクのダンプ
セッションの最後では、実際に3ウェイハンドシェイクの様子をダンプして見せる、というデモがありました。
普段「TCP接続が確立される」という一言で済ませている処理が、実際にパケットのやり取りとして可視化されると、「ああ、本当にこういう手順を踏んでいるんだ」というのが目に見える形で実感できました。
教科書で見る図と、実際に動いているものを見るのとでは、やっぱり納得感が違います。
振り返ってみての所感
当時のメモには、
「プロトコルの内容が決まっているので、それに合わせて実装すればできる、というのはわかりますが、なかなか自分でやろうと思わないので興味深かった」
と書いていました。
「実用というよりはプロトコルの理解のために趣味でやってる感じ」「業務にダイレクトに役立つことではない」とも書いてあり、当時の自分はやや辛口な評価をしていたようです。
ただ、
1年経って読み返してみると、このセッションで触れた「OSが普段やってくれている処理」「フレームワークが隠してくれているレイヤー」を意識する視点は、地味に役に立っている気がします。
たとえば、
通信周りで原因不明のエラーに遭遇したとき、「もしかしてTCPレベルで何か起きているのでは」という発想の引き出しが、ひとつ増えた感覚です。
直接業務に使うかどうかは別として、「ふだん見えていない層を覗いてみる」という体験そのものが、エンジニアとしての視野を広げてくれるものだったのかもしれません。
次回は、「PHPで始める振る舞い駆動開発(BDD)」についてレポートしたいと思います。
お読みいただきありがとうございました。













