総合手引 | セクション 4 | オプション |
T/TCP 特定のコネクションの全セグメントにおいて、あるオプションを いくつか含めることにより、T/TCP 拡張は機能します。 これにより一組のホスト間での最初の接続を除く全ての 3 ウェイハンドシェークを無くすことができます。 さらに同じオプションを用いて、 古い重複したパケットをより確実に判別することが可能であり、 従って TCP プロトコルが接続を閉じた後、状態を保たなければならない 時間を減らすことができます。 "net.inet.tcp.rfc1644" の MIB の変数は実行時に T/TCP ネゴシエーションを無効化するために使用することができます。 しかしながら、本プロトコルは、T/TCP ではないシステムが T/TCP 拡張されたシステムと通信しようとしたときに、 自動的に標準の TCP に戻して通信することを保証するために設計されたものです。
char request[REQ_LEN]; struct sockaddr_in sin; int sock, req_len;sock = socket(PF_INET, SOCK_STREAM, 0);
/* request[] と sin の準備 */
err = sendto(sock, request, req_len, MSG_EOF, (struct sockaddr *)&sin, sin.sin_len);
/* エラー処理 */
req_len = read(sock, request, sizeof request); close(sock);
/* 応答処理 */
sendto() を呼び出すと、その時のソケットの状態は connect(2) 及び shutdown(2) システムコールが使われた時と 同じ状態になることに注意して下さい。 つまり、このソケット上で実行するのに適した操作は、 read(2) および close(2) だけです (クライアントの TCP 送信部はすでにシャットダウンされているので、 このソケットを他の送り先へ connect(2) することはできません)。
既存のサーバが T/TCP 拡張機能を使用するように変更を行う際には、 最初のオプションを用いるのは一般的に妥当な選択です。 単純に setsockopt(sock, IPPROTO_TCP, TCP_NOPUSH, &One, sizeof One) (ここで One は 0 以外の値の整数の変数です) へのコールを追加するだけだからです。 何かデータが送信される前に (ソケットのバッファが飽和していない限り) サーバ側のソケットは閉じていなければなりません。
2 番目のオプションは、新しいサーバにはより望ましいものです。 場合によっては、古いサーバにも適用できるくらい簡単です。 この場合、応答段階で通常 write() の呼び出しを含んでいますが、 それを次のように置き換えます :
sendto(sock, buf, len, MSG_EOF, (struct sockaddr *)0, 0)
この場合、応答は直ちに送信されますが、クライアントの場合と同様に、 ソケットはこの時点で何にも使用することは出来ません。 直ちにクローズすべきです。
FreeBSD 2.1 | TTCP (4) | January 18, 1995 |
総合手引 | セクション 4 | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
“ | With features like these, who needs bugs? | ” |
— Henry Spencer |