ヌルモデム (null modem) は、RS-232シリアルケーブルを用いて2つのDTE (コンピュータ、端末、プリンター等) を直結するための通信手段である。ヌルモデムという名前は、RS-232ケーブルを用いた歴史的な利用方法に由来している。2台のテレタイプ端末機器は2台のモデムに接続すれば相互通信できるが、「ヌルモデム通信」は、モデムを使用せずにテレタイプ端末を相互に直結するためにクロスオーバーしたRS-232ケーブルを用いることを指す。

RS-232標準では通信リンクの両端点の定義が非対称であり、一方の端点はDTE、もう一方はモデム等のDCEが想定されている。ヌルモデム接続では、送信線と受信線がクロス結線される。目的によっては、1本以上のハンドシェイク線がクロス結線される場合がある。ヌルモデム接続はRS-232標準の範囲外であるため、数種類の結線レイアウトが使用されている。

起源 
当初、RS-232標準は電話線での相互通信が可能なテレタイプ端末マシンのために開発され、使用されていた。各テレタイプ端末はRS-232接続を介してモデムに物理的に接続され、モデムで相手に電話をかけてテレタイプ端末同士でリモート接続を確立することができた。モデムを使わずに (ヌルモデムで) 2台のテレタイプ端末を直結したい場合は、結線をクロスしていた。ヌルモデムという用語は、接続方法だけでなく、ケーブルやアダプター自体を指す場合もある。ヌルモデムケーブルは、1980年代から1990年代初頭にかけて初期のパソコン間でデータを転送するための一般的な手段であった。

ケーブルとアダプター 

ヌルモデムケーブルは、送信線と受信線がクロス結線されたRS-232シリアルケーブルである。ケーブルの中には、ハンドシェイク線がクロス結線されたものもある。多くの場合、ストレート結線のシリアルケーブルとヌルモデムアダプターが一緒に使われる。アダプターには必要なクロス結線が信号間に含まれている。

配線図 

下表は完全なハンドシェイクを提供する2つのDTE (2台のPC等) を相互接続する、ヌルモデムケーブル用の非常に一般的な結線表であり、DCD (データキャリア検出) 信号の適切なアサーションに依存したソフトウェアでも機能する。

用途 
ヌルモデムの本来の用途は、2台のテレタイプ端末をモデムを使わずに直結することであった。RS-232標準が別種の装置に取り入れられるにつれ、設計者はデバイスにDTEのようなインターフェースを備えるべきか、それともDCEのようなインターフェースを備えるべきか決定する必要が出てきた。2つのDTE (または2つのDCE) が相互に通信する必要があるような用途では、ヌルモデムが必須であった。

ヌルモデムは一般にコンピューター同士でのファイル転送または遠隔操作に使用された。マイクロソフトの基本ソフトであるWindowsでは、ヌルモデム接続で直接ケーブル接続を使用することができる。MS-DOSの後期のバージョンには、InterLnkプログラムが同梱されていた。どちらのソフトウェアでも、使用することで一方のコンピューターのハードディスクをもう一方のコンピューターのネットワークドライブとしてマッピングすることができる。この場合、イーサネットハードウェア (ネットワークインターフェースカードやモデム等) は必要ない。コモドールのAmigaシステムでは、ヌルモデム接続は2台のマシンでマルチプレイヤーゲームをプレイするための一般的な方法であった。

イーサネット等のより高速な情報交換システムが普及して利用できるようになったことで、ヌルモデムケーブルの利用は一般的ではなくなった。モダンなシステムでも、そのようなケーブルはカーネルモード開発の際にまだ役立つ場合があるが、これは最小限のデバイスドライバとコード (シリアルドライバーは主に2つのFIFOバッファーと1つの割り込みサービスルーチンで構成される) があればカーネルのリモートデバッグが可能になるためである。たとえば、LinuxではKGDB、BSDではddb、WindowsではWinDbgまたはKDがシステムのリモートデバッグに使用できる。これによって、ローカルのモニターとキーボードが使用不可能となるカーネルパニック発生時 (これらのリソースはGUIが占有しており、パニック時にデバッガーに入っても解放されない) にカーネル内蔵のデバッガに入れるシリアルコンソールを提供することもできる。

