TCP,UDP

정지범·2023년 11월 22일
0

refactoring

목록 보기
2/20

이번 주차에는 TCP와 UDP에 대해 정리해 봤다.


TCP란?

인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜을 말한다.
TCP는 애플리케이션에게 신뢰적이고 연결지향성 서비스를 제공한다.
따라서, 서버와 클라이언트간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.
그리고 TCP는 장치들 사이에 논리적인 접속을 성립하기 위해서 3-way handshake를 사용한다.


TCP의 특징

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

  • 3-way handshaking 과정을 통해 연결을 설정하고,
  • 4-way handshaking 과정을 통해 연결을 해제한다.

2.흐름 제어(Flow control)

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

3.혼잡 제어(Congestion control)

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

4.높은 신뢰성을 보장

  • 신뢰성이 높은 전송을 하기 때문에 UDP보다 속도가 느림

5.전이중(Full-Duplex), 점대점(Point to Point)방식

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

TCP의 헤더


TCP는 여러 개의 필드로 나누어진 20 bytes, 즉 160 bits의 헤더를 사용하며, 각 필드의 비트를 0 또는 1로 변경하여 전송하고자 하는 세그먼트의 정보를 나타낸다.

하지만 이 20 bytes라는 것은 아무 옵션도 없는 기본적인 헤더일 때의 용량이고, TCP의 여러가지 옵션들을 사용하면 헤더 맨 뒤에 옵션 필드들이 추가로 붙기 때문에 최대 40 bytes가 더해진 60 bytes까지도 사용할 수도 있다.


Source port, Destination port

  • 세그먼트의 출발지와 목적지를 나타내는 필드
  • 각각 16bits를 할당 받는다.
  • 출발지와 목적지의 주소를 판별하기 위해서는 IP 주소포트 번호가 필요하다.
  • IP 주소는 네트워크 계층에 있는 IP의 헤더에 담기기 때문에, TCP 헤더에는 IP 주소를
    나타내는 필드가 없고 포트를 나타내는 필드만 존재한다.

Sequence Number

  • 순서번호 필드(전송하는 데이터의 순서를 의미)
  • 32 bits를 할당 받는다(최대 4,294,967,296까지 수를 담을 수 있기 때문에 쉽게 중복 X)
  • 수신자는 쪼개진 세그먼트의 순서를 파악해 올바른 순서로 데이터를 재조립 O
  • 송신자가 최초 데이터 전송 시 랜덤한 수로 초기화 하며, 이후 보낼 데이터의 1bytes당 시퀀스 번호를 1씩 증가시키며 데이터의 순서를 표현하다 4,294,967,296를 넘어갈 경우 다시 0부터 시작

Acknowledgment Number

  • 확인 응답 필드
  • 송신자와 수신자가 상호 간의 통신을 할 때 그 통신이 올바르게 이루어지고 있는지 체크를 할 때 사용되는 필드

Data Offset

  • 전체 세그먼트 중에서 헤더가 아닌 데이터가 시작되는 위치가 어디부터 인지를 표시

Reserved (3 bits)

  • 예약 필드로, 모두 0으로 채워져야 한다.

Flags (NS ~ FIN)

필드의미
URGUrgent Pointer(긴급 포인터) 필드에 값이 채워져있음을 알리는 플래그. 이 포인터가 가리키는 긴급한 데이터는 높게 처리되어 먼저 처리된다. 요즘에는 많이 사용되지 않는다.
ACKAcknowledgment(확인 응답) 필드에 값이 채워져있음을 알리는 플래그. 이 플래그가 0이라면 승인 번호 필드 자체가 무시된다.
PHSPush 플래그. 수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플래그이다. 이 플래그가 0이라면 수신 측은 자신의 버퍼가 다 채워질 때까지 기다린다. 즉, 이 플래그가 1이라면 이 세그먼트 이후에 더 이상 연결된 세그먼트가 없음을 의미하기도 한다.
RSTReset 플래그. 이미 연결이 확립되어 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청의 의미이다.
SYNSynchronize 플래그. 상대방과 연결을 생성할 때, 시퀀스 번호의 동기화를 맞추기 위한 세그먼트임을 의미한다.
FINFinish 플래그. 상대방과 연결을 종료하고 싶다는 요청인 세그먼트임을 의미한다.

Window Size

  • 윈도우 사이즈 필드에는 한번에 전송할 수 있는 데이터의 양을 의미하는 값을 담음

Checksum

  • 데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값

Urgent Pointer

  • URG 플래그가 1이라면 수신 측은 이 포인터가 가르키고 있는 데이터를 우선 처리(긴급 포인터)

