본문 바로가기

Server

[Server] TCP, UDP | TCP 프로토콜 | 3way handshake

728x90

TCP, UDP의 등장

IP프로토콜의 한계를 해결하기 위해서 TCP와 UDP가 등장했다.

 

IP프로토콜의 한계 

비 연결성 : 대상이 서비스 불능이어도 패킷 전송

비 신뢰성 : 패킷 전달 순서의 문제, 패킷 소실

 

인터넷 프로토콜의 4계층

 

모든 개발자를 위한 HTTP 웹 기본지식

위는 인터넷 프로토콜의 4계층이다. 일단 인터넷 계층, 전송계층을 살펴보면 IP프로토콜 위에 TCP 또는 UDP 전송 계층을 더해서 보완해주는 것이라고 이해해본다.

 

모든 개발자를 위한 HTTP 웹 기본지식

예를 들어, 채팅프로그램으로 Hello, world를 전송한다고 하자. 채팅프로그램에서 소켓 라이브러리를 사용하기 때문에 Hello는 소켓을 거쳐간다. 이 과정에서 어플리케이션 계층에서 os계층(전송, 인터넷 계층)으로 전달된다. 이러한 과정에서 먼저 전송계층을 거친다. 전송계층에서 TCP를 거치면서 TCP 정보로 감싸진다. 그리고 전송계층에서 생성된 TCP + 메시지(Hello world)는 IP계층으로 가서 IP 정보를 담아서 TCP/IP패킷으로 생성된다. 결국 IP정보, TCP정보, 내가 보내길 원하는 정보들이 패킷으로 생성되었다. 그리고 이 패킷이 네트워크 인터페이스를 통해서 인터넷을 거쳐 서버로 전달된다.

 

IP패킷과 TCP/IP 패킷

 

패킷?

패키지(수화물) + 버킷(덩어리) 택배박스와 같은 것.

IP 패킷

: 출발지 IP + 목적지 IP, 기타.. + 전송 데이터

 

TCP/IP 패킷

: IP패킷에 TCP와 관련된 정보가 들어간다.

출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증정보.... (IP 프로토콜로 해결이 안 됐던 순서 문제 해결)

 

 

TCP 프로토콜?

: 전송 제어 프로토콜(Transmission Control Protocol)

 

특징

1. 연결지향 - TCP 3way handshake (가상연결)

: 비연결성 해결. 연결이 됐는지 안 됐는지 확인을 하고 패킷을 보낸다. 

 

2. 데이터 전달 보증

: 중간에 데이터가 누락되면 알 수 있다. 

 

3. 순서 보장

 

4. 신뢰할 수 있는 프로토콜

 

5. 현재는 대부분 TCP 사용

 

 

TCP 3way handshake란 무엇인가?

(연결지향, 연결이 되었는지 안 되었는지를 어떻게 알 수 있을까?)

모든 개발자를 위한 HTTP 웹 기본지식

1. TCP/IP 프로토콜로 연결을 하면 클라이언트에서 서버로 SYN(syncronize, 연결 해도됨?) 연결을 요청하는 메시지를 보낸다. 

2. 서버에서 확인을 하고 ACK(연결 확인 ok) 메시지를 보내면서 서버도 클라이언트에 SYN(나도 연결 해도됨?) 연결 요청을 보낸다. (SYN + ACK 보내기)

3. 클라이언트도 연결요청을 받고 ACK(내 연결 ok 감사. 너도 연결 확인 ok)를 보내서 서로의 연결을 확인한다. 

이때 클라이언트가 마지막 연결 확인 메시지를 보내면서 데이터도 함께 전송 가능하다.

 

그래서 SYN을 처음 보냈을 때 응답이 없으면 연결이 안 되는 걸 알아서 데이터를 안 보낸다. 

 

데이터 전달 보증

클라이언트에서 서버로 데이터를 전송하면, 서버에서 클라이언트로 데이터를 잘 받았다고 보내줌.

만약 서버에서 아무 응답이 없다면, 문제가 있다고 판단해서 다시 보냄. (다시 보냄으로써 데이터가 잘 전달되었다)

 

순서보장

모든 개발자를 위한 HTTP 웹 기본지식

나눠진 패킷의 순서가 잘못 도착했다면, 잘못 도착한 순서부터 버리고 다시 보낸다. 

 

 

그렇다면, 어떻게 이렇게 데이터 전달이 보증되고, 순서가 보장되는 걸까?

그것은 바로 TCP 데이터 안의 전송제어 정보, 순서정보, 검증정보 등이 추가되어있기 때문에 이러한 것들로 인해 가능한 것이다.

 

UDP 프로토콜? 

: 사용자 데이터그램 프로토콜(User Datagram Protocol)

 

특징

1. 기능이 거의 없음 (IP프로토콜과 비슷)

 

2.. 연결지향(TCP 3way handshake) 아님

 

3. 데이터 전달 보증 X

 

4. 순서 보장 X

 

5. 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름

 

정리

: IP프로토콜과 거의 같다. +PORT+체크섬 정도만 추가

: 애플리케이션에서 추가 작업 필요

 

* port :

내 ip로 패킷이 도착했을 때, 내가 여러 어플리케이션을 사용하고 있다면?

한 pc에는 하나의 ip사용 -> 어플리케이션들도 다 같은 ip. 

따라서 패킷이 어느 어플리케이션에 도착했는지 구별을 위해 port를 사용

 

* 체크섬:

메시지에 대해서 제대로 맞는지 검증해주는 데이터

 

그럼 기능이 별로 없는데 UDP를 왜 쓰지?

TCP는 3way handshake하면서 오래걸린다.

검증하기 위한 TCP안의 데이터가 너무 많다.

이러한 맥락에서 HTTP3에서 UDP 사용

 

 

 

 

 

 

 

 

모든 개발자를 위한 HTTP 웹 기본지식 을 토대로 이해한 내용을 정리한 글입니다 🙂

 

 

참고 자료

모든 개발자를 위한 HTTP 웹 기본지식 https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

HTTP 웹 기본지식 https://intrepidgeeks.com/tutorial/for-all-developers-basic-knowledge-of-http-web-internet 

HTTP 웹 기본지식 https://jihyee.tistory.com/10

HTTP 웹 기본지식 https://velog.io/@urtimeislimited/%EB%AA%A8%EB%93%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-HTTP-%EC%9B%B9-%EA%B8%B0%EB%B3%B8-%EC%A7%80%EC%8B%9D

728x90