TCP와 UDP는 전송계층 프로토콜이다.
데이터의 전달을 담당하며 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 제어를 담당한다.
프로토콜 종류 | TCP | UDP |
연결방식 | 연결형 | 비연결형 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 전송 순서 보장 | 전송 순서 바뀔 수 있음 |
수신 여부 | 수신 여부 확인 | 수신 여부 확인 안함 |
통신 방식 | 1:1 | 1:1 or 1:N or N:N |
신뢰성 | 높다 | 낮다 |
속도 | 느리다 | 빠르다 |
UDP
- 비연결형 서비스 (연결을 위해 할당되는 논리적인 경로가 없고, 각각의 패킷은 다른 경로로 전송되며, 독립적인 관계를 지닌다.)
- 데이터그램 패킷 교환 방식 사용
- 3 way handshaking을 지원하지 않기 때문에 신뢰성이 떨어진다. (UDP도 신뢰성을 애플리케이션 저체에서 제공한다면 신뢰적인 데이터를 전송할 수 있다.)
- 수신여부를 확인하지 않기 때문에 속도가 빠르다.
- multimedia streaming service에 적합하다.
데이터그램 패킷 교환 방식
- 패킷이 독립적으로 이동하며 최적의 경로로 간다
- 하나의 메세지에서 분할된 여러 패킷은 서로 다른 경로로 전송될 수 있다
- 도착한 순서가 다를 수 있다
TCP
- 연결지향 프로토콜 (클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜을 의미)
- 가상회선 패킷 교환 방식 사용
- 흐름제어 : 데이터의 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지
- 혼잡제어 : 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
- 높은 신뢰성 보장
- 전이중(Full-Duplex), 점대점(Point to Point) 방식
- 전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
- 점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있다.
가상회선 패킷 교환 방식
- 각 패킷에는 가상회선 식별자가 포함된다
- 모드 패킷을 전송하면 가상회선이 해제되고 패킷들은 전송된 순서대로 도착하는 방식
흐름 제어(Flow Control)
- 수신자가 처리할 수 있는 데이터 속도가 다르기 때문에, 송신 측은 수신 측의 데이터 처리 속도를 파악하고 얼마나 빠르게 어느 정도의 데이터를 전송할 지 제어
- 슬라이딩 윈도우(Sliding Window) 방식을 사용
- Window 라는 데이터를 담는 공간을 동적으로 조절하여 데이터량을 조절
오류 제어(Error Control)
- 통신 도중에 데이터가 유실되거나 잘못된 데이터가 수신되었을 경우 대처
- Go Bank N 기법과 Selective Repeat(선택적인 재전송) 기법을 사용
- Go Bank N 기법 : 어느 데이터로부터 오류가 발생했는지 파악하여, 그 부분만 다시 순서대로 보내 제어한다.
- Selective Repeat 기법 : 에러난 데이터만 재전송하고 그전에 받았던 순서가 잘못된 데이터 버퍼를 재정렬하여 제어한다.
혼잡 제어(Congestion Control)
- 네트워크가 불안정하여 데이터가 원활히 통신이 안되면 제어를 통해 재전송을 하게 되는데, 재전송 작업이 반복되면 네트워크가 붕괴될 수도 있다.
- 따라서 네트워크 혼잡 상태가 감지되면 송식 측의 전송 데이터 크기를 조절하여 전송량을 조절한다.
- TCP에는 Tahoe, Reno, New Reno, Cubic, Elastic-TCP ..등 다양한 혼잡 제어 기법이 존재한다.
3way handshake (TCP 연결 과정)
TCP에서 서버와 클라이언트 사이에 서로 연결을 논리적으로 수립하는 과정
- SYN 단계: 클라이언트는 ISN(고유 시퀀스)을 담아 서버로 SYN(연결 요청 플래그) 전송. 클라이언트는 SYN_SENT 상태로 대기
- SYN+ACK 단계: 서버는 SYN 수신하고 서버의 ISN을 담아 SYN+ACK를 클라이언트로 보냄 (승인번호 : 클라이언트 ISN + 1). 서버는 SYN-RECEIVED 상태로 바뀜
- ACK 단계: SYN과 응답 ACK를 받은 클라이언트는 ESTABLISHED 상태로 변경하고 승인번호를 담아 ACK(응답 플래그)를 서버로 전송
- 응답 ACK를 받은 서버는 ESTABLISHED 상태로 변경한다.
상태 | 설명 |
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN을 요청한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
SYN(synchronize sequence numbers) - 연결 요청 플래그
ACK(acknowledgements) - 응답 플래그
ISN - 고유 시퀀스 번호
4way handshake (연결 해제)
TCP에서 서버와 클라이언트 사이에 서로 연결을 논리적으로 해제하는 과정
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로 닫는다
TIME_WAIT : 먼저 연결을 끊는 쪽에서 생성되는 소켓. 소켓이 바로 소멸되지 않고 일정 시간 유지되는 상태
TIME_WAIT은 왜 존재하는가?
- 지연 패킷이 발생할 수 있다
- 지연 패킷을 처리하지 못한다면 데이터 무결성 문제 발생 (데이터 무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것)
- 두 장치가 연결이 닫혔는지 확인하기 위해서
상태 | 설명 |
ESTABLISHED | 연결 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
FIN-WAIT-1 | 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다. |
FIN-WAIT-2 | 자신이 보낸 FIN에 대한 ACK를 받았고, 상대방의 FIN을 기다린다. |
CLOSE-WAIT | 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 어플리케이션에 종료를 알린다. |
LAST-ACK | COLSE-WAIT 상태를 처리 후 자신의 FIN 요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태. |
TIME-WAIT | 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 기다린 후 CLOSED로 전이 한다. |
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
참고
https://woovictory.github.io/2018/12/28/Network-Packet-Switching-Method/
https://dev-coco.tistory.com/144