こうしたケーブルが有用となり得るもう1つの場面は、シリアル管理コンソールを備えた「ヘッドレス」デバイス (つまりマネージドスイッチ、ラックマウントサーバー、そして様々な組み込みシステム) の管理である。遠隔監視にヌルモデムを広く使用する組み込みシステムには、たとえばRTU、デバイスコントローラー、スマートセンシングデバイス等がある。こうしたデバイスは近距離に設置される傾向があるため、DNP3、Modbus、そして他のIEC亜種といったプロトコルを通じた短距離のシリアル通信に適している。電気、オイル、ガス、水道といった公共サービスは新しいネットワークテクノロジーへの対応が遅いが、これは数十年単位になる耐用年数を持つ資本設備への多額の投資が原因かも知れない。シリアルポートとヌルモデムケーブルは、こうした産業ではいまだに広く使われており、イーサネットは広く利用可能な選択肢になり始めたばかりである。

ヌルモデムの種類 
2つのDTEデバイスを接続するには、対応する信号 (TD-RD、DTR-DSR、そしてRTS-CTS) を入れ替えることでデバイス間でDCEとして振る舞うヌルモデムが必要となる。これは別個のデバイス1つと2本のケーブル、またはこのために結線されたケーブルを1本用いることで達成できる。デバイスがキャリア検出を要求する場合、コネクター内部でDSRとDCDを接続してリモートのDTR信号からCDを取得することでシミュレートすることができる。Yost標準の特徴の1つは、ヌルモデムケーブルが「ロールオーバーケーブル」、つまり一方の1～8番ピンをもう一方の8～1番ピンへと逆転しただけのケーブルである点である。

ハードウェアハンドシェイクがない例 

もっとも単純なシリアルケーブルにはハードウェアハンドシェイクがない。このケーブルではデータ線と信号接地線しか接続されない。他のすべてのピンはつながっていない。この種類のケーブルでは、フロー制御をソフトウェアで実装しなければならない。このケーブルを使用する場合、クロス接続されたRx線とTx線上でしかデータ通信ができない。このケーブルは、モデム制御信号を必要としない、または利用しないデバイスでも使用できる。

ループバックハンドシェイク 

単純なヌルモデムケーブルは互換性に課題があり、問題が発生するおそれがあることから、ソフトウェアにハンドシェイクが利用可能であると騙し込む解決策が考案された。ただし、ケーブルのピン配列がループバックしているだけであり、ハードウェアフロー制御に物理的に対応しているわけではない。

このケーブルだとより多くのソフトウェアに対応できるが、従来の方法から実際に改善された点はなかった。ソフトウェアはハードウェアフロー制御があると思い込んで動作するが、速度が上がると不明な理由で突然停止する恐れがあった。

パーシャルハンドシェイク 

このケーブルでもフロー制御線は同一のデバイスにループバックされる。ただし、RTS (送信リクエスト) とCTS (送信可) のフロー制御が可能になっている (実際には機能しない)。対向デバイスにフロー制御信号が到達するのは、対向デバイスがCD (キャリア検出) 信号 (DE-9ケーブルの1番ピン、DB-25ケーブルの8番ピン) をチェックする場合のみである。結果として、特別に設計されたソフトウェアでのみ、このパーシャルハンドシェイクが利用できた。このケーブルでもソフトウェアフロー制御は動作した。

フルハンドシェイク 

このケーブルは、RTSピンとCTSピンがクロスしているため、従来型のケーブルのハードウェアフロー制御とは互換性がない。適切なソフトウェアがあれば、従来型よりもはるかに高い速度が達成可能である。また、ソフトウェアフロー制御にも対応している。

仮想ヌルモデム 
仮想ヌルモデムは、仮想シリアルポートを用いて2つのコンピューターアプリケーションを直結する通信方法である。ヌルモデムケーブルと異なり、仮想ヌルモデムはコンピューター内でハードウェアヌルモデムをエミュレートするソフトウェアソリューションである。ハードウェアヌルモデムのすべての機能が仮想ヌルモデムで利用できる。これには以下の利点がある。

 より高いシリアルデータ送信速度。制約はコンピューターのパフォーマンスとネットワーク速度のみ。
 ローカルネットワークまたはインターネット経由の仮想接続。ケーブル長の制約が緩和される。
 実質的に無限個の仮想接続
 シリアルケーブルが不要
 コンピューターの物理シリアルポートを使用しないこと

たとえば、DOSBoxによって昔のDOSゲームで仮想ヌルモデムを使うことができる。

もう1つの一般例は、仮想シリアル制御等、ユーザーアプリケーションに標準ttyインターフェースを提供するUnixの擬似端末 (pty) から成る。このようなptyは、2つ用意した場合、仮想モデム通信路を構成するアプリケーションで簡単に接続できる場合がある。

脚注

関連項目 
 クロスオーバーケーブル
 デバッグ
 直接ケーブル接続
 LapLinkケーブル
 ロールオーバーケーブル
 Serial Line Internet Protocol

モデム