Transport Layer Interface(TLI、トランスポート層インタフェース)とは、1987年にAT&TのUNIX System V Release 3.0で提供されたネットワーク用APIであり、Release 4 (SVR4) でもサポートが継続された。

## 概要

BSDのソケットに対抗したSystem VのAPIである。TLIは後にThe Open Groupが XTI (X/Open Transport Interface) として標準化した。実装は下位に位置するキャラクタ型入出力機構であるSTREAMSと密接に関連している。

当時、OSIプロトコルが TCP/IP に取って代わると予測されていたため、TLIはOSI参照モデルに準拠したプロトコルから独立した仕様になっており、OSIのトランスポート層に対応している。XTI/TLIを使ったプログラムは、Transmission Control Protocol (TCP)、Xerox Network Systems (XNS)、Systems Network Architecture (SNA)、X.25、Asynchronous Transfer Mode (ATM) などOSI参照モデルの第4層の機能を提供する様々なトランスポート層プロバイダ上で動作可能である。

APIとしてはソケットと同様の機能を提供しているが、ソケットがインターネット・プロトコル・スイートと密接に関連しているのに対し、XTI/TLIはプロトコルから独立している。XTIは、連携するSTREAMSモジュール、ライブラリAPI、ヘッダファイル群、XTIプロセスの動作に関する規則や制限で構成されている。

TLIとXTIはUNIX 98まではPOSIXソケットAPIよりも好まれ、広く使われていた。TLIとXTIは、SolarisなどSVR4から派生したオペレーティングシステム (OS) やUNIXブランド (UNIX 95, UNIX 98, UNIX03 Single UNIX Specification) 準拠のOSでは今もサポートされている。また、Mac OSでもOpen Transportという名称で使われた。UNIX 95 (XPG4) と UNIX 98 (XPG5.2) ではXTIがサポート推奨APIとなっていた。その後Single UNIX SpecificationにおいてSTREAMSを実装していないBSDやLinuxを考慮すべきだという議論が起き、UNIX 03ではSTREAMSとXTIをオプションとし、POSIXソケットをサポート推奨APIとした。

## プロトコル独立性

XTI/TLIはプロトコルから独立している。しかし、どのプロトコルを使うかを指定する必要があるため、結局アプリケーションは使用するプロトコルについて知っている必要がある。使用するプロトコルに関する知識もアプリケーションから排除するには、Network Selection Facilities を使用する。これはXTI/TLIライブラリ (libnsl) の一部となっている。

## XTI/TLI とソケットの比較

XTI/TLIとBSDソケットは似ているが、完全に同じというわけではなく、同じ役割の関数が異なる振る舞いをすることも多い。UNIX SVR3 とSVR4 ではTLIとソケットがSTREAMSのTransport Service Interfaceの上に実装されている。

下記の表はPOSIXでのXTIとソケットのインタフェースを比較したものである。

