[iOS] Socket 통신 - 1

강치우·2024년 5월 29일
0

Socket 통신

목록 보기
1/2

안녕하세요. 오늘은 소켓통신에 대해서 알아볼건데요 !

프로젝트 진행 중 백엔드 분이 소켓통신으로 채팅을 구현해보는게 어떻겠냐는 말에 허겁지겁 소켓통신을 공부하게 되었습니다..

바로 잡소리 컷하고 시작하겠습니다.


Socket 통신

네트워크를 통해 서버, 클라이언트 양쪽에 링크를 생성 후 그 링크를 통해 데이터를 주고 받는 양방향 통신입니다.

서버에 임의 포트번호를 설정한 상태에서 클라이언트에서 해당 포트로 접속을 시도하면 서버와 클라이언트가 해당 포트번호로 서로 연결되어 있는 상태가 됩니다.

서로 연결 되어 있는 상태이므로 데이터를 서로 전달하고 받을 수 있는 상태가 됩니다. (양방향으로 연결 되어 있으니 실시간으로 데이터 전달이 가능합니다.)

실시간으로 데이터를 서버와 클라이언트 간 전달해야 할 때 사용됩니다. (ex 실시간 채팅)

서버와 연결되어 있는 소켓과 클라이언트에서 연결되어 있는 소켓은 같은 소켓이지만 역할이 다릅니다.

  • 서버와 연결되어 있는 소켓에서는 클라이언트쪽에서 들어온 요청을 처리해주는 역할을 합니다.
  • 클라이언트와 연결되어 있는 소켓에서는 서버 소켓에 요청을 해주는 역할을 합니다.

TCP, UDP

소켓에서 데이터를 보내기 위해 사용하는 프로토콜을 알아볼 것인데, 가장 대표적으로 두 가지 종류가 있습니다.

  • TCP
  • UDP

TCP (스트림 소켓)

TCP는 Transmission Control Protocol(전송 제어 프로토콜)의 약자입니다.

데이터를 메세지 형태로 보내기 위해 IP와 함께 사용하는 프로토콜입니다.

IP가 데이터 배달을 처리한다면, TCP는 패킷을 추적 관리 합니다.


여기서, 패킷을 추적 관리한다는 것은

데이터가 온전히 갔는지 확인하기 위해서 TCP는 패킷에 번호를 부여해서 패킷이 중간에 손실되진 않았는지 확인을 하고, 목적지에선 나누어진 패킷이 다시 온전한 데이터가 될 수 있도록 재조립하는걸 의미합니다.


조금 말이 이해하기 어려운데 조금 쉽게 풀어서 설명해보자면

먼저, 패킷이라는 것은 하나의 온전한 데이터 뭉텅이가 아닙니다.
데이터를 보낼 땐 한번에 몽땅 보내는 것이 아닌, 효율성을 위해 조각 조각 내서 나누어서 보냅니다.
여기서 이 조각 조각으로 나눠진 데이터를 패킷 이라 하는데, 목적지에 도착하면 이 나눠진 데이터를 온전히 받아서 재조립을 합니다.

이 과정을 패킷 추적 관리한다라고 이해하고 넘어가시면 되겠습니다.


TCP 소켓의 특징은 다음과 같습니다.

⦁ 연결형 서비스로 안정성, 신뢰성을 보장한다.

⦁ 발신자와 수신자를 연결하여 논리적 경로(가상 회선 방식)을 배정한다.

⦁ 3-Way Handshake 방식을 통해 연결을 맺고, 4-Way Handshake를 통해 해제한다.

⦁ 서버가 응답을 주지 않으면 계속적으로 요청하게 된다. (어느 시점에 포기할 수도 있음)

⦁ 서로 데이터를 주고받을 수 있는 양방향 통신이며, 일대일 통신(unicast)이다.

⦁ 패킷의 순서는 정확히 유지되고, 에러도 교정된다.

⦁ 데이터 흐름 제어 및 혼잡 제어가 가능하다.

