-웹소켓
웹소켓은 TCP 기반의 양방향 통신 프로토콜로, 서버와 클라이언트 간의 실시간 양방향 통신을 제공합니다. HTTP와 마찬가지로 웹 브라우저에서 사용되며, 웹소켓 연결을 위한 별도의 포트 번호(일반적으로 80 또는 443)를 사용합니다.
웹소켓은 다음과 같은 특징을 가지고 있습니다.
- 웹소켓은 상태유지(Stateful) 프로토콜입니다.
클라이언트와 서버 간의 연결을 유지하면서 양방향 통신을 수행할 수 있습니다. 따라서 HTTP와 달리 클라이언트와 서버 간의 상태 정보를 유지하고, 언제든지 통신을 시작하거나 중지할 수 있습니다.
- 웹소켓은 텍스트와 이진 데이터를 모두 전송할 수 있습니다.
HTTP와 달리, 웹소켓은 텍스트와 이진 데이터를 모두 전송할 수 있습니다. 이를 통해 클라이언트와 서버 간의 다양한 종류의 데이터를 전송할 수 있습니다.
- 웹소켓은 HTTP와 호환됩니다.
웹소켓은 기본적으로 HTTP와 호환되기 때문에, HTTP 기반의 웹 애플리케이션과 함께 사용할 수 있습니다. 또한, HTTPS와 같은 보안 연결을 사용하여 데이터를 안전하게 전송할 수 있습니다.
- 웹소켓은 이벤트 기반(Event-driven)입니다.
웹소켓은 이벤트 기반으로 동작합니다. 클라이언트 또는 서버에서 발생하는 이벤트에 따라 데이터를 전송하거나 수신할 수 있습니다. 이를 통해 실시간으로 데이터를 전송하거나 처리할 수 있습니다.
-TCP
TCP는 Transmission Control Protocol(전송 제어 프로토콜)의 약자로, 인터넷 프로토콜 스위트(IP)의 한 부분입니다. TCP는 인터넷에서 데이터를 안정적으로 전송하기 위한 프로토콜 중 하나로, 데이터 전송의 신뢰성을 보장하고, 패킷의 손실을 감지하고 복구할 수 있는 기능 등을 제공합니다.
TCP는 연결 지향형 프로토콜로, 데이터 전송 전에 먼저 상대방과의 연결을 설정하고, 데이터 전송 후에는 연결을 종료합니다. 데이터를 보낼 때는 송신 측에서 데이터를 분할하여 여러 개의 패킷으로 나누고, 수신 측에서는 패킷을 다시 조합하여 전체 데이터를 복원합니다.
웹소켓이 TCP 기반의 양방향 통신을 지원하는 것은, TCP의 안정성과 신뢰성을 바탕으로 데이터를 안정적으로 전송하고, 서버와 클라이언트가 양방향으로 데이터를 주고받을 수 있도록 하는 것입니다.
예를 들어, A 컴퓨터에서 B 컴퓨터로 "Hello, World!"라는 문자열을 보내고자 한다고 가정해봅시다.
- 연결 설정 A 컴퓨터에서 B 컴퓨터로 데이터를 보내기 위해서는 먼저 TCP 세션을 설정해야 합니다. 이를 위해 A 컴퓨터는 B 컴퓨터에 SYN 패킷을 보내고, B 컴퓨터는 이에 대한 ACK+SYN 패킷을 보냅니다. 이렇게 A 컴퓨터와 B 컴퓨터 간에 세션이 성립되면 데이터 전송이 가능해집니다.
- 데이터 나누기 "Hello, World!"라는 문자열은 길이가 13바이트입니다. 이를 일정한 크기의 패킷으로 나누어 전송해야 합니다. 이를 위해, 예를 들어 4바이트씩 나누어 총 4개의 패킷으로 만들 수 있습니다.
- 패킷 전송 이제 4개의 패킷을 전송합니다. A 컴퓨터에서 B 컴퓨터로 첫 번째 패킷을 전송합니다. B 컴퓨터는 이를 수신하고, 이에 대한 ACK 패킷을 A 컴퓨터로 보냅니다. 이후, 두 번째, 세 번째, 네 번째 패킷도 이와 같은 방식으로 전송하고, 수신 여부를 확인합니다.
- 패킷 재전송 만약, 전송 중에 패킷이 손실되었다면, 수신측은 손실된 패킷을 다시 전송해달라는 요청을 보낼 수 있습니다. 이를 위해, A 컴퓨터는 이전에 전송한 패킷을 재전송합니다. 이 과정에서, 데이터의 일부가 중복으로 전송될 수 있지만, 수신측에서는 중복 데이터를 제거하여 원본 데이터를 복원할 수 있습니다.
- 연결 종료 모든 패킷이 정상적으로 전송되면, 연결이 종료됩니다.
*TCP는 연결 지향적인 프로토콜로, 통신을 시작하기 전에 먼저 연결을 설정해야 합니다. 이 과정에서 "3-way handshake" 라고 불리는 과정을 거치게 됩니다.
예를 들어, A 컴퓨터가 B 컴퓨터에게 데이터를 전송하고자 할 때, A 컴퓨터는 B 컴퓨터에게 SYN 패킷을 보냅니다. SYN 패킷은 연결 설정 요청을 나타냅니다. B 컴퓨터는 SYN 패킷을 받고, 이에 대한 응답으로 ACK+SYN 패킷을 보냅니다. 이 패킷은 SYN 패킷에 대한 응답과 함께, B 컴퓨터에서 전송될 데이터의 시작 지점을 나타내는 역할을 합니다. 이후, A 컴퓨터는 ACK 패킷을 보내고, 이로써 연결 설정이 완료됩니다.
즉, "SYN"은 연결 설정을 요청하는 패킷이고, "ACK+SYN"은 요청에 대한 응답과 함께 시작 지점을 나타내는 패킷입니다. 이 과정을 통해 양쪽 컴퓨터가 서로 연결되어 데이터 전송이 가능해집니다.
(참고로 "3-way handshake"이라고 하는 이유는 3번의 패킷이 교환되기 때문입니다. 연결 설정할 때 1번, 요청에 대한 응답할 때 1번, 양쪽 모두 준비가 되었다는걸 알리기 위해 1번)
-패킷
컴퓨터 네트워크에서 패킷(Packet)은 데이터 통신의 최소 단위입니다. 데이터 통신에서 전송되는 데이터는 일반적으로 큰 용량의 데이터이지만, 이 데이터를 한 번에 모두 전송하기에는 많은 문제가 있습니다. 따라서 데이터를 여러 개의 작은 조각으로 나누어서 전송하게 되는데, 이때 나누어진 작은 데이터 조각을 패킷이라고 부릅니다.
패킷은 일반적으로 헤더(Header)와 데이터(Data)로 구성됩니다. 헤더에는 송수신자의 주소, 데이터의 종류와 크기, 전송 순서 등의 정보가 포함되어 있습니다. 데이터는 전송하고자 하는 내용으로, 이를 패킷화하여 전송하면 수신 측에서는 패킷을 조합하여 원래의 데이터를 복원합니다.
패킷을 사용하면 데이터 전송 시 발생할 수 있는 다양한 문제를 해결할 수 있습니다. 예를 들어, 패킷을 이용하면 데이터 전송 시 중간에 발생하는 에러나 손실을 검출하고, 이를 복구할 수 있습니다. 또한, 여러 개의 패킷을 동시에 전송하면, 병목 현상을 방지하고 전송 속도를 향상시킬 수 있습니다.
*패킷을 나누는 이유
첫째, 대역폭(Bandwidth)의 한계입니다. 대역폭은 한 번에 전송할 수 있는 데이터의 양을 의미하는데, 모든 네트워크 링크는 대역폭이 한정되어 있습니다. 데이터 용량이 큰 경우, 대역폭이 한정되어 있어 모든 데이터를 한 번에 전송하기 어렵습니다.
둘째, 패킷 손실(Packet Loss)입니다. 데이터를 전송할 때는 다수의 네트워크 노드들을 통과하게 됩니다. 이때 패킷이 손실되거나 지연될 수 있는데, 데이터 용량이 크면 패킷 손실이 발생할 확률이 높아집니다. 또한, 한 번에 많은 데이터를 전송하면 패킷 손실이 발생했을 때 재전송 시간도 증가하게 되어 전체적인 전송 시간도 더 오래 걸리게 됩니다.
따라서, 데이터를 전송할 때는 작은 크기의 패킷으로 나누어 전송하게 됩니다. 이렇게 패킷화하여 전송하면, 대역폭의 한계를 극복할 수 있고, 패킷 손실이 발생하더라도 손상된 패킷만 재전송하면 되므로 전송 시간을 최소화할 수 있습니다.
*패킷을 많이 나누면 헤더가 그만큼 필요하니까 패킷을 적게 나눌 때보다 비효율적인거 아닐까?
패킷을 많이 나누게 되면 각 패킷마다 헤더가 들어가게 되므로, 전체적인 헤더의 크기가 커지는 비효율적인 상황이 발생할 수 있습니다. 이는 대부분의 프로토콜에서 발생하는 문제이며, 패킷을 적게 나누는 것이 전송 성능을 높일 수 있는 방법 중 하나입니다.
그러나, 패킷을 적게 나누게 되면 전송 중에 데이터가 손실되었을 때, 재전송할 때의 비용이 많이 발생할 수 있습니다. 패킷을 많이 나누어 전송하면 재전송해야 하는 데이터의 양이 줄어들어 비용이 적게 들게 됩니다.
따라서, 패킷 크기와 패킷의 개수를 적절히 조절하여 전송 성능과 데이터 전송 신뢰성을 균형있게 유지하는 것이 중요합니다. 이를 위해, 패킷 크기나 패킷의 개수를 동적으로 조절할 수 있는 프로토콜이나 알고리즘도 개발되어 있습니다.
'유니티(Unity)' 카테고리의 다른 글
MetaShopEditor (0) | 2023.05.30 |
---|---|
비동기 예시 (0) | 2023.05.29 |
클래스, 객체, 인스턴스 (0) | 2023.03.03 |
프로그램 패러다임 (0) | 2023.03.03 |
단일 책임원칙(Single-responsibility principle) (0) | 2023.03.03 |