TCP/IP 프로토콜을 이용하여 통신을 진행할 때, 두 종단 간 정확한 데이터 전송을 보장하기 위해 연결을 설정하고 해제하는 과정을 이해하는 것은 매우 중요하다.
3-way Handshake는 TCP/IP 프로토콜을 이용하여 두 종단 간 연결을 설정하는 과정이다.
TCP는 양방향성 연결을 보장해야 한다. 클라이언트에서 서버에게 자신의 존재를 알리고 패킷을 보낼 수 있는 것처럼, 서버에서도 클라이언트에게 자신의 존재를 알리고 패킷을 보낼 수 있다는 신호를 보내야 한다. 따라서 3-way Handshake가 필요하다.
처음에 클라이언트에서 SYN 패킷을 보낼 때 Sequence Number에는 랜덤한 숫자가 담긴다. Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용되고 시간이 지나면 재사용된다. 만약 Sequence Number가 순차적인 숫자로 전송된다면, 서버는 이전의 Connection으로부터 전송되는 패킷으로 인식할 수 있다. 이를 방지하기 위해 난수로 초기 Sequence Number를 설정한다.
4-way Handshake는 TCP/IP 프로토콜을 이용하여 두 종단 간 연결을 해제하는 과정이다.
클라이언트에서 FIN 패킷 전송 후 ACK 패킷을 기다리는 FIN_WAIT1
과 서버의 ACK 패킷을 받은 후 FIN 패킷을 기다리는 FIN_WAIT2
에러 발생으로 인해 타임아웃이 되면 스스로 연결을 종료한다. 그러나, CLOSE_WAIT
상태는 Application이 close()
를 적절하게 처리하지 못하면 CLOSE_WAIT
상태로 계속 기다리게 되어 Socket Hang Up 에러가 발생할 수 있다.
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String[] args) {
try {
// 서버에 연결 요청
Socket socket = new Socket("localhost", 8080);
// 서버에 메시지 전송
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello Server");
// 서버로부터 메시지 수신
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = in.readLine();
System.out.println("Server: " + response);
// 연결 종료
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class TCPServer {
public static void main(String[] args) {
try {
// 서버 소켓 생성
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is listening on port 8080");
// 클라이언트 연결 수락
Socket clientSocket = serverSocket.accept();
// 클라이언트로부터 메시지 수신
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = in.readLine();
System.out.println("Client: " + message);
// 클라이언트에 메시지 전송
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.println("Hello Client");
// 연결 종료
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP/IP 통신에서 3-way Handshake는 연결을 설정하고 4-way Handshake는 연결을 해제하는 데 사용된다. 이 과정들을 이해하는 것은 안정적인 네트워크 프로그래밍을 구현하는 데 필수적이다. 각 단계에서 발생할 수 있는 에러와 이를 처리하는 방법을 숙지하는 것이 중요하다.