준비물 : 아무도 사용하고 있지 않은 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 가 정상적으로 오는 것을 확인할 수 있음.
고려해봐야할 점
라우터를 조작했다는?
'💻 CS [Computer Science] > 🌼 Network' 카테고리의 다른 글
서버가 SNK + ACK 를 보내지 않은 이유 (0) | 2025.03.10 |
---|