CS

[CS] 소켓 통신 (Socket Communication) 이해하기

경상도상남자 2025. 3. 30. 16:04

 

✨  소켓 통신(Socket Communication) 이란??

네트워크에서 두 컴퓨터 간의 '실시간 양방향 통신'을  제공하는 기술

양방향 통신은 송신자 측이 데이터를 수신할 수 있으며, 수신자 측이 데이터를 송신할 수 있는 구조를 가진다.

 

두 컴퓨터 간에는 특정 IP 주소와 포트번호의 조합으로 네트워크 간의 연결을 수행하며, 수신자(클라이언트)는 데이터를 요청하면 송신자(서버)에서는 요청에 대한 응답을 제공해 주는 '클라이언트-서버' 모델을 사용하여 데이터를 송수신 할 수 있다.

소켓통신은 'TCP' 와 'UDP'라는 두 가지 주요 프로토콜을 사용할 수 있다. 이러한 프로토콜을 통해 웹서버, 이메일 서버, 데이터베이스 서버 등 다양한 응용 프로그램에서 사용되며, 실시간 통신, 스트리밍, 온라인 게임에서도 사용된다.

 

 

https ://blog.amigoscode.com/p/6-common-ways-to-build-apis

 

📕관련 용어 정리

용어 설명
패킷(Packet) 네트워크를 통해 전송되는 데이터의 기본단위
하나의 정보는 여러개의 패킷으로 나누어져 전송되며, 출발지와 목적지 정보(메타데이터)와 실제 전송되는 데이터(페이로드)로 구성이 되어 있다.
소켓(Socket) 네트워크를 통해 데이터(패킷)을 전송하기 위한 일종의 ‘통로’
채널(Channel) 서버와 클라이언트 간에 데이터를 주고 받는 ‘전송 경로’를 의미
이 채널을 통해 데이터는 송신자에서 수신자로 전달되며, 데이터의 전송방향(일방향 또는 양방향)과 전송 모드(단일 대화 또는 다중 대화)에 따라 구분될 수 있다.
클라이언트(Client) 데이터를 요청하는 측으로 서버와 연결을 하여 서버로부터 데이터를 받는 역할을 수행
서버(Server) 데이터를 요청을 받아 응답하여 클라이언트에게 데이터를 전송하는 역할을 수행.
TCP(Transmission Control Protocol) 연결 지향적인 프로토콜로, 데이터를 전송하기 전에 송신자와 수신자 간의 연결을 설정합니다.
그 후 패킷으로 나누어 전송하고 패킷이 수신자에게 전송되었는지 확인한다.
UDP(User Datagram Protocol) 비연결 지향적인 프로토콜로, 패킷을 수신자에게 보내고 패킷이 정확하게 도착했는지 확인하지 않는다. TCP보다는 빠르지만 패킷 순서나 손실에 대한 보장이 없어 신뢰성이 낮습니다
HandShake 각각 네트워크에서 연결을 설정하는 단계를 의미
이는 통신이 시작되기 전에 두 장치 사이에 통신 세션을 설정하고 서로 데이터 전송을 준비하는 과정을 의미

 

더보기

[더 알아보기]

 

💡 서버 - 서버 관계에서 소켓통신을 하는 경우 누가 클라이언트고 누가 서버가 되는가?

 

통신을 시작하는 측(연결 요청 보내는 측) → 클라인트

통신을 받아들이는 측   서버 

 

한 서버가 다른 서버에 연결을 요청하면, 요청을 보낸 서버는 클라인트 역할을 하고, 요청을 받는 서버는 서버 역할을 함

 

💡 TCP/IP에서는 소프트웨어 아키텍처의 ‘서버-3클라이언트’ 패턴을 이용하는데, ‘피어-투-피어’ 패턴과의 차이점이 뭘까?

 

서버-클라이언트 패턴의 경우 서버가 중앙에 위치하고 클라이언트가 서버에 연결하여  데이터를 요청하고 받는 구조

피어-투-피어 패턴의 경우 모든 노드(피어)가 서로 동등한 관계로 데이터를 공유하고 교환하는 구조

클라이언트가 요청을 하면 서버에서는 클라이언트의 연결을 대기하고 클라이언트가 연결을 시작한다. 연결이 설정되면 데이터를 전송할 수 있다.

 

💡핸드셰이킹(HandShaking)

사람들이 처음 만났을 때, 손을 잡고 흔드는 행동에서 유래되었다고 한다. 악수는 일반적으로 서로의 존재를 인식하고 상호작용을 시작하겠다는 의사 표시인데, 이와 같이 두 컴퓨터가 통신을 시작하기 전에 서로를 인지하고 연결 준비를 확인하는 과정을 의미한다.이 과정을 거치면 양방향 통신이 가능한 안정적인 연결이 만들어진다.

 

3-way핸드셰이크의 경우는 두 컴퓨터 간의 TCP/IP 통신을 위해 연결을 하는 과정에서 수행이되며4-way 핸드셰이크의 경우에는 두 컴퓨터 간의 연결된 상태에서 해제되는 과정에서 수행이 된다.

 

