TTCP(4)

명칭
ttcp - 트랜스미션 컨트롤 프로토콜의 트랜잭션(transaction) 확장 기능

#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> int setsockopt(sock, IPPROTO_TCP, TCP_NOPUSH, &One, sizeof One)
ssize_t sendto(sock, msg, len, MSG_EOF, &sin, sizeof sin)
ssize_t sendto(sock, msg, len, MSG_EOF, 0, 0)

해설
T/TCP 하 TCP 프로토콜 ( tcp(4) (을)를 참조) 에의 확장 기능의 집합입니다. 본기능에 의해 소량의 데이터를 2 개의 패킷의 교환으로 교환할 수가 있어 따라서 표준의 TCP connection로 본래 발생하는 여분의 왕복에 의한 지연을 잃을 수가 있습니다. 소켓 인터페이스는 T/TCP (을)를 서포트하도록(듯이) 수정되고 있어 또 여기에서는 명확한 케이스에 대해 상술하고 있습니다. 프로토콜에 의존하지 않는 부분의 서포트에 대해서는 socket(2) 및 send(2) 의 메뉴얼 페이지로 진술되고 있습니다. T/TCP (은)는 RFC 1644 로 정의되고 있습니다.

T/TCP 특정의 connection의 전세그먼트(segment)에 대해, 어느 옵션을 몇개인가 포함하는 것으로, T/TCP 확장은 기능합니다. 이것에 의해 1조의 호스트간에서의 최초의 접속을 제외한 모든 3 웨이한드시크를 잃을 수가 있습니다. 한층 더 같은 옵션을 이용해, 낡은 중복 한 패킷을 보다 확실히 판별하는 것이 가능하고, 따라서 TCP 프로토콜이 접속을 닫은 후, 상태를 유지하지 않으면 안 된다 시간을 줄일 수가 있습니다. “net.inet.tcp.rfc1644” 의 MIB 의 변수는 실행시에 T/TCP 네고시에이션을 무효화하기 위해서 사용할 수가 있습니다. 그렇지만, 본프로토콜은, T/TCP 가 아닌 시스템이 T/TCP 확장된 시스템과 통신하려고 했을 때에, 자동적으로 표준의 TCP 에 되돌려 통신하는 것을 프로텍션하기 위해서 설계된 것입니다.

트랜잭션(transaction) 모델
T/TCP 그리고 이용된다 “트랜잭션(transaction)” 의 모델은 꽤 단순한 것입니다:

1.  클라이언트 프로그램은 서버에 송신하는 요구를 작성합니다. 그것은 단일의 TCP 세그먼트(segment)에 수습될 정도로 충분히 작은 것입니다. 그리고 옵션과 데이터와 함께 SYN PUSH FIN 세그먼트(segment)를 서버에 보냅니다.

2.  서버 프로그램은 표준의 TCP 접속과 같게, 요구를 받아들여 해독해, 단일의 세그먼트(segment)에 수습되는 크기의 응답을 작성합니다. 그 요구가 T/TCP 의 경우, 응답은, (다른) 옵션과 데이터와 함께 단일의 SYN PUSH FIN ACK 세그먼트(segment)로 클라이언트에 돌려주어집니다. T/TCP 가 아닌 경우는, (거의) 통상의 TCP 에 되돌려진 접속이 됩니다. 서버는 이 때 T/TCP 소켓을 클로우즈 합니다.

3.  클라이언트는 응답을 읽어들여, 소켓을 클로우즈 합니다.

클라이언트 서포트
클라이언트측의 서포트는, “암묵의 접속” 및 “송신과 셧다운” 의 개념을 이해하는 것처럼 sendto(2) 및 sendmsg(2) 시스템 콜의 의미를 확장하는 것으로써 제공됩니다. 트랜잭션(transaction)에 의한 요구를 송신하려면 sendto(2) 시스템 콜을 통상 사용해, 다음의 예의님이 합니다:

    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 (을)를 사용할 때에 서버로 이용 가능한 옵션이 2 개 있습니다:

1.  TCP_NOPUSH 소켓 옵션을 세트 해, 표준의 write(2) 콜을 사용해 응답을 실시해 주세요.

2.  클라이언트의 경우와 같게, sendto(2) (을)를 MSG_EOF 플래그와 함께 사용해 주세요. 다만, 발송지는 지정하지 않습니다.

기존의 서버가 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)

이 경우, 응답은 즉시 송신됩니다만, 클라이언트의 경우와 같게, 소켓은 이 시점에서 아무것도 사용할 수 없습니다. 즉시 클로우즈 해야 합니다.

MIB 의 변수
T/TCP 확장 기능을 이용하려면 , 적절한 TCP 옵션을 송신하도록(듯이) MIB 변수 “net.inet.tcp.rfc1644” 하지만 진인 것을 필요로 합니다. 자세한 것은 tcp(4) (을)를 참조해 주세요.

관련 항목
send(2), setsockopt(2), inet(4), tcp(4) R. Braden, T/TCP - TCP Extensions for Transactions, RFC 1644.

역사
T/TCP 의 서포트는 FreeBSD 2.1 그리고 처음으로 행해졌습니다. 그것은 The University of Southern California 의 Information Sciences Institute 의 Bob Braden 와 Liming Wei 하지만 쓴 코드를 기본으로 하고 있어, The University of Twente 의 Andras Olah 가 이식했습니다.