- 네트워크에서 두 컴퓨터 간의 ‘실시간 양방향 통신’을 제공하는 기술을 의미합니다. 양방향 통신은 송신자 측이 데이터를 수신할 수도 있으며, 수신자 측이 데이터를 송신할 수 있는 구조를 가집니다.
- 두 컴퓨터 간에는 '특정 IP 주소와 포트번호'의 조합으로 네트워크 간의 연결을 수행하며, 수신자(클라이언트)는 데이터를 요청하면 송신자(서버)에서는 요청에 대한 응답을 제공해 주는 '클라이언트-서버' 모델을 사용하여 데이터를 송수신할 수 있습니다. - 소켓 통신은 'TCP'와 'UDP'라는 두 가지 주요 프로토콜을 사용할 수 있습니다. 이러한 프로토콜을 통해 웹 서버, 이메일 서버, 데이터베이스 서버 등 다양한 응용 프로그램에서 사용되며, 실시간 통신, 스트리밍, 온라인 게임 등에서도 사용됩니다.
네트워크를 통해 전송되는 데이터의 기본단위를 의미합니다. 하나의 정보는 여러개의 패킷으로 나누어져 전송되며, 출발지와 목적지 정보(메타데이터)와 실제 전송되는 데이터(페이로드)로 구성이 되어 있습니다.
소켓(Socket)
네트워크를 통해 데이터(패킷)을 전송하기 위한 일종의 ‘통로’를 의미합니다.
채널(Channel)
서버와 클라이언트 간에 데이터를 주고 받는 ‘전송 경로’를 의미합니다. 이 채널을 통해 데이터는 송신자에서 수신자로 전달되며, 데이터의 전송방향(일방향 또는 양방향)과 전송 모드(단일 대화 또는 다중 대화)에 따라 구분될 수 있습니다.
클라이언트(Client)
데이터를 요청하는 측으로 서버와 연결을 하여 서버로부터 데이터를 받는 역할을 수행합니다.
서버(Server)
데이터를 요청을 받아 응답하여 클라이언트에게 데이터를 전송하는 역할을 수행합니다.
TCP(Transmission Control Protocol)
연결 지향적인 프로토콜로, 데이터를 전송하기 전에 송신자와 수신자 간의 연결을 설정합니다. 그 후 패킷으로 나누어 전송하고 패킷이 수신자에게 전송되었는지 확인합니다.
UDP(User Datagram Protocol)
비연결 지향적인 프로토콜로, 패킷을 수신자에게 보내고 패킷이 정확하게 도착했는지 확인하지 않습니다. TCP보다는 빠르지만 패킷 순서나 손실에 대한 보장이 없어 신뢰성이 낮습니다
HandShake
각각 네트워크에서 연결을 설정하는 단계를 의미합니다. 이는 통신이 시작되기 전에 두 장치 사이에 통신 세션을 설정하고 서로 데이터 전송을 준비하는 과정을 의미합니다.
[ 더 알아보기 ] 💡 서버 - 서버 관계에서 소켓통신을 하는 경우 누가 클라이언트고 누가 서버가 되는가?
- 통신을 시작하는 측(즉, 연결 요청을 보내는 측)이 클라이언트가 되고, 통신 요청을 받아들이는 측이 서버가 됩니다. 이 경우에도 일반적인 클라이언트-서버 모델이 유지됩니다. - 한 서버가 다른 서버에 연결을 요청하면, 요청을 보낸 서버는 클라이언트 역할을 하고, 요청을 받은 서버는 서버 역할을 합니다.
- 서버-클라이언트 패턴의 경우 서버가 중앙 위치하고 클라이언트가 서버에 연결하여 데이터를 요청하고 받는 구조입니다. - 피어-투-피어 패턴의 경우 모든 노드(피어)가 서로 동등한 관계로 데이터를 공유하고 교환하는 구조입니다. - 클라이언트가 요청을 하면, 서버에서는 클라이언트의 연결을 대기하고 클라이언트가 연결을 시작합니다. 연결이 설정되면 데이터를 전송할 수 있습니다.
- 사람들이 처음 만났을 때, 처음 만났을 때 손을 잡고 흔드는 악수의 행동에서 유래가 되었습니다. 악수는 일반적으로 서로의 존재를 인정하고 상호 작용을 시작하겠다는 의사 표시입니다. 이와 같이 두 컴퓨터가 통신을 시작하기 전에 서로를 인지하고 연결 준비를 확인하는 과정을 의미합니다. 이 과정을 거치면 양방향 통신이 가능한 안정적인 연결이 만들어집니다.
- 3-way 핸드셰이크의 경우는 두 컴퓨터 간의 TCP/IP 통신을 위해 연결을 하는 과정에서 수행이되며, 4-way 핸드셰이크의 경우에는 두 컴퓨터 간의 연결된 상태에서 해제되는 과정에서 수행이 됩니다.
[ 더 알아보기 ] 💡 핸드셰이킹(HandShaking)의 경우 매번 수행이 되는걸까?
- TCP/IP 통신에서는 새로운 연결이 생성될 때마다 3-way 핸드셰이크 과정이 수행됩니다. 클라이언트가 서버에 연결을 요청하고, 서버가 그 요청을 수락하며, 클라이언트가 그 수락을 확인하는 과정이 이루어집니다. - 그러나 한번 연결이 수립되면, 그 연결이 종료될 때까지는 추가적인 핸드셰이크가 필요하지 않습니다. 이후 데이터는 이미 수립된 연결을 통해 전송됩니다.
- 네트워크에서 연결을 설정하는 단계를 의미합니다. 이는 통신이 시작되기 전에 두 장치 사이에서 통신 세션을 설정하고 서로 데이터 전송을 준비하는 과정입니다. - TCP/IP 프로토콜에서는 3-Way 핸드셰이크라는 과정을 사용하여 연결을 설정하며, 이를 통해 두 장치가 서로 데이터를 제대로 보내고 받을 수 있음을 확인합니다.
용어
설명
SYN(Synchronize)
동기화(Synchronize) 패킷으로 TCP 연결을 초기화 하는데 사용되며, 클라이언트가 서버에 연결을 시작하고자 할때 보내집니다.
SYN-ACK(Synchronize-Acknowledgment)
동기화 패킷에 대한 응답으로 SYN 패킷을 받은 서버가 클라이언트에게 보내지는 패킷입니다. 이 패킷을 통해 서버가 클라이언트의 연결 요청을 수락하고 클라이언트와 서버 간의 연결이 성립되었음을 나타냅니다.
ACK(Acknowledgment)
확인(Acknowledgment) 패킷으로 데이터가 성공적으로 수신되었음을 보내는 측에 알리는데 사용됩니다.
- 네트워크에서 연결이 되고 데이터 전송이 완료된 후에 연결을 안전하게 종료하기 위한 단계를 의미합니다.
용어
설명
FIN(Finished)
클라이언트에서 서버로 또는 서버에서 클라이언트로 연결 조욜를 요청하는데 사용되는 패킷을 의미합니다. 이는 통신 양방향이므로 어느 쪽이든 연결을 종료할 수 있습니다.
ACK(Acknowledgment)
데이터가 성공적으로 수신이 되었음을 나타내는 의미입니다
https://velog.io/@yhm8622/TCP-4-way-Handshake
💡 4-Way 핸드셰이크 예시 1. 클라이언트는 서버에게 ‘연결 종료 요청(FIN)’ 메시지를 보냅니다.
- 해당 메시지는 서버에게 클라이언트가 ‘더 이상 데이터를 보내지 않겠다’라는 의미로 메시지를 전송합니다.
2. 서버는 클라이언트로부터 메시지를 받고 ‘연결 종료 요청 수락(ACK)’ 메시지를 응답합니다.
- 해당 시점에서 서버는 아직 클라이언트에게 보낼 데이터가 있으므로, 서버에서 클라이언트로의 데이터 전송은 계속 될 수 있습니다.
3. 서버는 클라이언트에게 ‘연결 종료 요청(FIN)’ 메시지를 보냅니다.
- 해당 메시지는 클라이언트에게 ‘더 이상 데이터를 보내지 않겠다’라는 의미로 메시지를 전송합니다.
4. 클라이언트는 서버로부터 메시지를 받고 ‘연결 종료 수락(ACK)’ 메시지를 응답합니다.
- 해당 메시지는 클라이언트가 서버의 메시지를 받았음을 확인하는 메시지를 서버에게 전송합니다.
[ 더 알아보기 ] 💡 4-Way 핸드셰이크에서 두 번의 FIN 요청이 필요한 이유
- TCP 연결이 전이중(duplex) 연결이기 때문입니다. 전이중 연결에서는 양쪽 모두 독립적으로 데이터를 전송할 수 있으므로, 한 쪽이 연결을 종료하더라도 다른 쪽에서는 계속해서 데이터를 전송할 수 있습니다. - 그래서 각각의 방향에 대해 별도로 연결 종료 절차를 수행해야하며, 이 때문에 두 번의 FIN 요청이 필요하게 됩니다.
💡 소켓 통신 수행과정 : 송신 측 관점(Client Socket) 1. 클라이언트 소켓 생성 : socket()
- 송신 측인 클라이언트에서 ‘소켓’을 생성합니다. 이 소켓은 서버에 연결 요청을 보내기 위해 사용이 됩니다.
2. 연결 요청 : connect() :: 3-Way 핸드셰이크 수행
-클라이언트는 생성한 소켓을 사용하여 ‘서버에 연결 요청’을 보냅니다. 이 요청에는 클라이언트 IP 주소와 포트 번호가 포함되어 있습니다. - 서버는 요청을 받고, 클라이언트의 IP 주소와 포트 번호를 사용하여 ‘새로운 소켓’을 생성합니다. 이를 통해 특정 클라이언트와의 통신에 사용이 됩니다.
3. 데이터 전송 : write()
- 클라이언트에서 소켓을 통해서 데이터를 서버로 전송합니다. - 해당 데이터는 패킷 단위로 전송되며, 각 패킷은 보내는 측의 IP 주소와 포트 번호, 받는 측의 IP 주소와 포트 번호, 데이터 등의 정보를 포함합니다.