| XTI/TLIインタフェース | ソケットインタフェース | 意味論的に同一か |
| --- | --- | --- |
| t\_open | socket | イエス。ただしt\_openはオープン時にt\_getinfoを実行可能 |
| - | socketpair | - |
| t\_getinfo | - | - |
| t\_getprotaddr | getsockname, getpeername | イエス。しかしt\_getprotaddrは対応する2つの機能を1つで実行可能 |
| t\_bind | bind, listen | イエス。ただしt\_bindは対応する2つの機能を1回のコールで実施可能 |
| t\_optmgmt | getsockopt, setsockopt | イエス。ただしt\_optmgmtはデフォルト値と調停値を取得できるのに対し、getsockoptとsetsockoptは現在値しか取得/更新できない。 |
| t\_unbind | bind | イエス。ソケットの場合AF\_UNSPECを指定することでunbind相当になる。 |
| t\_close | close | イエス。ただし、t\_closeでは常にアボート的切断になるのに対し、closeは終了を待ち合わせて解放することもある。 |
| t\_getstate | - | - |
| t\_sync | - | - |
| t\_alloc | - | - |
| t\_free | - | - |
| t\_look | select, getsockopt | selectとgetsockopt (SO\_ERROR) はt\_lockの全機能をカバーしていない。 |
| t\_error | perror | イエス。ただしXTIは通常のerrnoに追加的にt\_errnoを使用し、トランスポート層のエラーだけでなくUNIXシステムのエラーも示すことができる。 |
| t\_strerror | strerror | イエス |
| t\_connect | connect | t\_connectの前にt\_bindが必須である。 |
| t\_rcvconnect | select | t\_rcvconnectは、selectでO\_NONBLOCKを指定した場合と同等である。 |
| t\_listen, t\_accept, t\_snddis | accept | acceptは接続を拒否できないが、t\_listenで受け付けた接続要求はその後のt\_acceptで初めて許可され、t\_snddisを使えば拒否できる。 |
| t\_snd, t\_sndv | send, sendto, sendmsg | イエス。しかし t\_snd と t\_sndv はコネクションモードのトランスポートでのみ使用。 |
| t\_rcv, t\_rcvv | recv, recvfrom, recvmsg | イエス。ただしt\_rcvとt\_rcvvはコネクションモードのトランスポートでのみ使用。 |
| t\_snddis | close, shutdown | t\_snddisを発行後も接続要求をlistenし続けることができ、t\_connectで接続を再確立することもできる。closeはソケットのファイル記述子を解放してしまう。通信を続ける場合、ソケットでは新たに接続を確立する準備をしなければならない。 |
| t\_rcvdis | ENOTCONN, ECONNRESET, EPIPE, SIGPIPE | イエス。ただし、ソケットではエラーまたはシグナルで通知。 |
| t\_sndrel, t\_sndreldata | shutdown | イエス。しかしshutdownには通常解放時にデータを送信する機能はなく、t\_sndreldataは通常解放時にデータを送信できる。t\_sndrelは単にシャットダウンだけを行う。 |
| t\_rcvrel, t\_rcvreldata | - | - |
| t\_sndudata, t\_sndvudata | sendmsg | イエス。しかしt\_sndudataとt\_sndvudataはコネクションレス・モードでのみ使用。 |
| t\_rcvudata, t\_rcvvudata | recvmsg | イエス。しかしt\_rcvudataとt\_rcvvudataはコネクションレス・モードでのみ使用。 |
| t\_rcvuderr | - | - |
| read, write | read, write | XTI/TLIではread/writeを使用する前にtirdwrモジュールをSTREAMSにプッシュする必要がある。 |

ライブラリ関数には呼び出し順序の規定があるため、XTI/TLIは状態インジケータを使用しており、ソケットAPIにも同様の仕組みがある。ただし、ソケットのAPI関数は複数の状態で呼び出せることがあるのに対し、XTIのAPI関数は特定の状態でないと呼び出せないようになっている。

## XTI/TLI非同期モード

XTI/TLIには非同期モードがあり、リアルタイム性が要求されるアプリケーションで利用できる。非同期モードでない場合、データを待ち続けてずっとブロックされる可能性がある。初期化の際に O\_NONBLOCK というパラメータを指定すると非同期モードになる。その場合、接続要求、新規データ到着、タイムアウトなどのイベントを非同期にアプリケーションに通知する。

## XTIでの改良点

XTIでTLIから改良した点として、エラーメッセージの追加、フロー制御のためのイベント追加、パラメータ指定の簡素化(オープンの際はデフォルトでリード・ライトとなるなど)がある。また、t\_listenでずっとブロックしてしまうのを防ぐためqlenの値をチェックするようになった。さらにt\_strerror()とt\_getprotaddr()というインタフェースが追加された。

## 実装

XTI/TLIはUNIX System Vで実装されているが、Linux向けのOpenSS7などの実装例もある。