TCP(4)

명칭
tcp - 인터넷 트랜스미션 컨트롤 프로토콜

서식
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int socket(AF_INET, SOCK_STREAM, 0)

해설
TCP 프로토콜은 신뢰성이 있는, flow control 된, 전이중의 데이터 전송을 제공합니다. 본프로토콜은 SOCK_STREAM (으)로서 추상화 된 기능을 서포트하는 것으로서 사용되는, 바이트 스트림형의 프로토콜입니다. TCP 는 표준의 인터넷 주소 포맷을 사용해, 더해 호스트 마다의 “포트 주소” 의 집합도 사용합니다. 따라서 각 주소는, 호스트 및 네트워크를 특정한다 인터넷 주소와 호스트상의 피아엔티티를 식별하는 특정 TCP 포트로부터 구성됩니다.

tcp 프로토콜을 이용하고 있는 소켓은 “능동형” 및 “수동형” 의 2 종류가 있습니다. 능동형의 소켓은, 수동형의 소켓에 대해 connection를 개시합니다. 디폴트에서는 TCP 소켓은 능동형의 것이 작성됩니다. 수동형 소켓을 작성하려면 , bind(2) 시스템 콜로 소켓을 바인드 한 후, listen(2) 시스템 콜을 사용할 필요가 있습니다. 수동형 소켓만이, accept(2) 콜을 사용해, 입력되는 connection 요구를 받아들인다 일이 생깁니다. 또, 능동형 소켓만이, connect(2) 콜을 사용해 connection를 개시할 수가 있습니다. TCP (은)는 게다가 트랜잭션(transaction) TCP (으)로 불리는 데이터 그램의 같은 모드도 서포트하고 있습니다. 본건에 관해서는 ttcp(4) 그리고 진술되고 있습니다.

수동형 소켓은 복수의 네트워크로부터 오는 connection 요구에 대처하기 위해서, 그 위치를 “명확하게 지정하지 않는다” 일이 생깁니다. 이 기술은 “와일드 카드 애드레싱” (으)로 불려 단일의 서버가 복수의 네트워크상의 클라이언트에 서비스를 제공할 수가 있습니다. 전네트워크로부터의 connection 요구에 응답하는 소켓을 작성하려면 , 인터넷 주소 INADDR_ANY (을)를 바인드 할 필요가 있습니다. 이 시점에서도, TCP 포트를 지정할 수 있습니다. 만약 포트가 지정되어 있지 않은 경우는 시스템이 포토를 할당합니다. connection가 한 번 확립되면(자), 소켓의 주소는 피아엔티티의 장소에 의해 고정됩니다. 소켓을 할당할 수 있었던 주소는, 네트워크 인터페이스와 연결시킬 수 있고 있어 이 네트워크 인터페이스를 통해 패킷이 송수신 됩니다. 보통, 이 주소는 피아엔티티의 네트워크와 일치합니다.

TCP (은)는 소켓의 옵션을 몇개인가 서포트하고 있어, 그것들은 setsockopt(2) 에 의해 설정할 수 있습니다. 또, getsockopt(2) 에 의해 옵션의 설정을 조사할 수가 있습니다:

TCP_NODELAY
    대체로의 상황하에 대해, TCP (은)는 데이터가 나타나면(자) 그것을 송신합니다. 확인 응답되어 있지 않은 데이터가 남아 있는 경우는, 확인 응답이 수신되었을 때 곧바로 하나의 패킷으로 송신하기 위해서 소량의 출력 데이터를 모아 둡니다. 응답을 받아들이지 않는 마우스 이벤트의 스트림을 송신한다 윈도우 시스템과 같은 소수의 클라이언트에 있어서는, 이 패킷화는 중대한 지연의 원인이 됩니다. 불 옵션 TCP_NODELAY 에 의해 이 알고리즘을 무효로 할 수가 있습니다.

TCP_MAXSEG
    디폴트에서는, 송신측 및 수신측의 TCP 간의 각 connection로 각각 최대 세그먼트(segment) 사이즈의 결정을 실시합니다. TCP_MAXSEG 옵션에 의해 이 결정의 결과를 유저가 결정할 수가 있어 또 요구가 있으면 그 값을 줄일 수가 있습니다.