Options

  • TCP의 기능을 확장할 때 사용하는 필드들, 필드의 크기는 고정 x 가변적 o
  • 대표적인 옵션으로는 윈도우 사이즈의 최대 값 표현을 확장할 수 있는 WSCALE 옵션

3-way handshake

TCP/IP 프로토콜을 이용해서 통신을 하는
응용프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정

  1. 먼저 Open 한 클라이언트가 SYN를 보내고 SYN_SENT 상태로 대기한다.
  2. 서버는 SYN-RECEIVED 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
  3. SYN과 응답 ACK를 받은 클라이언트는 ESTABLISHED 상태로 변경하고 서버에게 응답 ACK를 보낸다.
  4. 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.
상태설명
CLOSED연결 수립을 시작하기 전의 기본 상태(연결 없음)
LISTEN포트가 열린 상태로 연결 요청 대기 중
SYN-SENTSYN을 요청한 상태
SYN-RECEIVEDSYN 요청을 받고 상대방의 응답을 기다리는 중
ESTABLISHED연결 수입리 완료된 상태, 서로 데이터를 교환할 수 있다.

4-way handshake

3way handshake가 연결확립을 위해 진행했다면 4way handshake는 세션을 종료하기 위해 수행되는 절차를 말한다.

  1. 먼저 close를 실행한 클라이언트가 FIN을 보내고 FIN-WAIT-1 상태로 대기한다.
  2. 서버는 CLOSE-WAIT으로 바꾸고 응답 ACK를 전달한다. 동시에 해당 포트에 연결되어 있는 애플리케이션에게 close를 요청한다.
  3. ACK를 받은 클라이언트는 상태를 FIN-WAIT-2로 변경한다.
  4. close 요청을 받은 서버 애플리케이션은 종료 프로세스를 진행하고 FIN을 클라이언트로 보내 LAST_ACK 상태로 바꾼다.
  5. FIN을 받은 클라이언트는 ACK를 서버에 다시 전송하고 TIME-WAIT으로 상태를 바꾼다.
    TIME-WAIT에서 일정 시간이 지나면 CLOSE 된다. ACK를 받은 서버도 포트를 CLOSED로 닫는다.
상태설명
ESTABLISHED연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
FIN-WAIT-1자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
FIN-WAIT-2자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다.
CLOSE-WAIT상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다.
LAST-ACKCOLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태.
TIME-WAIT모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이 한다.
CLOSED연결 수립을 시작하기 전의 기본 상태 (연결 없음)

TCP의 재전송(타임아웃)

TCP는 신뢰성 있는 연결이기 때문에 데이터를 확실하게 주고받아야 한다.
sender은 receiver에게 요청을 보낸 후 receiver으로부터 ACK를 기다리는데, ACK를 받지 못하게 된다면 패킷이 중간에 손실되었다고 판단하고 요청을 재전송한다. 
이렇게 요청을 재전송하는 것을 TCP 재전송이라 한다.
재전송 상황으로는 타임아웃중복응답이 있다.


UDP(User Datagram Protocol)

연결 과정이 없기 때문에 TCP 보다 빠른 전송이 가능하지만, 데이터가 유실될 수 있고,
데이터 패킷을 순차적으로 보내더라도 먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 수신될 수 있다.
UDP는 전송계층의 비연결 지향적 프로토콜을 뜻한다.
※비연결 지향적이란 데이터를 주고받을 때 연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식을 의미한다.


UDP 헤더구조

상태설명
Source Port송신지의 Port번호
Destination Port목적지의 Port번호
Total Length헤더를 포함한 전체 데이터그램의 크기를 의미하는 필드
Checksum데이터그램의 오류를 확인하기 위한 필드

UDP TCP의 체크섬 필드에서의 차이점
TCP 체크섬은 세그먼트 데이터 송신 시도 중에 발생될 비트의 오류를 검출해야 하기에 필수적이지만,
UDP 체크섬은 송신 측에서 체크섬 값을 전부 Zero(0)로 송출하면 수신 측은 체크섬을 하지 않아도 되는 선택사항이다.(옵션으로 사용)

UDP 통신 방식

  • 정보의 송수신에 대한 신호절차가 없고, 최소한의 오류만을 검증하여 패킷의 손실이 상대적으로 많은 편입니다.
  • TCP와 비교하여 신뢰성 있는 데이터의 전송을 보장할 수 없는 방식입니다.
  • 하지만 이러한 특징 덕분에 UDP는 굉장히 빠른 속도로 데이터를 전달할 수 있습니다.
  • 비연결형 서비스로써 1:1 통신 뿐만 아니라 1:N, N:N 통신에서도 쉽게 사용할 수 있습니다.

참고

https://evan-moon.github.io/2019/11/10/header-of-tcp/
https://dev-coco.tistory.com/144

profile
안녕하세요

0개의 댓글