TCP, UDP

2023. 12. 13. 01:50네트워크/웹

대부분의 내용은 인프런 김영한 강사님의 모든 개발자를 위한 HTTP 웹 기본 지식을 참고했습니다.


 

IP(인터넷 프로토콜)에서 인터넷 프로토콜의 단점 비연결성, 비신뢰성을 보완하기 위해 TCP, UDP가 필요했습니다.

그럼 이제 TCP와 UDP에 대해 알아봅시다.

 

 


TCP/IP


 

연결 지향적 프로토콜

TCP(전송 제어 프로토콜)는 OSI 7 Layer의 4 계층인 전송 계층에서 사용되는 프로토콜로

신뢰할 수 있고 정확한 데이터를 전달하기 위한 연결 지향적 프로토콜입니다.

 

데이터의 신뢰성에 중점

IP(인터넷 프로토콜)가 패킷들의 관계를 이해하지 못하고 목적지에 패킷을 전달하는 것에 중점을 두었다면,

TCP는 송신자와 수신자 양쪽 모두 통신할 준비가 되었는지, 데이터가 제대로 전송되었는지 등

데이터의 신뢰성을 검사하는 데에 중점을 둔다.

 

TCP와 IP

IP는 네트워크 계층에서 동작하며, 주로 패킷의 출발지와 목적지를 정의하고 라우팅을 통해 목적지까지 전달하는 역할을 합니다.

TCP는 앞서 말했듯이 전송 계층에서 동작하며, 데이터의 신뢰성 있는 전송을 담당합니다.
연결 지향적이며, 데이터 전송 후에는 수신 확인 및 재전송 등의 기능을 통해 신뢰성을 확보합니다.

 

결과적으로, TCP는 IP를 기반으로 동작하며 IP는 패킷을 목적지까지 라우팅하여 전달하는데 TCP는 이러한 IP의 기본 기능 위에추가적으로 연결 지향성, 신뢰성, 순서 보장 등의 기능을 제공해 애플리케이션 간의 안정적인 데이터 통신을 지원합니다.

 

 

 

TCP의 특징

1. 연결지향성 (Connection-Oriented)

TCP는 통신 시작 전에 연결을 설정하고, 통신이 끝나면 연결을 해제합니다.

이는 양쪽 간에 신뢰성 있는 양방향 통신을 위한 가상의 연결을 구축하는 과정을 포함합니다.

(연결 시 TCP 3 way handshake, 연결 종료 시 TCP 4 way handshake)

 

2. 데이터 순차 전송 보장

데이터가 전송지에서 보낸 순서대로 도착할 수 있도록 보장합니다.

 

3. 흐름제어

데이터의 처리속도를 조절하여 수신자가 받을 수 있을 만큼만 데이터를 효율적으로 전달해

수신자의 버퍼 오버플로우를 방지합니다.

 

4. 혼잡제어

네트워크 혼잡 정도를 파악하고 송신자의 데이터 전송량을 조절해

네트워크 내에 패킷수가 과도하게 많지 않도록 하여 혼잡을 완화하는 기능을 수행합니다.

 

5. 신뢰성 있는 전송

데이터를 전송한 후 수신 측에서 확인 응답을 보내어 손실이나 오류가 있는 경우 재전송을 요청합니다.

이로써 데이터의 신뢰성을 보장합니다.

 

6. 데이터 세그먼트 (Data Segmentation)

TCP는 큰 데이터를 여러 작은 세그먼트로 나누어 전송하고, 수신 측에서 이를 재조립하여 응용 프로그램에 전달합니다.

이는 효율적은 전송을 가능하게 합니다.

 

7. 포트(Port) 지정

각 TCP 연결은 포트 번호를 사용하여 응용 프로그램을 식별합니다.

이를 통해 하나의 컴퓨터에서 여러 응용 프로그램이 동시에 TCP 연결을 수립할 수 있게 합니다.

 

 

TCP 세그먼트

