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