[네트워크] TCP와 UDP의 차이점

hyyyynjn·2021년 8월 28일
0

면접대비

목록 보기
5/31
post-thumbnail

Q. TCP와 UDP의 차이점에 대해 설명하세요.

TCP 는 연결 지향형 프로토콜이고 UDP는 데이터를 데이터 그램 단위로 전송하는 프로토콜이다.
TCP는 가상회선을 만들어 흐름제어, 혼잡제어, 오류제어를 통해 신뢰성을 보장하고 UDP 는 신뢰성 보장을 위한 절차가 따로 없다.
그렇기에 TCPUDP보다 느리지만 파일 전송과 같은 신뢰성이 중요한 서비스에 사용되고, UDP는 스트리밍, RTP와 같은 연속성이 중요한 서비스에 사용된다.
UDP에 개발자가 직접 신뢰성을 보장하도록 할 수 있다. HTTP/3UDP에 추가적인 정의를 통해 신뢰성을 보장한 QUIC이라는 프로토콜을 기반으로 하고 있다.

✅ TCP와 UDP

TCPUDP는 TCP/IP 4 Layer에서 전송계층에 사용되는 프로토콜로 목적지 장비까지 전송한 패킷을 상위 특정 응용 프로토콜에게 전달하는 목적을 가진다.

  • 전송계층 : IP에 의해 전달되는 패킷의 오류 검사를 하고 재전송 요구 등의 제어를 담당하는 계층이다.
  • 패킷 : 인터넷 내에서 데이터를 보내기 위한 라우팅(경로배정)을 효율적으로 하기 위해 여러 개로 나눈 데이터 조각이다.
  • HTTP 웹 통신, 이메일, 파일 전송에 사용된다.

✅ TCP (Transmission Control Protocol)

인터넷 상에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜이다

  • 장치들간의 논리적인 접속을 성립시키기 위해 연결을 설정하여 신뢰성을 보장하는 연결형 서비스이다.
  • 네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟 (데이터, 메시지, 시그먼트라는 블록 단위)안정적, 순차적, 에러 없이 교환할 수 있게 한다.
  • 일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터 배달 처리를 하면 TCP는 패킷을 추적하고 관리한다.
    • A, B, C 패킷이 순차적으로 전달되는 상황에서 B가 분실된 경우 목적지에서 A, B, C가 모두 필요한지 모르고 A, C만 보고 다 왔다고 착각할 수 있다.
    • A, B, C 패킷에 1, 2, 3이라는 번호를 부여하고 목적지에서 이를 재조립하여 패킷의 분실 확인 및 추적을 한다.

📢TCP Header

TCP는 응용 계층으로부터 받은 데이터에 Header를 추가한 뒤 IP로 보낸다.

  • 송수신자의 포트 번호 : TCP로 연결되는 가상 회선 양단의 송수신 프로세스에 할당되는 포트 주소
  • 시퀀스 번호(Sequence Number) : 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가.
  • 응답 번호(ACK Number) : 수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용.
  • 데이터 오프셋(Data Offset) : TCP 세그먼트의 시작 위치를 기준으로 데이터의 시작 위치를 표현(TCP 헤더의 크기)
  • 제어 비트(Flag Bit) : SYN, ACK, FIN 등의 제어 번호
  • 윈도우 크기(Window) : 수신 윈도우의 버퍼 크기를 지정할 때 사용
  • 체크섬(Checksum) : CP 세그먼트에 포함되는 프로토콜 헤더와 데이터에 대한 오류 검출 용도

📢TCP 특징

  • 📌연결형 서비스

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

  • 가상 회선 방식을 제공한다는 의미 : 발신지와 수신지를 연결하여 패킷 전송하기 위한 논리적 경로를 배정한다는 의미
  • 3-way handshaking : 목적지와 수신지를 확실히 정하여 정확한 전송을 보장하기 위해 세션을 수립한다. 👉 TCP Connection
  • 4-way handshaking : 세션을 해제한다. 👉 TCP Disconnection
  • 📌흐름제어 (Flow Control)

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

  • 송신자가 과도한 데이터를 빠르게 보내는 것을 막아 수신자의 문제발생을 방지한다.
  • 수신자가 윈도우 크기 (Window Size) 값을 조절하여 수신량을 정할 수 있다.
  • 📌혼잡제어 (Congestion Control)

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

  • 정보의 소통량이 과다할 경우, 패킷 전송량을 줄여 혼잡 붕괴 현상을 막는다.
    👉 CPU를 사용하는 흐름제어, 혼잡제어 기능 때문에 UDP보다 속도가 느리게 된다.
  • 📌신뢰성 높은 전송 (Reliable Transmission)
  • Dupack-based Retransmission
    • 정상적인 상황에서 ACK 패킷이 연속적으로 전송되어야 한다
    • ACK 패킷이 중복수신되면 패킷 이상을 감지하고 재전송을 요청한다
  • Timeout-based Retransmission
    • 일정 시간동안 ACK 패킷 수신을 못하면 재전송을 요청한다 (by Retransmission Timer라는 커널 타이머)
  • 📌전이중, 점대점 방식
  • 전이중 Full-Duplex : 전송이 양방향으로 동시에 일어날 수 있다
  • 점대점 Point-to-Point : 각 연결이 정확히 2개의 종단점을 가진다.
    👉 멀티캐스팅, 브로드캐스팅을 지원하지 않는다.

