텔넷은 인터넷상의 다른 컴퓨터로 로그인을 할 수 있게 하는 프로토콜이다. 텔넷에서 클라이언트는 입력 디바이스(키보드)와 출력 디바이스(모니터)를 가지며, 텔넷 서버 프로그램을 띄우고 있는 원격 호스트에 로그인 한다. 이때 원격 호스트의 입력과 출력은 클라이언트의 입력과 출력으로 대치된다. 텔넷 프로토콜의 기본목표는 텔넷 데몬과 텔넷 클라이언트를 통한 원격 로그인이지만 많은 다른 용도로 사용될 수도 있다.
원격로그인은 모니터와 키보드는 그대로인대 컴퓨터 본체만 원격지에 있는 것으로 대치된다는 말이다. 이렇게 될 경우 원격지의 컴퓨터는 키보드와 모니터의 상태 즉 터미널의 상태를 직접적으로 제어할 수가 없다. 즉 터미널의 크기라든지, 어떤 문자를 보내면 어떤 문자가 찍히는 지를 알 수가 없다. 때문에 원격지의 컴퓨터가 클라이언트의 터미널을 제어하기 위한 약속이 필요하다. 그것이 바로 텔넷 프로토콜이다. 텔넷 프로토콜은 RFC854에 정의되어 있다.
텔넷 프로토콜의 가장 기본적인 것은 Network Virtual Terminal(NVT)라는 제어 문자 집합이다. NVT는 기본적인 터미널 제어 문자들을 정의해 놓았기 때문에 텔넷 클라이언트는 이 문자들을 적절히 해석해서 터미널을 세팅할 수 있어야 한다. NVT는 다음과 같은 것들을 정의해 놓았다.
Line Feed |
LF |
10 |
Carriage Return |
CR |
13 |
Bell |
BEL |
7 |
Backspace |
BS |
8 |
Horizontal Tab |
HT |
9 |
Vertical Tab |
VT |
11 |
Form Feed |
FF |
12 |
NVT는 모두 우리가 알고있는 ascii 문자셋이다. 실제 프로그래밍시 문제가 되는것은 LF와 CR의 처리이다. 서버 프로그램마다 LF와 CR의 처리 방법이 다르기 때문이다. 또한 한글을 처리할 수 있도록 8bit를 사용한다면 보통 LF의 처리가 제대로 안된다. 여기서 제작할 텔넷 클라이언트는 정확한 스펙에 다르기 보다는 융통성있게 사용될 수 있도록 경험에 의거해 이러한 것을 다루었다.
텔넷 프로토콜은 서버와 클라이언트 서로를 제어하기 위하여 많은 명령어를 사용한다. 이러한 명령어는 IAC(interpret as command)문자 다음에 보내진다. IAC는 아스키 코드 255번이다.
이름 |
ASCII |
의미 |
SE |
240 |
End of sub-negotiation parameters |
NOP |
241 |
No Operation |
DM |
242 |
Data Mark. 데이터 스트림내의 SYNCH 이벤트 위치를 나타낸다. 반드시 TCP Urgent Notification과 함께 한다. |
BRK |
243 |
Break. "break" 혹은 "attention" 키가 눌러졌음을 나타내는 명령어. |
IP |
244 |
NVT가 연결된 프로세스를 Suspend, Interrupt, 혹은 Abort하는 명령어. |
AO |
245 |
Abort Output. 현재 프로세스가 수행을 종료하게 하지만, 사용자에게 출력을 전송하지는 않는다. |
AYT |
246 |
Are You There. AYT가 수신된 가시적인 증거들을 NVT로 되돌려보낸다. |
EC |
247 |
Erase Character. 수신자는 데이터 스트림에서 가장 최근의 삭제되지 않은 문자를 삭제해야 한다. |
EL |
248 |
Erase Line. 데이터 스트림에서 이전의 CRLF를 포함하지 않는 문자들을 삭제한다. |
GA |
249 |
Go Ahead. 특정상황에서 상대편에게 전송가능함을 알려주는데 사용하는 명령어. |
SB |
250 |
SuB-negotiation. 서브옵션을 받으라는 명령어. |
WILL |
251 |
해당 옵션을 사용하겠다는 것을 알려주는 명령어. |
WONT |
252 |
해당 옵션을 사용하지 않겠다는 것을 알려주는 명령어. |
DO |
253 |
해당 옵션을 사용하라고 상대편에게 요청하는 명령어. |
DONT |
254 |
해당 옵션을 사용하지말라고 상대편에게 요청하는 명령어. |
IAC |
255 |
Interpret As Command |
표에서 보듯이 수많은 텔넷 명령어가 있지만 실제적으로 모두 다 사용되고 있는것은 아니다. 옵션을 받으라는 WILL, WONT, DO, DONT 와 서브옵션을 받으라는 SB, 서브옵션의 끝을 말하는 SE, 그리고 이전의 단방향 터미널과 호환성을 지니기 위해 쓰이는 GA가 주로 쓰이는 명령어이다.
텔넷의 거의 모든것은 주로 옵션을 통해 설정된다. 이 옵션들은 언제든지 재설정될 수 있으며, 서버나 클라이언트 어느 쪽에서도 설정할 수 있다. 옵션의 정확한 스펙은 각각의 rfc를 참고하여야 한다.
ASCII |
이름 |
RFC번호 |
1
|
echo
|
857
|
3
|
suppress go ahead
|
858
|
5
|
status
|
859
|
6
|
timing mark
|
860
|
24
|
terminal type
|
1091
|
31
|
window size
|
1073
|
32
|
terminal speed
|
1079
|
33
|
remote flow control
|
1372
|
34
|
linemode
|
1184
|
36
|
environment variables
|
1408 |
< 중요한 옵션들의 rfc 번호 >
옵션은 클라이언트나 서버 어느 한쪽에서 요구를 하여, 다른 한쪽에서 그것에 응답하는 형태로 설정된다. 옵션을 요구할 때는
IAC + <요구의 형태(텔넷 명령어)> + <옵션>
의 차례로 코드를 보내며, 응답 또한 같은 방식이다.
요구의 형태는 다음의 4가지가 있다.
기호
|
ASCII
|
요구형태
|
WILL
|
251
|
옵션을 사용하겠다.
|
DO
|
252
|
(상대에게) 옵션을 사용하라
|
WONT
|
253
|
옵션을 사용하지 않겠다.
|
DONT
|
254
|
(상대방에게) 옵션을 사용하지 마라. |
WILL이나 WONT는 옵션을 요구하는 쪽이 그 옵션을 사용 또는 사용하지 않겠다는 뜻이며, DO나 DONT는 상대방측에 옵션을 사용 또는 사용하지 말라고 요구하는 것이다. 한쪽에서 요구를 하면 상대방은 응답을 해야 한다.
요구와 응답의 조합은 다음의 경우만이 가능하다.
요구 |
응답 |
응답의 의미 |
WILL |
DO |
옵션 사용을 허락한다. |
WILL |
DONT |
옵션 사용을 허락하지 않는다. |
DO |
WILL |
옵션을 사용하겠다. |
DO |
WONT |
옵션을 사용할 수 없다. |
WONT |
DONT |
옵션을 사용하지 않겠다. |
DONT |
WONT |
옵션을 사용하지 마라. |
SB 명령어는 서브 옵션을 필요로 할때 사용된다. 터미널 타입이나, 터미널의 크기 등을 보내고 받을 때에는 하나 이상의 옵션 파라미터가 필요하므로 이러한 서브옵션을 사용한다.
텔넷 클라이언트로 텔넷의 옵션 협상 과정을 살펴보자. 아래 화면은 일반 텔넷을 사용하여 유닉스 시스템에 로그인 할때 텔넷이 주고 받는 옵션들이다.
$ telnet
telnet> toggle options
Will show option processing.
telnet> open localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SENT DO SUPPRESS GO AHEAD
SENT WILL TERMINAL TYPE
SENT WILL NAWS
SENT WILL TSPEED
SENT WILL LFLOW
SENT WILL LINEMODE
SENT WILL OLD-ENVIRON
SENT DO STATUS
SENT WILL XDISPLOC
RCVD DO TERMINAL TYPE
RCVD DO TSPEED
RCVD DO XDISPLOC
RCVD DO NEW-ENVIRON
SENT WONT NEW-ENVIRON
RCVD WILL SUPPRESS GO AHEAD
RCVD DO NAWS
SENT IAC SB NAWS 0 80 (80) 0 25 (25)
RCVD DO LFLOW
RCVD DONT LINEMODE
RCVD DONT OLD-ENVIRON
RCVD WILL STATUS
RCVD IAC SB TERMINAL-SPEED SEND
SENT IAC SB TERMINAL-SPEED IS 9600,9600
RCVD IAC SB X-DISPLAY-LOCATION SEND
SENT IAC SB X-DISPLAY-LOCATION IS "monac:0.0"
RCVD IAC SB TERMINAL-TYPE SEND
SENT IAC SB TERMINAL-TYPE IS "XTERM"
RCVD DO ECHO
SENT WONT ECHO
RCVD WILL ECHO
SENT DO ECHO
Debian GNU/Linux 1.3 monac.hackers.org
monac login: Connection closed by foreign host.