틀린 부분이 있다면 지적해주시면 감사하겠습니다. 공부하는 데 큰 도움이 됩니다.
HTTP는 TCP와 UDP방식이 있다. 그렇다면 TCP와 UDP는 무엇이며 어떤 차이가 있을까.
TCP (Transmission Control Protocol)
TCP는 연결 지향적인 프로토콜로 장치들 사이에서 논리적인 접속을 성립하기 위해 연결을 설정해 신뢰성을 보장하는 연결형 서비스이다.
연결 지향적 프로토콜
클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜을 의미한다.
네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟(데이터, 메세지, 세그먼트)을 안정적으로, 순서대로, 에러 없이 교환할 수 있다.
특징
1. 연결형 서비스로 가상 회선 방식을 제공한다.
3-way handshake 과정을 통해 연결을 설정하고 4-way handshake 과정을 통해 연결을 해제한다.
2. 흐름 제어
데이터 처리속도를 조절하여 수신자의 버퍼 오버플로우를 방지한다.
3. 혼잡 제어
네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지한다.
4. 높은 신뢰성을 보장
신뢰성이 높은 전송을 하기 때문에 UDP보다 속도가 느리다.
5. 전이중(Full-Duplex), 점대점(Point to Point) 방식
전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있다.
TCP는 연결형 서비스로, 신뢰성을 보장한다. 파일 전송과 같은 연속성보다 신뢰성 있는 전송이 중요할 때 사용한다.
연결 / 해제
연결 과정(3-way handshake)
Client → Server : 들려?
Server → Client : 잘 들려! 내 말은 들려?
Client → Server : 들려!
1. Open된 Client가 SYN을 보내고 SYN_SENT 상태로 대기한다.
2. Server는 SYN-RECEIVED 상태로 바꾸고 SYN과 응답 ACK를 보낸다.
3. SYN과 응답 ACK를 받은 클라이언트는 ESTABLISHED 상태로 변경하고, 서버에게 응답 ACK를 보낸다.
4. 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.
상태 | 설명 |
CLOSED | 연결 수립을 시작하기 전의 기본 상태 |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN을 요청한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 연결 수립이 완료된 상태, 서로 데이터 교환이 가능함. |
연결 해제 과정(4-way handshake)
Client → Server : 끊을게!
Server → Client : 잠시만!
Server → Client : 끊을게!
Client → Server : 그래 안녕!!
1. close를 실행한 클라이언트가 FIN을 보내고 FIN-WAIT-1 상태로 대기
2. 서버는 CLOSE-WAIT 상태로 응답 ACK를 전달한다. 동시에 해당 포트에 연결되어있는 App에 close요청을 한다.
3. ACK를 받은 클라이언트는 상태를 FIN-WAIT-2로 변경한다.
4. close 요청을 받은 App은 종료 프로세스를 진행한 뒤 FIN을 클라이언트로 보내 LAST-ACK상태로 바꾼다.
5. FIN을 받은 클라이언트는 ACK를 서버에 다시 전송하고 TIME-WAIT 상태로 바꾼다.
- TIME-WAIT에서 일정 시간이 지나면 CLOSE되며, ACK를 받은 서버도 포트를 CLOSED로 닫는다.
TIME-WAIT
먼저 연결을 끊는 쪽에서 생성되는 소켓으로 혹시 모를 전송 실패에 대비하기 위해 존재한다.
TIME-WAIT이 없다면 패킷의 손실이 발생하거나 통신자 간 연결 해제가 제대로 되지 않을 수도 있다.
상태 | 설명 |
FIN-WAIT-1 | 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다. |
FIN-WAIT-2 | 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다. |
CLOSE-WAIT | 상대방의 FIN을 받은 상태. FIN에 대한 ACK를 보내고 App에 종료를 알린다. |
LAST-ACK | CLOSE-WAIT 상태를 처리한 후 자신의 FIN 요청을 보내며, FIN에 대한 ACK를 기다리는 상태 |
TIME-WAIT | 모든 FIN에 대한 ACK를 받고, 연결 종료가 완료된 상태 새 연결과 겹치지 않도록 일정 시간을 기다린 후 CLOSED로 전이한다. |
UDP (User Datagram Protocol)
UDP는 비연결형 프로토콜로, 연결을 위해 할당되는 논리적인 경로가 없고, 각각의 패킷은 다른 경로로 전송되며, 독립적인 관계를 지닌다.
특징
1. 비연결형 서비스로 데이터그램 방식을 제공한다.
- 데이터의 전송 순서가 변경될 수 있다.
데이터그램 패킷 교환 방식
패킷이 독립적으로 이동하며 최적의 경로를 선택하여 가는데, 하나의 메시지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있으며 도착한 순서가 다를 수 있는 방식을 뜻한다.
2. 데이터의 수신 여부를 확인하지 않는다.
3. 신뢰성이 낮다.
- 흐름 제어가 없어서 제대로 전송되었는지, 오류가 없는지 확인할 수 없다.
4. TCP보다 속도가 빠르다.
5. 1:1, 1:N N:N통신이 가능하다.
UDP는 비연결형 서비스기 때문에, 연결을 설정하고 해제하는 과정이 존재하지 않는다.
서로 다른 경로로 독립적으로 처리하며, 흐름 제어나 혼잡 제어와 같은 기능을 처리하지 않기에 TCP보다 속도가 빠르며 네트워크 부하가 적다는 장점이 있지만, 신뢰성 있는 데이터 전송을 보장하지 못한다.
실시간 스트리밍처럼 신뢰성보다는 연속성 있는 전송이 필요할 때 사용한다.
정리
구분 | TCP | UDP |
연결 방식 | 연결형 서비스 | 비연결형 서비스 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 순서 보장 | 바뀔 수 있음 |
수신 여부 확인 | 확인함 | 확인 안함 |
통신 방식 | 1:1 | 1:1 / 1:N / N:N |
신뢰성 | 높다 | 낮다 |
속도 | 느리다 | 빠르다 |
참조
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!