본문 바로가기

💻 CS [Computer Science]/🌼 Network

Telnet 은 안되고, Java Socket을 사용한 TCP connection 됐던 이유가 무엇인가?

준비물  : 아무도 사용하고 있지 않은 PORT  =  192.0.2.123


1. telnet <IP> 로 TCP Connection 시도

$ telnet 192.0.2.123

 

일정 시간이 지나자 connect to address 192.0.2.123: Operation timed out 이 발생함.

원격 서버에 연결할 수 없다는 의미의 Unable to connect to remote host 라는 메시지가 출력됨. 

 


2. TCP HEALTH CHECK를 위한 API 만들기 (Controller 코드 생략)

package org.ktorms.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


import java.io.IOException;
import java.net.*;

@Slf4j
@Service
public class HealthCheckService {

    public boolean isHealthy() {

        System.out.println("HealthCheckService.isHealthy");

        String server = "192.0.2.123"; // 사용하지 않는 코드 입력
        int port = 23; // telnet 명령어 시 binding 되는 port 번호 입력

        try (Socket socket = new Socket()) {
            socket.connect(new InetSocketAddress(server, port), 10000);
            log.info("connected to " + server + ":" + port);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage());
            return false;
        }
    }
}

3. http://localhost:8080/health-check API 호출 

 

   3-1. Timeout 시간을 10000ms(1분) 로 지정

 

TCP HEALTH CHECK를 위한 API를 호출했지만, 

Connect timed out 이 발생했다.


   3-2. Timeout 시간 미지정

 

그렇다면 Timeout 시간을 Java 코드에서 명시하지 않는다면 어떻게 될까?

package org.ktorms.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


import java.io.IOException;
import java.net.*;

@Slf4j
@Service
public class HealthCheckService {

    public boolean isHealthy() {

        System.out.println("HealthCheckService.isHealthy");

        String server = "192.0.2.123";
        int port = 23;

        try (Socket socket = new Socket()) {
            // 타임아웃 시간 지정하지 않음
            socket.connect(new InetSocketAddress(server, port));
            log.info("connected to " + server + ":" + port);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage());
            return false;
        }
    }
}

 

동일하게 Connection timed out 이 발생했다.


4. 정상적인 주소로 Health Check API 호출해보기

네이버 도메인으로 connection 시도하기

package org.ktorms.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;


import java.io.IOException;
import java.net.*;

@Slf4j
@Service
public class HealthCheckService {

    public boolean isHealthy() {

        System.out.println("HealthCheckService.isHealthy");

        String server = "naver.com";
        int port = 80;

        try (Socket socket = new Socket()) {
            // 1. 소켓 연결 설정 (5초 타임아웃)
            socket.connect(new InetSocketAddress(server, port), 3000);
            log.info("connected to " + server + ":" + port);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage());
            return false;
        }
    }
}

 

 

정상적으로 로그가 찍힌 걸 보니 connection 이 정상적으로 이루어진 것을 알 수 있다.


5. 존재하는 IP로 API를 요청했을 경우, 열려있지 않은 port 로 요청을 했을 경우

Connection refused 가 정상적으로 오는 것을 확인할 수 있음.



고려해봐야할 점

라우터를 조작했다는?