📢TCP 연결과 해제

  • 📌TCP connection : 3-way handshake

모든 TCP connection은 통신을 시작하기 전, 최초의 연결을 위해 3-way handshake를 진행한다.

  • ✍ 1. SYN (synchronize)
    • 첫 번째 단계에서 클라이언트는 서버와 연결하기 위해 SYN 플래그 비트가 설정된 세그먼트를 전송한다. 해당 세그먼트는 TCP 통신의 시작을 알린다.
    • 클라이언트는 SYN 을 보냈으므로 SYN-SENT 상태가 된다
  • ✍ 2. SYN + ACK (Acknowledge)
    • 두 번째 단계에서 서버는 클라이언트로부터 SYN을 받는다. 그리고 나서 SYN + ACK의 플래그 비트가 설정된 세그먼트를 클라이언트에게 전송한다.
    • 서버는 SYN 응답을 받은 상태이므로 SYN-RECEIVED 상태가 된다.
  • ✍ 3. ACK
    • 마지막 단계에서 클라이언트는 서버의 응답(SYN + ACK)을 수신 받았다는 의미로 ACK 플래그가 설정된 세그먼트를 서버로 전송한다.
    • 이후로 클라이언트는 실제 데이터를 전송할 수 있는 상태인 ESTABLISHED 상태가 된다
    • 서버 역시 클라이언트로부터 ACK를 전달받고 ESTABLISHED 상태가 된다

3-way handshakeSYN FLOODING 공격을 받을 수 있다.

공격자가 사용자에게 SYN만 계속 보내면, 사용자는 정상적 클라이언트로 판단하여 SYN + ACK를 응답하지만
공격자로부터 ACK를 받지 못해 SYN-RECEIVED 상태의 세션이 계속 쌓이게 된다.
👉 세션이 쌓이면 SYN Backlog가 가득차 SYN 소켓 정보를 더 이상 쌓을 수 없어 SYN Drop 이 발생하는 문제점이 생긴다.
🥦 해결 방법 : 커널 파라미터 net.ipv4.tcp_max_syn_backlog, net.ipv4.tcp_synack_retries

  • net.ipv4.tcp_max_syn_backlog : 세션을 쌓는 공간인 SYN Backlog의 크기를 설정한다. 👉 더 많이 쌓을 수 있게 조절하여 어느 정도 수준의 Backlog도 버틸 수 있도록 한다.
  • net.ipv4.tcp_synack_retries : SYN에 대한 응답인 SYN + ACK의 재전송 횟수를 설정한다. 👉 SYN-RECEIVED 상태의 소켓 유지를 막을 수 있다.

TIME_OUT재전송

클라이언트는 SYN에 대한 ACK를 받지 못하면 Retransmission Timer라는 커널 타이머에 의해 SYN을 재전송하게 된다.

  • RTT > RTO인 경우 재전송이 일어난다.
    • RTO (Retransmission Timeout) : 응답이 오지 않을 때 재전송을 하기까지의 기다릴 시간
    • RTT (RoundTripTime) : 요청을 보낸 직후 응답을 수신받기까지의 시간
  • 어플리케이션에서 Connection Timeout
    • Connection Timeout : 최초 handshake 과정에서 SYN, SYN + ACK에서 InitRTO를 사용할 때 재전송이 일어나면 발생하는 에러
      • InitRTO : 리눅스가 자체적으로 지정한 RTO값이며 1초로 지정되어있다.
    • InitRTO는 1초로 설정되어 있기 때문에 어플리케이션에서의 Connection Timeout은 3초 이상으로 설정해야 한다.
      • 내가 보낸 SYN (1초) + 상대방의 SYN + ACK (1초) 보다 큰 3초 이상으로 설정한다.
  • 📌TCP disconnection : 4-way handshake

