6월 5일 - HandShake

Yullgiii·2024년 6월 5일
0
post-thumbnail

3-way Handshake와 4-way Handshake

TCP/IP 프로토콜을 이용하여 통신을 진행할 때, 두 종단 간 정확한 데이터 전송을 보장하기 위해 연결을 설정하고 해제하는 과정을 이해하는 것은 매우 중요하다.

3-way Handshake

3-way Handshake는 TCP/IP 프로토콜을 이용하여 두 종단 간 연결을 설정하는 과정이다.

연결 과정

  1. SYN: 클라이언트는 서버에 접속을 요청하는 SYN 패킷을 보낸다.
  2. SYN/ACK: 서버는 클라이언트의 요청인 SYN 패킷에 대한 응답으로 ACK 패킷과 클라이언트도 포트를 열어달라는 SYN 패킷을 보낸다.
  3. ACK: 클라이언트는 ACK 패킷과 SYN 패킷을 받고 이에 대한 응답으로 ACK 패킷을 보낸다. 이로써 연결이 성립된다.

왜 2-way가 아닌 3-way일까?

TCP는 양방향성 연결을 보장해야 한다. 클라이언트에서 서버에게 자신의 존재를 알리고 패킷을 보낼 수 있는 것처럼, 서버에서도 클라이언트에게 자신의 존재를 알리고 패킷을 보낼 수 있다는 신호를 보내야 한다. 따라서 3-way Handshake가 필요하다.

참고

처음에 클라이언트에서 SYN 패킷을 보낼 때 Sequence Number에는 랜덤한 숫자가 담긴다. Connection을 맺을 때 사용하는 포트는 유한 범위 내에서 사용되고 시간이 지나면 재사용된다. 만약 Sequence Number가 순차적인 숫자로 전송된다면, 서버는 이전의 Connection으로부터 전송되는 패킷으로 인식할 수 있다. 이를 방지하기 위해 난수로 초기 Sequence Number를 설정한다.

4-way Handshake

4-way Handshake는 TCP/IP 프로토콜을 이용하여 두 종단 간 연결을 해제하는 과정이다.

연결 해제 과정

  1. FIN: 클라이언트는 서버에게 연결을 종료하겠다는 FIN 패킷을 보낸다.
  2. ACK: 서버는 클라이언트의 FIN 패킷에 대한 응답으로 ACK 패킷을 보낸다.
  3. FIN: 서버는 모든 통신이 끝나면 연결을 종료하겠다는 FIN 패킷을 보낸다.
  4. ACK: 클라이언트는 서버의 FIN 패킷에 대한 응답으로 ACK 패킷을 보낸다. 이후 서버는 소켓 연결을 종료한다.

에러 발생

클라이언트에서 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();
        }
    }
}

So...

TCP/IP 통신에서 3-way Handshake는 연결을 설정하고 4-way Handshake는 연결을 해제하는 데 사용된다. 이 과정들을 이해하는 것은 안정적인 네트워크 프로그래밍을 구현하는 데 필수적이다. 각 단계에서 발생할 수 있는 에러와 이를 처리하는 방법을 숙지하는 것이 중요하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글