아래는 tcpserver의 제작자의 해설을 발췌했습니다.

 

최근 sshd 이외의 전부의 서비스를 inetd+tcpd로부터 제외해 tcpserver(+tcpcontrol)로 했다. 이 구성 변경에는 리부트는 필요 없습니다. inetd를 죽여, 대신의 tcpserver를 서비스의 분만큼 기동하면 끝입니다.

 

이 구성 변경에 의한 이점은 이하와 같은 것이라고 이해하고 있습니다.

(덧붙여서 「낡은 inetd」란, BSD/OS 2.0. 1의 inetd등을 가리킵니다. SunOS 4.1. x의 inetd도 낡은 부류지요. FreeBSD 2.2. [12]-RELEASE의 inetd에는, 동시 접속수의 제어 기능이 있습니다. )

 

● 낡은 inetd에서는, 서비스마다의 동시 접속수를 제어할 수 없다. 이것은 DoS (Denial-of-Service) attack를 부른다. tcpserver에는 이것의 제어 기능이 있다.

 

● 낡은 inetd에서는, 서비스 마다 bind() 하는 주소를 지정할 수 없다. 복수의 주소를 가지고 있는 호스트의 경우, 하나의 주소로만 서비스를 실시하고 싶을 때는 이것은 불편. (mail나 WWW 서비스 전용의 주소를 사용하고 있다 경우 등) tcpserver에는 이것의 제어 기능이 있다.

 

● inetd(낡지 않은 것도)는, 일정 이상의 빈도로 서비스가 기동되면(자), 이상 동작으로 간주해 서비스하는 daemon를 정지해 버린다. 이것은 대규모 서버의 경우는 치명적인 부작용이 될 수도 있다. tcpserver에서는 이런 일은 하지 않는다.

 

● tcpserver는 TCP_NODELAY 옵션을 세트 하거나 IP options를 죽이거나 할 수 있다. inetd에서는 할 수 없다.

 

● tcpcontrol의 액세스 제어 데이타베이스는 hash화 되고 있으므로, 대규모이고 복잡한 액세스 제한에서도 속도가 떨어지지 않는다. tcpd에서는 그런 것은 하고 있지 않다. 이하는 이점이 아니라 차이입니다.

 

● inetd에는 이른바 small servers (e.g., date, discard등)이 조 붐비어져 있지만, tcpserver에는 그렇게 말한 것은 없다.

 

● tcpd는 gethostbyname()를 사용하지만, tcpserver는 자기 부담의 resolver를 가지고 있다. tcpcontrol는 tcpserver가 설정한 환경 변수만을 보기 (위해)때문에, 새로운 resolving는 실시하지 않는다.

 

------------------------------------------------------------------------

[추가] tcpserver는 네트워크 환경을 환경 변수로 설정해 준다. (D. J. Bernstein) 최신판에서는 tcpcontrol의 기능을 포함하고 있습니다.

 

아래에는 tcpserver program의 사용법입니다.

 

사용법

    tcpserver opts host port prog

 

opts는 getopt-style의 일련의 옵션이다. hostport는 하나의 변수이며, prog는 하나 또는 그 이상의 값으로 이루어진다.

 

tcpserver는 TCP 클라이언트의 접속을 기다리다가, 접속시 네트워크에서 설명자(descriptor) 0을 읽고 설명자(descriptor) 1을 쓰고 prog를 실행한다. 또한, 여러가지 환경 변수를 설정한다.

 

서버의 주소는 hostport에 의해 주어지며, port는 /etc/services의 서비스 이름 또는 번호가 사용될 수 있다; 만약 이것이 0이라면 tcpserver는 자유로운(빈) TCP 포트를 선택할 것이다. host의 값은 0이 될수 있으며 이것은 어떠한 로컬 IP 주소의 연결도 허용한다; 점으로 나누어진 십진수 IP 주소일 경우에는 그 주소만의 접속을 허용한다; 호스트 이름이 사용될 경우 qualification을 통한 dns_ip4_qualify를 사용해 얻어낸 첫번째 IP 주소만을 허용한다. tcpserver는 SIGTERM를 받으면 종료한다.

 