TCP 내용 참조(http://www.ktword.co.kr/test/view/view.php?m_temp1=1889)

 

TCP 세그먼트는 TCP 세션으로 연결된 양 끝단 간에 서로 교환, 전달되는 데이터 단위를 말합니다.

 

TCP 세그먼트의 구조

 

TCP 세그먼트는 Header와 Data로 구성되어 있습니다.

※ TCP 헤더 크기 : (기본 20 ~ 60 바이트)

 

1. 발신지 / 목적지 소스포트 

포트번호로 해당 송신자와 수신자의 어떤 응용프로그램이 통신을 시작하고

어떤 응용프로그램이 수신을 해야 하는지 파악합니다.

 

2. 일련번호 (Sequence number)

세그먼트에 포함된 데이터의 일련번호를 나타냅니다.

이를 통해서 데이터의 순서를 추적할 수 있습니다.

 

3. 확인응답 번호 (Acknowledgement number)

수신 측에서 송신 측으로 돌아가는 세그먼트에서 사용되며, 수신한 마지막 세그먼트의 일련번호에 1을 더한 값입니다.

데이터의 수신 여부를 확인하기 위해 사용됩니다.

 

4. 헤더 길이 (Header Length, HLEN)

TCP 헤더의 길이를 나타냅니다.
32bit(4byte) 단위로 표시되며, 헤더의 길이는 가변적입니다.

 

5. 플래그 (Flags)

플래그는 여러 가지가 있으며, 주요 플래그는 아래와 같습니다.

  • SYN(Synchronize): 연걸 설정을 시작할 때 설정되는 플래그입니다.
  • ACK(Acknowledgement): 확인 응답 번호 필드가 유효함을 나타냅니다.
  • PSH(Push): 수신자에게 수신된 데이터를 즉시 전달하도록 요청하는 플래그입니다.
  • FIN(Finish): 연결 종료를 나타나며, 송신자가 데이터 전송을 완료했음을 의미합니다.

6.  윈도우 크기 (Window Size)

송신자가 수신자로부터 수신 확인을 받은 후 전송할 수 있는 데이터의 양입니다.

흐름제어를 위해 사용하는 필드로 수신자가 송신자에게 자신의 수신 버퍼 여유용량의 크기를 지속적으로 통보합니다.

 

7. 체크섬 (Checksum)

오류 검출을 위한 체크섬 값으로, 헤더와 데이터를 포함하여 계산됩니다.

 

8. 긴급 포인터 (Urgent Pointer)

긴급 데이터의 끝을 가리키는 데 사용됩니다.

URG 플래그가 설정되어 있는 경우에만 의미가 있습니다.

 

9. 옵션 (Option)

최대 40byte까지 TCP 옵션 정보를 포함할 수 있습니다.

최대 세그먼트 크기(MSS)등이 여기에 포함됩니다.

 

신뢰성과 흐름 제어 제공

TCP는 신뢰성 있는 데이터와 흐름 제어를 제공합니다.

TCP 세그먼트의 일련번호는 앞서 말했듯이 전송되는 데이터의 순서를 나타내는데,
수신자는 이 일련번호를 사용하여 데이터를 올바른 순서로 재조립하기 때문에 전송된 데이터의 정확한 순서를 보장합니다.

 

그리고 수신자는 일련번호를 사용하여 어떤 데이터가 손실되었는지를 판단할 수 있기 때문에

송신자가 확인 응답(Acknowledgment)을 받지 못하면, 해당 일련번호의 데이터가 손실되었다고 간주하고

해당 데이터를 재전송합니다.

 

TCP는 세그먼트의 윈도우 크기(Window Size)를 통해 흐름제어를 수행합니다.

수신자는 데이터를 받은 후 다시 송신자에게 확인 응답(ACK)을 보내며 윈도우 크기를 통해 송신자에게 받을 수 있는 데이터의 양을 통보하고 송신자는 이 정보를 기반으로 안전하게 데이터를 전송하기 위해 전송 속도를 조절합니다.

 

 

TCP의 연결 및 연결 해제 과정

TCP 3 way handshake

 

1. Client ⇨ Server : SYN

클라이언트가 서버에서 연결을 시작하고자 SYN 패킷을 전송합니다.

이때, 클라이언트는 초기 일련번호를 선택하고 플래그로 SYN을 설정합니다.

 

2. Server ⇨ Client : SYN + ACK

서버는 클라이언트의 SYN을 받고 클라이언트에게 응답으로 SYN과 ACK를 설정한 패킷을 전송합니다.

서버도 초기 일련번호를 선택합니다.

 

3. Client ⇨ Server : ACK

클라이언트는 서버의 SYN + ACK를 받고 ACK를 설정하여 응답합니다.

이로써 클라이언트와 서버 간에 연결이 설정됩니다.

 

TCP 4 way handshake

 

1. Client Server : FIN

클라이언트가 연결을 종료하고자 FIN을 설정한 패킷을 전송합니다.

서버에서 응답이 올때까지 기다리고 있으며 이 상황을 FIN-WAIT-1이라고 합니다.

 

2. Server Client : ACK

서버는 클라이언트의 FIN을 받고 확인 응답으로 ACK를 설정한 패킷을 전송합니다.

이 때 클라이언트는 서버에서 다시 FIN을 보내기를 기다리며 이 상황을 FIN-WAIT-2이라고 합니다.

FIN-WAIT-2에서 클라이언트는 데이터를 보내는 것은 불가능 하지만 받는 것은 가능합니다.

그래서 서버는 클라이언트에게 아직 못보낸 데이터가 있다면 클라이언트에게 마저 데이터를 보냅니다.

 

3. Server Client : FIN

서버는 더 이상 통신할 데이터가 없다면 자신도 연결을 종료하고, FIN을 설정한 패킷을 전송합니다.

 

4. Client Server : ACK

클라이언트는 서버의 FIN을 받고 ACK를 설정한 패킷을 전송합니다.

이후 일정시간 대기 후 클라이언트는 완전히 연결을 종료합니다.

 

이러한 handshake 과정을 통해서 TCP는 IP의 비연결성과 관련된 문제를 극복하고,

데이터의 신뢰성 및 정확한 전송을 보장합니다.

 

 


UDP/IP


 

UDP는 TCP와 마찬가지로 전송 계층 프로토콜 중 하나로 데이터를 신속하고 전송하는 비연결형 프로토콜입니다.

(3way handshake와 같은 사전 통신연결 사용 X)

UDP는 TCP와 다르게 연결 설정, 연결 해제, 흐름 제어, 혼잡 제어와 같은 기능을 제공하지 않습니다.

그대신에 경량화되고 간단한 헤더를 사용하여 빠른 데이터 전송을 목적으로 합니다.

 

UDP는 주로 소켓 통신에서 사용되며, 신뢰성이나 정확성보다는 속도와 단순함이 중요한 상황에서 사용합니다.

 

비신뢰적인 UDP를 사용하는 이유

TCP의 경우 사전 통신연결, 혼잡제어, 수신여부 확인 등의 과정을 거치기 때문에 통신과정이 길어질 수 있습니다.

몇몇의 실시간 애플리케이션에서는 지나친 지연을 지양하고 조금의 데이터 손실을 감수하기 때문에 이러한 상황에서는 맞지 않을 수 있습니다.

또한 몇몇 응용 프로그램은 자체적으로 신뢰성 및 흐름제어를 관리하기 때문에 직접적인 제어가 힘든 TCP보다 UDP를 사용하는 경우가 있습니다.

'네트워크 > ' 카테고리의 다른 글

[HTTP] HTTP 정의와 HTTP스펙  (0) 2024.02.22
주소창에 www.google.com을 검색하면 일어나는 일 (DNS)  (0) 2024.02.12
URI, URL, URN  (0) 2024.01.19
OSI 7계층과 TCP/IP 4계층  (0) 2023.12.15
IP(인터넷 프로토콜)  (0) 2023.11.23