더보기

[더 알아보기]

 

💡 핸드셰이킹(HandShaking)의 경우 매번 수행이 되는걸까?

 

TCP/IP 통신에서는 새로운 연결이 생성될 때마다 3-way 핸드셰이크 과정이 수행된다. 클라이언트가 서버에 연결을 요청하고, 서버가 그 요청을 수락하며, 클라이언트가 그 수락을 확인하는 과정이 이루어진다.

그러나 한번 연결이 수립되면, 그 연결이 종료될 때까지 추가적인 핸드셰이크가 필요하지 않는다.  이후 데이터는 이미 수립된 연결을 통해 전송된다.

 

💡3-Way 핸드셰이크

네트워크 연결을 설정하는 단계를 의미

이는 통신이 시작되기 전에  두 장치 사이에서 통신 세션을 설정하고 서로 데이터 전송을 준비하는 과정

TCP/IP 프로토콜에서는 3-Way 핸드셰이크라는 과정을 사용하며 연결을 설정하며, 이를 통해 두 장치가 서로 데이터를 제대로 보내고 받을 수 있음을 확인

 

관련 용어

SYN(Synchronize)

동기화(Synchronize) 패킷으로 TCP 연결을 초기화 하는데 사용되며, 클라이언트가 서버에 연결을 시작하고자 할때 보내집니다.

 

SYN-ACK(Synchronize-Acknowledgment)

동기화 패킷에 대한 응답으로 SYN 패킷을 받은 서버가 클라이언트에게 보내지는 패킷입니다. 이 패킷을 통해 서버가 클라이언트의 연결 요청을 수락하고 클라이언트와 서버 간의 연결이 성립되었음을 나타냅니다

 

ACK(Acknowledgment)

확인(Acknowledgment) 패킷으로 데이터가 성공적으로 수신되었음을 보내는 측에 알리는데 사용됩니다.

 

https://ko.wikipedia.org/wiki/%ED%95%B8%EB%93%9C%EC%85%B0%EC%9D%B4%ED%82%B9 고

3-Way 핸드셰이크 예시

 

1. 클라이언트(Alice)가 서버(Bob)에게 SYN(동기화) 메시지를 보냄

  • 클라이언트가 서버로 연결을 시작하고자 할때 사용되며 패킷 형태로 전달됨
  • 해당 예시에서는 패킷으로 시퀀스번호(SequenceNum)인 x의 값을 서버에게 전달

2. 서버(Bob)은 SYN-ACK 메시지와 함께 응답한다.

  • 서버은 클라이언트로 부터 ‘연결 요청을 수락’하고 클라이언트-서버간의 연결이 성립되었음을 응답한다.
  • 해당 예시에서는 자체 시퀀스 번호(SequenceNum)인 y와 응답 번호(AcknowledgeNum)인 x+1을 포함하며 클라이언트로 응답합한다.

3. 클라이언트(Alice)는 응답 메시지와 함께 응답한다.

  • 클라이언트는 서버에게 패킷 데이터가 성공적으로 수신되었음으로 알리는데 사용이 됩니다.
  • 이 메시지는 응답 번호 y+1이 포함되며 서버(Bob)이 이것을 받지만 이에 응답할 필요는 없습니다.

 

 

💡4-Way 핸드셰이크

네트워크에서 연결이 되고 데이터 전송이 완료된 후에 연결을 안전하게 종료하기 위한 단계를 의미

 

관련  용어

FIN(Finished)

클라이언트에서 서버로 또는 서버에서 클라이언트로 연결 조욜를 요청하는데 사용되는 패킷을 의미

통신 양방향이므로 어느 쪽이든 연결을 종료할 수 있다.

 

ACK(Acknowledgment)

데이터가 성공적으로 수신이 되었음을 나타내는 의미

 

4-Way 핸드셰이크 예시


1. 클라이언트는 서버에게 ‘연결 종료 요청(FIN)’ 메시지를 보낸다

  • 해당 메시지는 서버에게 클라이언트가 ‘더 이상 데이터를 보내지 않겠다’라는 의미로 메시지를 전송한다.

2. 서버는 클라이언트로부터 메시지를 받고 ‘연결 종료 요청 수락(ACK)’ 메시지를 응답한다.

  • 해당 시점에서 서버는 아직 클라이언트에게 보낼 데이터가 있으므로, 서버에서 클라이언트로의 데이터 전송은 계속 될 수 있다

3. 서버는 클라이언트에게 ‘연결 종료 요청(FIN)’ 메시지를 보낸다.

  • 해당 메시지는 클라이언트에게 ‘더 이상 데이터를 보내지 않겠다’라는 의미로 메시지를 전송

4. 클라이언트는 서버로부터 메시지를 받고 ‘연결 종료 수락(ACK)’ 메시지를 응답한다.

 

  • 해당 메시지는 클라이언트가 서버의 메시지를 받았음을 확인하는 메시지를 서버에게 전송

 