⦁ UDP 보다 속도가 느리다.


여기서 3-Way Handshake 방식이란, 목적지와 수신지를 정확히 하여 정확한 전송을 보장하기 위해 하는 것을 말합니다.

TCP 특징 중 하나는 패킷을 수신할때마다 ACK(acknowledge)라는 별도 패킷을 재전송해주고 만약 재전송을 받지 못하면 일정 시간 후 다시 해당 패킷을 재전송하여 안정성을 높혀줍니다.

사진과 같이 서버에서 클라이언트로 패킷을 전송하면 클라이언트에서는 Ack를 재전송 해줍니다.

근데 만약 서버에서 2번 째 패킷 전송이 없다면, 일정 시간 후 다시 해당 패킷을 클라이언트에게 재전송한다는 뜻입니다.


TCP는 연속적으로 데이터를 주고받을 때 보단, 신뢰성 있는 연결을 중시할 때 사용합니다.

연속적으로 데이터를 주고받을 때의 대표적인 예시로는 영상같은 실시간 Streaming 입니다.

영상 스트리밍 같은 경우 1초에만 해도 엄청나게 많은 프레임 패킷을 연속적으로 받습니다.

그럴 때, 만약 프레임 패킷 하나가 손실 되었다고 해서 다시 손실된 데이터를 요청하고 한다면 실시간이라는 것에 조금 치명적일 수 있겠죠.



UDP (데이터그램 소켓)

UDP는 User Datagram Protocol의 약자입니다.

UDP에선 데이터를 데이터그램 단위로 처리하는데, 데이터그램이란 독립적인 단계를 지니는 패킷입니다.

UDP도 데이터그램을 받기 위해선 TCP와 같이 IP를 사용합니다.
다만, 소켓을 만들어 서로 연결을 맺는 구조가 아닌, 소켓을 만들어 그냥 UDP 서버 IP, Port로 데이터를 보내는 개념입니다.

그러면 UDP 서버도 Client IP, Port로 그냥 데이터를 보내 버릴 수 있겠죠?
그렇기 때문에 UDP 서버 하나에 여러 Client들이 붙어서 데이터를 받을 수 있습니다.


TCP와는 다르게 UDP는 비연결형 프로토콜로써 연결 없이 통신이 가능합니다.
어떻게 이게 가능하냐면, 메시지를 패킷으로 나누고 받는쪽에서 재조립하는 과정이 없습니다.

상대방과 연결이 되어있지 않고 소켓을 개설한 후 데이터를 그냥 보내줍니다.
따라서 UDP는 안정적이지 않은 프로토콜입니다.

보통 1 ~ 5%의 데이터를 유실할 수 있다고 합니다.


UDP의 경우 연결을 맺고 끊는 과정이 존재하지 않고, Ack를 보내지도 않으며, 패킷에 순서를 부여하여 추적 관리하거나, 혼잡, 흐름 제어도 하지 않기 때문에 속도가 빠르고 네트워크 부하도 적습니다.

그러나, 중간에 패킷 손실과 같은 것을 체크할 수 없기 때문에, 데이터 전송 면에서 신뢰성이 떨어집니다.

따라서, TCP와 반대로 신뢰성보다 연속성이 중요한 서비스에서 사용 됩니다. (영상 실시간 Streaming 등)




그래서 TCP와 UDP에 대해서 알아보았는데,

간단히 요약을 해보자면 TCP는 신뢰할 수 있지만 속도가 UDP보다는 느리고 UDP는 TCP보다는 속도가 빠르지만 신뢰할 수 없는 특징을 가지고 있다고 생각하면 될 것 같습니다.

이번 글에서는 소켓통신의 이론을 다뤄 보았는데, 다음 글에서는 그 중에서도 SocketIO 라는 네트워크 네트워킹 라이브러리에 대해서 다뤄보겠습니다 !

profile
자허블을 좀 더 좋아하긴 합니다.

0개의 댓글