네트워크 방화벽, 연결상태 확인을 위해서 가장 많이 쓰는 명령어 중 하나가 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
- 송신 (telnet / 34Byte 데이터 두 번 전송)
- 전송 시 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
- 송신 (telnet / 34Byte 데이터 두 번 전송)
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를 입력해서 정상적으로 종료해야 하는 것과 같은 이치이다.
'알아두면 좋은 IT 지식 > Network' 카테고리의 다른 글
[IT] AIX 포트정보로 프로세스 확인 netstat rmsock tcpcb (0) | 2022.11.09 |
---|---|
"그쪽 네트워크 문제 아니에요?" 네트워크 분쟁의 해결사 TCPDUMP 사용법 (생성~분석) (0) | 2022.11.03 |
[리눅스] TCP 소켓 통신 테스트 명령어 nc(ncat) 사용법 (0) | 2022.07.18 |
[리눅스] 가장 간단한 3가지 통신 테스트 방법 (telnet, curl, /dev/tcp) (0) | 2022.06.24 |
curl post json http telnet sftp 명령어 사용법 옵션 예제 (1) | 2022.02.07 |