더보기

[더 알아보기]

 

💡 4-Way 핸드셰이크에서 두 번의 FIN 요청이 필요한 이유

 

TCP 연결이 전이중(duplex) 연결이기 때문. 전이중 연결에서는 양쪽 모두 독립적으로 데이터를 전송할 수 있으므로, 한 쪽이 연결을 종료하더라도 다른 쪽에서는 계속해서 데이터를 전송할 수 있다.
그래서 각각의 방향에 대해 별도로 연결 종료 절차를 수행해야하며, 이 때문에 두 번의 FIN 요청이 필요하게 됩니다.

 

 

📕소켓 통신 수행과정 : 송신, 수신 측 관점

 

💡  1. 소켓 통신 수행과정 : 송신 측 관점 (Client Socket)

 

 


1. 클라이언트 소켓 생성 : socket()


- 송신 측인 클라이언트에서 ‘소켓’을 생성합니다. 이 소켓은 서버에 연결 요청을 보내기 위해 사용 된다.

2. 연결 요청 : connect() :: 3-Way 핸드셰이크 수행


-클라이언트는 생성한 소켓을 사용하여 ‘서버에 연결 요청’을 보낸다. 이 요청에는 클라이언트 IP 주소와 포트 번호가 포함되어 있습니다.
- 서버는 요청을 받고, 클라이언트의 IP 주소와 포트 번호를 사용하여 ‘새로운 소켓’을 생성합니다. 이를 통해 특정 클라이언트와의 통신에 사용이 됩니다.

3. 데이터 전송 : write()


- 클라이언트에서 소켓을 통해서 데이터를 서버로 전송
- 해당 데이터는 패킷 단위로 전송되며, 각 패킷은 보내는 측의 IP 주소와 포트 번호, 받는 측의 IP 주소와 포트 번호, 데이터 등의 정보를 포함된다

4. 데이터 수신 : read()


- 클라이언트의 요청에 따른 서버의 응답 값을 전달 받는다.

5. 연결 종료 요청 : close() :: 4-Way 핸드셰이크 수행


- 클라이언트는 서버에게 더 이상 데이터를 보내지 않겠다는 FIN 패킷을 보낸다.

 

 

💡  1. 소켓 통신 수행과정 : 수신 측 관점 (Server Socket)

 

 

1. 서버 소켓 생성 : socket()
- 수신 측인 서버에서 ‘소켓’을 생성. 이 소켓은 클라이언트의 연결 요청을 확인하기 위해 사용된다.

2. 서버 소켓 바인딩 : bind()
- 생성한 소켓을 서버의 특정 IP 주소와 포트 번호에 연결한다. 이 과정을 통해 외부의 연결 요청을 해당 서버의 IP 주소와 포트 번호로 받을 수 있게 된다.

3. 클라이언트 요청 대기 : listen()
- 서버가 클라이언트의 연결 요청을 기다린다. 이 과정에서 서버는 동시에 처리 가능한 연결 요청의 수를 지정할 수 있다.

4. 클라이언트 요청 수락 : accept() :: 3-Way 핸드 셰이크
- 서버가 클라이언트의 연결 요청을 수락합니다. 연결이 수락되면, 서버는 클라이언트와의 통신을 위한 새로운 소켓을 생성하게 된다.

5. 데이터 수신 : read()
- 서버가 클라이언트로부터 전송된 데이터를 읽는다. 이 과정에서 서버는 클라이언트가 보낸 데이터를 처리하고 적절한 응답을 준비한다.

6. 데이터 전송 : write()
- 서버가 클라이언트에게 데이터를 전송. 이 과정에서 서버는 클라이언트에게 응답을 보내거나 추가 정보를 요청한다.

7. 데이터 수신 : read()
- 서버가 클라이언트의 추가 요청이나 응답을 읽습니다. 필요한 경우, 이 과정은 여러 번 반복될 수 있습니다.

8. 연결 종료 : close() :: 4-Way 핸드 셰이크
- 통신이 끝난 후, 서버는 소켓을 닫는다. 이렇게 하면 해당 소켓으로의 모든 입출력 오퍼레이션이 중단되고, 더 이상 클라이언트와 통신할 수 없게 된다.

 

 

출처

이분 블로그가 너무 깔끔하고 자세하게 잘 설명되어 있어서 강추드립니다.

 

https://adjh54.tistory.com/516

 

[데이터 통신] 소켓 통신(Socket Communication) 이해하기 : 송신-수신 통신 과정

해당 글에서는 소켓 통신의 흐름의 이해를 돕기 위해 작성한 글입니다.1) 소켓 통신(Socket Communication)💡 소켓 통신(Socket Communication)- 네트워크에서 두 컴퓨터 간의 ‘실시간 양방향 통신’을 제공

adjh54.tistory.com

 

'CS' 카테고리의 다른 글

[네트워크] 프록시(Proxy)란?  (0) 2025.03.31