Socket이 서버에 연결 요청을 하는 방법은 네트워크의 TCP/IP 프로토콜을 기반으로 합니다. Socket 프로그래밍에서 클라이언트 소켓을 생성하고 서버에 연결 요청을 하는 과정은 다음과 같습니다:
클라이언트 소켓 생성: 클라이언트는 Socket 객체를 생성함으로써 서버에 연결을 시도합니다. 이때, 서버의 IP 주소와 포트 번호를 Socket 생성자에 전달해야 합니다. 이 정보를 통해 클라이언트는 서버를 식별할 수 있습니다.
연결 요청: Socket 객체가 생성되면, 클라이언트는 서버의 IP 주소와 포트 번호를 사용하여 서버에 연결 요청을 보냅니다. 이 단계에서 TCP/IP 프로토콜의 3-way handshake가 발생합니다.
SYN: 클라이언트가 서버에 연결 요청을 함(SYN 패킷 전송).
SYN-ACK: 서버가 클라이언트의 연결 요청을 수락하고, 클라이언트에게 응답함(SYN-ACK 패킷 전송).
ACK: 클라이언트가 서버의 응답을 확인하고, 연결이 성공적으로 수립됨을 알림(ACK 패킷 전송).
데이터 송수신 준비: 연결이 성공적으로 수립되면, 클라이언트와 서버는 데이터를 송수신할 준비가 됩니다.
****각각의 Socket 객체는 입력 스트림과 출력 스트림을 가지고 있어, 이를 통해 데이터를 주고받을 수 있습니다.
연결 종료: 데이터 송수신이 완료되면, 클라이언트 또는 서버 어느 한 쪽이든 연결을 종료할 수 있습니다. TCP/IP 프로토콜의 4-way handshake를 통해 안전하게 연결을 종료합니다.
FIN: 클라이언트는 서버에게 연결 종료를 요청하는 FIN (Finish) 패킷을 보냅니다.
ACK: 서버는 클라이언트의 종료 요청을 받고, ACK (Acknowledgement) 패킷을 보내 이를 확인합니다. 이 시점에서 서버는 클라이언트로부터 더 이상 데이터를 받지 않지만, 서버가 클라이언트에게 보낼 데이터가 남아 있다면 전송을 완료할 수 있습니다.
FIN: 서버가 클라이언트에게 보낼 모든 데이터를 전송 완료했으면, 서버는 클라이언트에게 FIN 패킷을 보내 연결 종료를 요청합니다.
ACK: 클라이언트는 서버의 종료 요청을 받고, ACK 패킷을 보내 이를 확인합니다. 이 후, 클라이언트는 연결을 완전히 종료합니다.
왜 연결 할 땐 3-way handshake고 연결 종료 할 때는 4-way handshake 인가요 ?
이러한 과정을 통해 Socket은 서버에 연결 요청을 하고, 데이터를 송수신할 수 있게 됩니다. Socket 프로그래밍은 이러한 저수준의 세부 사항을 추상화하여, 개발자가 네트워크 통신을 보다 쉽게 구현할 수 있도록 합니다.