Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ tcp(4P) — NEWS-os 4.1C

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

getsockopt(2)

socket(2)

intro(4N)

inet(4F)

ip(4P)

TCP(4P)  —  NEWS-OS Programmer’s Manual

名称

tcp − インターネット送信制御プロトコル

形式

#include <sys/socket.h>
#include <netinet/in.h>

s = socket(AF_INET, SOCK_STREAM, 0)

解説

TCP プロトコルでは、信頼性の高い、 フロー制御された双方向のデータ転送を行えます。 これは、SOCK_STREAM をサポートするのに使われるバイト列のプロトコルです。 TCP は、標準インターネットアドレス形式に加えて、 ホストごとの “ポートアドレス” の集まりを使うことができます。 このように各アドレスは、ホストとネットワークを指定する インターネットアドレスと、相手側(peer entity) を識別するためのホスト上での TCP ポートアドレスの組み合わせからなります。

TCP を使用しているソケット は、“ active 側” と “ passive 側” があります。 active 側ソケットが、passive 側ソケットに接続を行います。 デフォルトでは、TCP ソケットは active 側で作成されます。 passive 側のソケットを作るには、 bind(2) システムコールでソケットにアドレスをつけた後、 listen(2) システムコールを使います。 passive 側ソケットのみが、受信接続要求を受け入れるために accept(2) を使用できます。 また、active 側ソケットのみが、初期接続のために connect(2) を使用できます。

passive 側ソケットには、複数のネットワークからの接続要求に 答えられるように “アドレスを指定” できます。 このための技法 “ワイルドカードアドレッシング” により、 1 つのサーバが、複数のネットワーク上のクライアントにサービスをする ことができます。 すべてのネットワークからの要求を受け入れてソケットを作るためには、 インターネットアドレス INADDR_ANY が設定(バインドリフト) されていなければなりません。 TCP ポートはこの場合でも指定できますが、 指定がなければシステムが適宜に割り付けます。 接続が一度確立すると、ソケットのアドレスは相手側の ロケーションに固定されます。 ソケットに割り付けられたアドレスは、 パケットが送受信の際に通るネットワークインターフェースの アドレスに相当します。 通常、このアドレスは、相手側(peer entity)のネットワークと対応しています。

TCP には、 setsockopt(2) で設定され、また getsockopt(2) で調べることができるソケットオプションがあります。 大抵の場合、TCP は発信データが渡されたときに、 そのデータを送信します。 未処理のデータに対して、アクノリッジ(確認応答)が戻ってこない時には、 TCP は少量の送信データを 1 つのパケットにまとめ、 アクノリッジが 1 回でも来れば、それを送ります。 ウィンドウシステムのマウスイベントのように、 応答を受け取らないで小さなたくさんのデータを流し続けるような 少数のクライアントに対しては、 このパケット化が重大な遅れを引き起こすことがあります。 そこで、TCP は、このアルゴリズムを無効にする TCP_NODELAY オプションを 用意しています (<netinet/tcp.h>より)。 setsockopt コールのオプションレベルは TCP のプロトコル番号に等しく、 getprotobyname(3N) によって得ることができます。

IP 転送レベルでのオプションが、TCP で使用されることもあります。 ip(4P) を参照してください。sorce-route されている、 相手からの接続要求は記憶されていて、 応答においては逆の経路が用いられます。

診断

ソケット動作が失敗すると、次のエラーが返されます。

[EISCONN] 既に接続されているソケットに接続しようとした。

[ENOBUFS] システムが内部のデータ構造のためのメモリを使い切ってしまった。

[ETIMEDOUT] 再送信の回数が多すぎたことにより接続が切られた。

[ECONNRESET] 遠隔の相手により強制的に接続がクローズされた。

[ECONNREFUSED] 遠隔の相手が接続を拒絶した (通常、ポートを listen しているプロセスがないため)。

[EADDRINUSE] 既に使われているポートでソケットを作ろうとした。

[EADDRNOTAVAIL] ネットワークインターフェースが存在しないのに、 そのネットワークアドレスでソケットを作ろうとした。

関連事項

getsockopt(2), socket(2), intro(4N), inet(4F), ip(4P)

NEWS-OSRelease 4.1C

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026