본문 바로가기

알아두면 좋은 IT 지식/Network

[IT] Telnet의 전송키는 Enter키가 아니다? (Not Enter But Ctrl+D?)

네트워크 방화벽, 연결상태 확인을 위해서 가장 많이 쓰는 명령어 중 하나가 Telnet이다.

그리고 Telnet을 사용해서 연결 테스트뿐만 아니라 데이터의 송수신도 할 수 있는데, 이 때 많은 사람들이 보통 데이터를 입력한 후 Enter키를 입력해서 전송을 실행하고 크게 문제없이 사용했을 수도 있다.

하지만 조금 더 정확한 테스트르 위해서는 Enter키가 아닌 반드시 Ctrl+D 예약키를 사용하는 것이 맞다.

 

그럼 왜 그런지 tcpdump와 수신프로그램의 java stacktrace log를 통해서 실제 동작의 차이를 확인해 보겠다.

먼저 tcpdump 분석 결과부터 확인해 보자.

 

TCP DUMP

  • 전송 시 Enter 키 사용
    • 송신 (telnet / 34Byte 데이터 두 번 전송)
      • $ telnet 10.0.2.15 7717
      • 0034111111111111111111112222222222 + Enter
      • 0034111111111111111111112222222222 + Enter
      • Connection closed by foreign host.
    • 수신 (tcpdump / 데이터 Push 라인만 추출)
      • $ tcpdump -i enp0s3 -nn -vvv tcp port 7717
      • 09:43:58.140918 IP (tos 0x10, ttl 64, id 38935, offset 0, flags [DF], proto TCP (6), length 88) 10.0.2.16.30274 > 10.0.2.15.7717: Flags [P.], cksum 0x7951 (correct), seq 1:37, ack 1, win 502, options [nop,nop,TS val 3679678682 ecr 1521057319], length 36
      • 09:43:59.305767 IP (tos 0x10, ttl 64, id 38936, offset 0, flags [DF], proto TCP (6), length 88) 10.0.2.16.30274 > 10.0.2.15.7717: Flags [P.], cksum 0x4f77 (correct), seq 37:73, ack 1, win 502, options [nop,nop,TS val 3679679847 ecr 1521066832], length 36

 

  • 전송 시 Ctrl+D 키 사용
    • 송신 (telnet / 34Byte 데이터 두 번 전송)
      • $ telnet 10.0.2.15 7717
      • 0034111111111111111111112222222222 + Ctrl+D
      • 0034111111111111111111112222222222 + Ctrl+D
    • 수신 (tcpdump / 데이터 Push 라인 추출)
      • $ tcpdump -i enp0s3 -nn -vvv tcp port 7717
      • 09:47:40.293709 IP (tos 0x10, ttl 64, id 61600, offset 0, flags [DF], proto TCP (6), length 86) 10.0.2.16.30276 > 10.0.2.15.7717: Flags [P.], cksum 0x0da9 (correct), seq 1:35, ack 1, win 502, options [nop,nop,TS val 3679901238 ecr 1521285535], length 34
      • 09:47:41.529499 IP (tos 0x10, ttl 64, id 61601, offset 0, flags [DF], proto TCP (6), length 86) 10.0.2.16.30276 > 10.0.2.15.7717: Flags [P.], cksum 0xf9a5 (correct), seq 35:69, ack 1, win 502, options [nop,nop,TS val 3679902474 ecr 1521289388], length 34

 

tcpdump 결과를 보면 분명히 동일한 34byte를 전송했는데 Enter키를 입력하여 전송하면 length가 36으로 찍히고 두 번째 데이터를 전송하면 송신 시 Connection closed by foreign host. 메시지가 찍히면서 telnet 연결이 자동으로 끊긴다.

수신 프로그램에서 java stacktrace log를 확인해보면 아래와 같다.

 

Java StackTrace Log

  • 전송 시 Enter 키 사용
    • 첫 번째 데이터 전송 성공
    • 두 번째 데이터 전송 시 Exception 발생

<<__Exception__>>

java.lang.NumberFormatException: For input string: "

00"

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

at java.lang.Integer.parseInt(Integer.java:569)

at java.lang.Integer.parseInt(Integer.java:615)

......

at jeus.io.impl.StreamHandlerImpl.readMessage(StreamHandlerImpl.java:289)

at jeus.io.impl.nio.handler.NIOStreamHandler.readContent(NIOStreamHandler.java:135)

at jeus.io.impl.nio.handler.NIOStreamHandler.waked(NIOStreamHandler.java:101)

at jeus.io.impl.nio.NIOSelector.runWaked(NIOSelector.java:623)

at jeus.io.impl.nio.NIOSelector.processWakedStreamHandlers(NIOSelector.java:557)

at jeus.io.impl.nio.NIOSelector.run(NIOSelector.java:337)

at java.lang.Thread.run(Thread.java:748)

<<__!Exception__>>

 

  • 전송 시 Ctrl+D 키 사용
    • 첫 번째 데이터 전송 성공
    • 두 번째 데이터 전송 성공

 

Java log를 확인해 보면 Enter 키 사용 시 두번째 데이터를 전송하면 NumberFormatException이 발생하고 "" 00""이 줄바꿈 되어 찍혀있다.

즉, 첫번째 데이터 전송 시 원래 전송하고자 했던 34Byte + Enter키가 입력되면서 2Byte의 줄바꿈 데이터가 추가로 전송 되어 두 번째 데이터 전송에 영향을 미친 것이다.

이는 데이터를 한번 만 전송했을 때는 쉽게 알아차릴 수 없지만 연속해서 데이터를 전송하다 보면 Exception이 발생하고 다음 데이터의 전송이 정상적으로 처리되지 않으면서 서버측에서 연결을 끊는 현상을 확인할 수 있다. (이 경우 상황에 따라서 첫번째 데이터의 전송도 실패할 수 있다.)

 

정리하자면 Telnet 사용 시 데이터를 전송하기 위해서는 반드시 Ctrl + D 키를 사용해야 하고, Enter 키를 사용하는 것은 \n(줄바꿈)을 추가로 전송하는 것과 같다. (Not Enter But Ctrl+D가 아니라 Only Ctrl+D)

이는 telnet 종료 시 Ctrl+C키를 입력해서 강제종료 하는 것이 아닌 Ctrl+] 키를 입력한 후 q를 입력해서 정상적으로 종료해야 하는 것과 같은 이치이다.

 

 

 

 

내손내쓴 출처 : https://blog.naver.com/uutopia1/222840119220