1. TCP 네트워킹
1.1 TCP 프로토콜 이해
- TCP(Transmission Control Protocol)는 신뢰성 있는 데이터 전송을 보장하는 연결 지향적 프로토콜입니다.
- 주요 특징:
- 연결 지향성: 데이터 전송 전 연결 수립 필요
- 신뢰성 보장: 데이터 손실, 중복, 순서 변경 방지
- 흐름 제어: 송신자와 수신자 간의 데이터 처리 속도 조절
- 혼잡 제어: 네트워크 상황에 따른 데이터 전송량 조절
- 양방향 통신(Full-duplex): 데이터의 동시 송수신 가능
1.2 TCP 통신 기본 개념
- 3-way handshaking을 통한 연결 수립
- SYN: 클라이언트가 서버에 연결 요청
- SYN+ACK: 서버가 클라이언트에 요청 수락
- ACK: 클라이언트가 수락 확인
- 연결 해제는 4-way handshaking으로 진행됩니다.
2. ServerSocket과 Socket 클래스
2.1 ServerSocket 클래스
- Java에서는
java.net.ServerSocket
클래스를 사용하여 TCP 서버를 구현합니다.
- ServerSocket은 서버 측 연결을 담당하는 클래스입니다.
- ServerSocket을 통해 클라이언트의 연결 요청을 수락하고, 클라이언트와 통신할 Socket을 생성합니다.
- 여기서 Socket은 클라이언트와의 실제 데이터 통신을 담당합니다.
- 주의 사항: ServerSocket은 클라이언트의 연결을 수락하고, Socket은 실제 데이터 송수신을 담당합니다.
2.1.1 주요 메서드
- 생성자
ServerSocket()
- 기본 생성자 바운드되지 않은 ServerSocket 생성합니다.
- 생성 후 bind 메서드로 주소와 포트를 지정해야 합니다.
ServerSocket(int port)
- 특정 포트에 바인딩된 ServerSocket 생성합니다.
- 서버의 상태는 LISTEN 상태가 됩니다.
ServerSocket(int port, int backlog)
- 포트와 대기 큐 크기 지정합니다. backlog는 대기열의 최대 길이를 의미합니다.
- backlog는 값은 힌트(hint)로 사용되며, OS가 실제로 다른 값을 사용할 수 있습니다.
- 0이나 음수를 지정하면 OS의 기본값이 사용됩니다.
ServerSocket(int port, int backlog, InetAddress bindAddr)
- 주소와 포트 지정합니다. 주소를 지정하여 특정 네트워크 인터페이스에 바인딩할 수 있습니다.
- 만약 bindAddr을 지정하지 않으면(null) 모든 네트워크 인터페이스에서 들어오는 연결을 수락합니다
- 주요 메서드
Socket accept()
- 클라이언트의 연결 요청을 수락하고 클라이언트와 통신할 Socket을 생성합니다.
- 블로킹 메서드로, 클라이언트 연결 요청이 올 때까지 대기합니다.
void bind(SocketAddress endpoint)
- 서버소켓에 주소와 포트를 바인딩합니다.
- 서버의 상태는 LISTEN 상태가 됩니다.
void close()
2.2 Socket 클래스