[CS] TCP/UDP 프로토콜

Youngwoo Lee·2021년 6월 22일
0

CS

목록 보기
3/5
post-thumbnail

TCP/UDP 프로토콜

어릴적 스타크래프트를 하면서, 많이 접했던 UDP...
그리고 OSI 7계층, TCP/IP 개념을 통해서 계속 배웠던 TCP, UDP...
iOS 개발을 시작하고 HTTP 통신을 많이 하게 되었는데,
HTTP 프로토콜의 기반이 되는 TCP/UDP에 대해서 정리해보자!

TCP (Transmission Control Protocol)

  • 데이터를 전송하기 전에 먼저 두 호스트 (통신 장치 또는 종단 시스템) 사이에 논리적 연결을 설정하는 신뢰성 있는 연결 지향 (connection-oriented) 프로토콜이다.
  • TCP는 바이트들의 스트림 (바이트들의 연속적인 흐름) 전송을 위해 논리적인 파이프를 형성한다.
  • 논리적인 파이프 형성을 통해서 순서 보장을 제공한다
  • 흐름제어(목적지에서 전송되는 데이터의 양을 감당할 수 있도록 발신지 호스트의 데이터 데이터 발신율과 수신자 호스트의 데이터 수신율을 조절함)
  • 오류제어(오류 없이 목적지에 세그먼트가 전달되고 훼손된 세그먼트의 재전송을 보장함)
  • 세그먼트(TCP 패킷 명)는 Application 계층으로부터 받은 메시지를 전송 층 패킷으로 캡슐화한 것을 말한다.
  • TCP는 연결 지향 서비스를 제공하기 위해 분명하게 연결 설정, 데이터 전송, 연결 해제 단계를 정의해야 한다.(3way handshaking, 4way handshaking)

연결형 서비스

연결형 서비스로 가상 회선 방식을 제공한다.

  • 3-way handshaking 과정을 통해 연결을 설정
  • 4-way handshaking 을 통해 연결을 해제.

흐름제어(Flow control)

데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지

  • 송신하는 곳에서 감당이 안되게 많은 데이터를 빠르게 보내 수신하는 곳에서 문제가 일어나는 것을 막는다.
  • 수신자가 윈도우크기(Window Size) 값을 통해 수신량을 정할 수 있다.

혼잡제어(Congestion control)

네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지

  • 정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴 현상이 일어나는 것을 막는다.

신뢰성이 높은 전송(Reliable transmission)

  • Dupack-based retransmission
    • 정상적인 상황에서는 ACK 값이 연속적으로 전송되어야 한다.
    • 그러나 ACK값이 중복으로 올 경우 패킷 이상을 감지하고 재전송을 요청한다.
  • Timeout-based retransmission
    • 일정시간동안 ACK 값이 수신을 못할 경우 재전송을 요청한다.

전이중, 점대점 방식

  • 전이중 (Full-Duplex)전송이 양방향으로 동시에 일어날 수 있다.
  • 점대점 (Point to Point)각 연결이 정확히 2개의 종단점을 가지고 있다.

=> 멀티캐스팅이나 브로드캐스팅을 지원하지 않는다.

UDP (User Datagram Protocol)

  • UDP는 처음에 논리적 연결을 설립하지 않고 사용자 데이터 그램(UDP 패킷 명)을 전송하는 비연결형(connectionless) 프로토콜이다.
  • UDP에서 각 사용자 데이터 그램은 이전이나 다음 데이터 그램과는 관련이 없는 독립적인 하나의 개체이므로 비연결형이라는 이름이 사용된다고 한다.
  • UDP는 TCP 프로토콜과 다르게 흐름 제어, 오류 제어, 또는 혼잡 제어를 제공하지 않는 간단한 프로토콜이다. 또한 UDP는 비연결임과 동시에 신뢰성이 없는 전송 프로토콜이다.
  • UDP는 호스트 간 통신 대신에 프로세스(일종의 응용 프로그램) 간 통신을 제공하는 것을 제외하고는 IP 서비스에 어떠한 것도 추가하지 않는다고 한다. 그래서 기능이 별로 없는 것 같으나 몇 가지 장점이 존재한다.
  • UDP는 최소한의 오버헤드(어떤 처리를 하기 위해 들어가는 간접적인 처리 시간과 메모리)를 가진 매우 간단한 프로토콜이라는 장점이 있다. 작은 메시지를 송신하기 원하고 신뢰성이 그다지 중요하지 않다면 UDP를 사용할 수 있다.
  • 이는 TCP를 사용하는 것보다 송수신자 간의 상호 작용이 훨씬 적다.