TCP_NOOPT
    TCP (은)는 보통, 본실장에 대해 제공되는 여러가지 TCP 확장 기능에 따라, 각 패킷중에서 몇개인가 옵션을 송신합니다. 불 옵션 TCP_NOOPT (은)는 각 connection로 사용된다 TCP 옵션을 무효화하기 위해서 제공되고 있습니다.

TCP_NOPUSH
    관례에 의해, 송신측의 TCP 는 “push” 비트를 세트 해, (만약 허가되고 있으면) write(2) 또는 writev(2) 하지만 불릴 때에 즉석에서 송신합니다. TCP_NOPUSH 옵션은 트랜잭션(transaction) TCP ( ttcp(4) (을)를 참조) (을)를 서버가 간단하게 이용하기 위해서 제공되고 있습니다. 본옵션이 0 이외의 값에 세트 되면(자), TCP (은)는 소켓이 클로우즈 될까 내부의 송신 버퍼가 가득 찰 때까지, 모든 데이터의 송신을 늦춥니다.

setsockopt(2) 콜에 있어서의 옵션 레벨은 TCP 의 프로토콜 넘이며, getprotobyname(3) 혹은 IPPROTO_TCP (으)로부터 얻을 수 있습니다. 옵션은, 모두 <netinet/tcp.h> 그리고 정의되고 있습니다.

IP 트랜스폴트 레벨에서의 옵션은 TCP 그리고 사용 가능합니다. 본건은 ip(4) (을)를 참조해 주세요. 소스 루트의 입력 connection 요구가 기재되어 있어 또 역방향의 소스 루트가 응답으로 사용됩니다.

MIB 의 변수
tcp 프로토콜은, sysctl(3) MIB 의 net.inet 브랜치(branch)로 3 개의 변수를 실장하고 있습니다.

TCPCTL_DO_RFC1323
    (tcp.rfc1323) RFC 1323 의 윈도우 슬캘링 및 타임 스탬프의 옵션의 실장 (디폴트는 진).

TCPCTL_DO_RFC1644
    (tcp.rfc1644) 트랜잭션(transaction) TCP 의 실장. RFC 1644 로 진술되고 있습니다.

TCPCTL_MSSDFLT
    (tcp.mssdflt) 최대 세그먼트(segment) 사이즈 (“MSS”) 의 기본값. MSS 의 결정 시에 특히 지시가 없는 경우에 사용됩니다.

진단
소켓 조작의 실패 시에는 다음의 에러 중 하나가 돌려주어집니다:

[EISCONN]
    이미 connection가 확립되어 있는 소켓에 대해 한층 더 connection를 확립 시키려고 했을 때

[ENOBUFS]
    내부적인 데이터 구조를 위한 메모리가 부족했을 때

[ETIMEDOUT]
    과도의 재발송신에 의해 connection가 떨어졌을 때

[ECONNRESET]
    리모트 피어가 강제적으로 connection를 클로우즈 했을 때

[ECONNREFUSED]
    리모트 피어가 의식적으로 connection의 확립을 거부해 왔을 때 (대체로는 그 포트를 감시하고 있는 프로세스가 없기 때문입니다)

[EADDRINUSE]
    이미 할당할 수 있고 있는 포트에 대해 소켓을 작성하려고 했을 때

[EADDRNOTAVAIL]
    대응한 네트워크 인터페이스가 존재하지 않는다 네트워크 주소를 지정해, 소켓을 작성하려고 했을 때

[EAFNOSUPPORT]
    멀티 캐스트 주소에 대해 소켓을 바인드 또는 접속하려고 했을 때

관련 항목
getsockopt(2), socket(2), sysctl(3), inet(4), intro(4), ip(4), ttcp(4) V. Jacobson, R. Braden, and D. Borman, TCP Extensions for High Performance, RFC 1323. R. Braden, T/TCP - TCP Extensions for Transactions, RFC 1644.

역사
tcp 프로토콜은 4.2BSD (으)로부터 등장했습니다. 윈도우 슬캘링 및 타임 스탬프에 관한 RFC 1323 의 확장 기능은 4.4BSD 그리고 추가되었습니다.