TCP 소켓을 통한 데이터 전송이 완료된 후, 서버와 클라이언트는 연결 해제를 위한 4-way handshake를 진행한다
서버와 클라이언트 간 구분이 없고 Active_Closer (연결 해제 요청을 한 쪽), Passive_Closer (연결 해제 요청을 받은 쪽) 으로 구분된다.

  • ✍ 1. FIN
    • Active_Closer에서 소켓을 끊기 위해 Passive_Closer 에게 FIN 세그먼트를 전송한다.
      • Active_CloserPassive_Closer의 종료 요청 확인을 기다리는 의미로 FIN-WAIT1 상태가 된다.
        • FIN-WAIT1 상태 : 소켓이 프로세스로부터 회수되어 커널이 처리하는 단계에 진입한 상태
      • Passive_CloserActive_Closer으로부터 종료 요청 세그먼트를 받고 CLOSE-WAIT 상태가 된다.
        • CLOSE-WAIT 상태 : 자신의 소켓 프로세스에게 종료 요청을하며 기다리는 상태
  • ✍ 2. ACK
    • Passive_Closer 는 종료 신호를 받아 내부적으로 소켓을 종료하겠다는 의미로 FIN에 대한 ACK 세그먼트를 보내게 된다.
      • Active_Closer 는 종료 신호를 수신했다는 ACK 세그먼트를 전달받고 Passive_Closer 가 소켓을 종료했다는 신호를 기다리는 의미로 FIN-WAIT2 상태가 된다.
      • Passive_Closer 는 내부 소켓 종료까지 CLOSE-WAIT 상태를 유지한다.
  • ✍ 3. FIN
    • Passive_Closer 는 내부적으로 소켓이 정상종료 될 경우 이를 Active_Closer 에 알리는 의미로 FIN 신호를 보낸다.
      • Passive_CloserLASK-ACK 상태가 된다.
      • Active_CloserPassive_Closer 가 정상 종료되었다는 신호를 전달받고 확인의 의미로 ACK를 보낸다.
        • 이때, ACK가 유실되어 Passive_Closer 측의 소켓이 제거되지 않은 문제점이 발생할 수 있는 이유로 일정시간 대기하는 TIME-WAIT 상태가 된다.
        • 일정 시간 경과 후 소켓을 종료한다.
  • ✍ 4. ACK
    • Active_CloserPassive_Closer로부터 소켓이 정상 종료되었다는 신호를 받고 응답으로 ACK를 보낸다
    • Passive_CloserActive_Closer로부터 자신의 FIN 신호에 대한 응답을 받고 소켓을 종료한다.

📢TCP 서버의 특징

  • TCP 서버와 클라이언트는 1대1 로 연결된다.
  • 전송 데이터의 크기가 무제한이다. 스트림으로 데이터를 전송한다.
  • 패킷에 대한 응답을 하기 때문에 성능이 낮다. (시간 지연, CPU 소모)
  • 패킷이 손실된 경우 재전송을 요청하기 때문에 Streaming 서비스에 부적합하다.

✅ UDP (User Datagram Protocol)

데이터를 데이터그램 단위로 처리하는 프로토콜이다

  • 데이터그램 : 독립적인 관계를 지니는 패킷이다.
  • UDP는 TCP와 다르게 비연결형 프로토콜로 연결을 위해 할당되는 논리적인 경로가 없다.
    그렇기에 각각의 패킷은 독립적인 관계를 지니며 다른 경로로 전송되고 독립적으로 처리된다.
  • 인터넷 상에서 정보를 주고 받을 때, 정보는 보낸다는 신호, 받는다는 신호 절차 없이 일방적으로 보낸다.

📢UDP Header

  • 송신자의 포트 번호 : 데이터를 보내는 애플리케이션의 포트 번호
  • 수신자의 포트 번호 : 데이터를 받을 애플리케이션의 포트 번호
  • 데이터의 길이 : UDP 헤더와 데이터의 총 길이
  • 체크섬(Checksum) : 데이터 오류 검사에 사용

📢UDP 특징

  • 📌실시간

제약조건이 거의 없고 TCP보다 속도가 매우 빨라 실시간 전송이 필요한 부분에 많이 사용된다

  • 인터넷 전화, Streaming 서비스에 적합하다
  • 📌간단한 트랜잭션

TCP는 connection, disconnection, ACK를 통한 복잡한 트랜잭션이 필요하지만 UDP는 필요없다.

  • DNS, DHCP, SNMP 에 사용된다.
  • 📌멀티캐스트, 브로드캐스트 가능

전송측과 수신측의 양방 검증이 필요한 TCP와 다르게 UDP에서는 멀티캐스트, 브로드캐스트가 가능하다

  • IPTV에 사용된다.

📢UDP 서버의 특징

  • UDP에는 연결 자체가 없기에 서버 소켓, 클라이언트 소켓의 구분이 없다
  • UDP는 소켓이 아닌 IP 기반으로 데이터 전송을 한다
  • 서버와 클라이언트는 1대1 (Unicast), 1대다 (Broadcast), 다대다 (Multicast) 등으로 연결될 수 있다
  • 흐름제어가 없다 (패킷이 제대로 전송되었는지, 오류가 없는지 확인할 수 없다)
  • 신뢰성보다 성능이 중요한 서비스에 사용된다.

✅ TCP와 UDP의 차이점과 공통점

📢공통점

  • 포트 번호를 이용하여 주소를 지정한다.
  • 데이터 오류 검사를 위한 checksum이 존재한다.

📢차이점

TCPUDP
연결이 성공해야 통신 가능 : 연결형 프로토콜연결 없이 통신 가능 : 비연결형 프로토콜
데이터의 경계를 구분하지 않음 : Byte-Stream Service데이터의 경계를 구분함 : Datagram Service
신뢰성 있는 데이터 전송 : 데이터 재전송 있음비신뢰성의 데이터 전송 : 데이터 재전송 없음
1대1 통신1대1, 1대다, 다대다 통신

0개의 댓글