옵션

    -q: 아무런 오류를 표시하지 않는다.

    -Q: (기본값) 오류를 표시함.

    -v: 오류와 상태 메세지를 표시함.

    -c n: 동시 접속 숫자를 제한 한다. 만약 n 수 만큼의 prog가 동시에 실행되고 있다면

        그 중 하나의 실행이 종료될 때까지 새 접속을 연기 시킨다.

    -x cdb: tcprules에 의해 컴파일된 cdb 룰 파일을 사용한다.

        tcpserver가 실행되고 있을때 tcprules를 재실행 시킬수 있다.

    -X: -x cdb 옵션과 사용될때 cdb가 없는 경우에도 접속을 허용한다.

        보통 tcpserver는 cdb가 없을 경우 모든 접속을 drop 시킨다.

    -B banner: 접속이 시작될때 곧바로 banner를 네트워크로 보낸다.

        tcpserver는 banner를 보낸 후에 $TCPREMOTEHOST를 확인하고 그 다음

        $TCPREMOTEINFO, cdb 순서대로 체크한다. 이 기능은 클라이언트가 서버로 부터의

        greeting 메세지를 기다리는 각 프로토콜의 지연 시간을 줄일 수 있다.

    -g gid: gid로 그룹 ID를 전환한 후 연결을 준비한다.

    -u uid: uid 유저 ID를 전환한 후 연결을 준비한다.

    -U: -g $GID -u $UID 와 동일하다. 즉, $GID, $UID가 동일 할 경우 사용될 수 있다.

        보통 $GID와 $UID는 envuidgid에 의해 설정된다.

    -1: 연결이 준비된 후에 로컬 포트 번호를 표준 출력으로 프린트 한다.

    -b n: n개의 backlog TCP SYN를 허용한다. 어떤 시스템에서는 n이 5가 최대값이

        될 수 있다. SYN cookie를 지원하는 시스템에서는 backlog는 의미가 없다.

    -o: IP 옵션을 내버려 둔다. 만약 클라이언트가 IP 소스 경로를 따라 패킷을 보내면

        같은 경로로 패킷을 되돌려 보낸다.

    -O: (기본값) IP 옵션을 사용하지 않음. 클라이언트는 IP 소스 경로를 통해 접속하고

        데이터를 보낼수 있지만, 패킷을 기본 경로를 통해 보내진다.

    -d: (기본) 원격 호스트가 느리게 반응할때는 데이터 전송을 약간 지연 시킨다. 이것은

        기본값이며 미래에는 필요 없을 지도 모른다.

    -D: 데이터 전송을 지연하지 않는다; enable TCP_NODELAY.

 

데이터 얻기 옵션:

    -h: (기본) 접속하려는 원격 호스트 이름을 DNS에서 찾고 $TCPREMOTEHOST 환경

         변수로 설정한다.

    -H: 원격 호스트 이름을 DNS에서 찾지 않는다; $TCPREMOTEHOST 환경 변수의 값을

         지운다. TCP 53번 포트 사용시에는 반듯이 이 옵션을 사용해야 한다.

    -p: Paranoid. 원격 호스트 이름을 DNS에서 찾은 후에 실제 접근하는 IP주소와 대조하여

         동일 하지 않다면 $TCPREMOTEHOST 환경 변수값을 지운다.

    -P: (기본) 위 Paranoid 옵션을 끔. -l localname: 로컬 호스트 이름을 DNS에서 찾지

         않음; localname을 $TCPLOCALHOST 환경 변수 값으로 사용한다. 일반적으로

         localname의 값은 0으로 설정한다. TCP 53번 포트 사용시에는 반듯이 이 옵션을

         사용해야 한다

    -r: (기본) $TCPREMOTEINFO값의 획득을 접속하는 원격 호스트에 시도한다.

    -R: -r의 반대로 $TCPREMOTEINFO값의 획득을 시도하지 않는다. TCP 53번과 113번

         포트 사용시에는 반듯이 이 옵션을 사용해야 한다

    -t n: $TCPREMOTEINFO값을 얻기 위한 시도후 n초안에 결과가 없으면 포기한다.

        기본값: 26