TCP와 UDP 차이?

  • TCP는 UDP와 달리 연결 지향 프로토콜이며 스트림 지향 프로토콜이다.
  • UDP는 TCP와 달리 비연결형이라서 스트림 데이터를 보낼 수 없고, 패킷 간의 관계가 없다.
  • 또한 UDP는 TCP와 다르게 흐름 제어, 오류 제어, 혼잡 제어 메커니즘이 없지만 훨씬 간단한 프로토콜이다.
  • TCP는 많은 패킷이 교환되어야 해서 많은 지연을 생성하지만, UDP는 적은 패킷만 교환하여 적은 지연 시간을 가진다. 대신 UDP는 TCP와 같이 데이터의 안전하고 확실한(신뢰성) 도착을 보장할 수 없다.

패킷 교환 방식

작은 블록의 패킷으로 데이터를 전송하며 데이터를 전송하는 동안만 네트워크 자원을 사용하도록 하는 방법입니다. 접속 방식에 따라 데이터 그램 방식과 가상회선 방식으로 구분됩니다.

가상 회선 패킷 교환 방식 (TCP가 사용)

데이터를 전송하기 전에 논리적 연결이 설정되는데, 이를 가상회선이라고 합니다. 각 패킷에는 가상회선 식별 번호가 포함됩니다. 모든 패킷을 전송하면 가상회선이 해제되고, 패킷들은 전송된 순서대로 도착합니다. 라우터가 경로를 설정할 때만 라우팅합니다.

데이터그램 패킷 교환 방식 (UDP가 사용)

데이터를 전송하기 전에 논리적 연결이 설정되지 않으며 패킷이 독립적으로 전송됩니다. 패킷을 수신한 라우터는 최적의 경로를 선택하여 패킷을 전송하는데 하나의 메시지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있습니다. 따라서 송신 측에서 전송한 순서와 수신 측에 도착한 순서가 다를 수 있습니다.


[TCP] 3 way handshake & 4 way handshake

연결을 성립하고 해제하는 과정을 말한다

3 way handshake - 연결 성립

TCP는 정확한 전송을 보장해야 한다. 따라서 통신하기에 앞서, 논리적인 접속을 성립하기 위해 3 way handshake 과정을 진행한다.

  1. 클라이언트가 서버에게 SYN 패킷을 보냄 (sequence : x)
  2. 서버가 SYN(x)을 받고, 클라이언트로 받았다는 신호인 ACK와 SYN 패킷을 보냄 (sequence : y, ACK : x + 1)
  3. 클라이언트는 서버의 응답은 ACK(x+1)와 SYN(y) 패킷을 받고, ACK(y+1)를 서버로 보냄

이렇게 3번의 통신이 완료되면 연결이 성립된다. (3번이라 3 way handshake인 것)

4 way handshake - 연결 해제

연결 성립 후, 모든 통신이 끝났다면 해제해야 한다.

  1. 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 보낸다.
  2. 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보낸다. (이때 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 된다)
  3. 데이터를 모두 보냈다면, 연결이 종료되었다는 FIN 플래그를 클라이언트에게 보낸다.
  4. 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보낸다. (아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT을 통해 기다린다.)
  • 서버는 ACK를 받은 이후 소켓을 닫는다 (Closed)
  • TIME_WAIT 시간이 끝나면 클라이언트도 닫는다 (Closed)

이렇게 4번의 통신이 완료되면 연결이 해제된다.

profile
iOS Developer Student

0개의 댓글