2022-08-04
TCP와 UDP
전송 계층에서 사용되는 프로토콜인 TCP, UDP에 대해 알아보자!
TCP (Transmission Contorl Protocol)
4계층에서 동작하는 프로토콜로 신뢰할 수 없는 공용망에서 세션을 안전하게 연결하고,
윈도우 사이즈, 혼잡 정책 등을 교환해 정보 유실과 수신 용량을 확인한다.
이렇게 서로 주고 받는 현상으로 TCP를 양방향 연결 지향 통신 프로토콜이라 한다.
기본적으로 TCP는 클라이언트 응답 출처 신뢰성에 대한 매커니즘이 없다.
즉, 네이버에 TCP 연결을 요청했지만 응답이 네이버에서 온건지 해커에게서 온건지 확인 할 수 있는 방법이 없다.
따라서 추가적인 암호화 설정(TLS , SSL)이 필요하다.
데이터의 순서와 응답
데이터가 어떤 순서로 처리되어야 하는지에 대한 정보를 세그먼트에 시퀀스 번호
를 부여한다.
데이터를 전송받은 측은 수신한 데이터의 시퀀스 번호를 바탕으로 데이터를 조립한다.
만약 수신이 잘되었다면 ACK 번호
를 부여해 데이터 전송에 응답 정보를 알 수 있다.
즉, SQN와 ACK를 통해 데이터 순서와 유실에 대한 파악이 가능하다.
윈도우 사이즈 & 슬라이딩 윈도우
데이터를 전송할 때 패킷을 하나씩만 보내는 것은 비효율적이기에 많은 패킷을 한 번에 보내게 된다.
이때 한 번에 받을 수 있는 수신량을 윈도우 사이즈
라 한다.
그리고 네트워크 상황에 따라 윈도우 사이즈를 조절하는 것을 슬라이딩 윈도우
라 한다.
수신 측은 송신 측에게 ACK에 현재 남아있는 윈도우 사이즈를 보내게 되는데,
크기가 MSS
보다 작다면 송신측은 전송을 멈추고 Wait
상태가 된다.
이는 수신측에 TCP Buffer
의 여유공간이 부족한 이유고,
대부분의 경우가 프로세스가 데이터를 읽는 속도가 수신속도보다 느리게 되어 발생한다.
3-way handshake
TCP 프로토콜에서 연결 설정을 위해 사용되는 절차다.
이 과정을 통해 클라이언트와 서버는 상호적으로 초기화를 수행하고, 통신에 필요한 정보 이를테면
윈도우 사이즈
, MSS
, 혼잡 정책
, 초기 순서 번호(ISN)
등을 교환한다.
동작 과정
- 클라이언트가 세그먼트에 시퀀스 넘버(32bit) 와 SYN 플래그를 1로 표시하고 연결 시작 용도를 표시해 전송한다.
- 전달 받은 세그먼트에 SYN을 확인하고 시퀀스 넘버에 1을 추가한 값을 넣어 ACK로 응답한다. 동시에 자신의 시퀀스 넘버도 전송한다.
- 클라이언트는 ACK에 연결 가능 유/무를 파악하고 가능한 경우 서버 측 시퀀스 넘버에 1을 추가한 값 을 넣어 ACK로 응답한다. 동시에 자신의 시퀀스 넘버도 전송한다.
혼잡 제어 정책은 보편적으로 SACK를 사용하며 네트워크가 불안정 할 때를 대비한 정책이다.
4-way handshake
연결을 해지할 때 진행하는 과정이며 정상적 해지
, 긴급 해지
두 가지 해지 방식이 있다.
갑작스러운 연결 해지(Abrupt connection release)
RST(TCP Reset) 세그먼트가 전송되면 갑작스러운 해제가 실행된다.
주로 호스트의 응답이 없거나 연결 지원에 대한 자원이 부족할 때 발생한다.
정상적인 연결 해지(Graceful connection release)
연결을 완전 종료하는 것이 아닌 반만 종료하는 방식인 Half-Close
기법을 사용한다.
이는 연결은 종료하고자 하는데 보낼 데이터가 있으면 응하겠다는 의미와 같다.
동작 과정
- 클라이언트가 종료를 위해 FIN에 ACK를 조합해 요청한다.
- 서버는 FIN을 받았다는 ACK를 송신하고 클라이언트에 보낼 데이터가 더 없는지 확인한다.
- 더 이상 보낼 데이터가 없음을 확인하고 클라이언트에 FIN을 송신해 종료를 알린다.
- 클라이언트는 FIN을 받았다는 ACK를 송신하며 연결을 종료한다.
UDP (User Datagram Protocol)
연결 절차를 거치지 않고 일방적으로 데이터를 전송하는 방식이다.
주로 스트리밍 서비스와 같이 시각적, 청각적으로 민감한 경우 사용되는 방식이다.
즉, 실시간으로 영상이 끊기거나 사운드가 끊기는 경험을 저지하기 위해 주로 사용된다.
데이터 손실이 발생해도 재전송을 하지 않기 때문에 유실에 대한 리스크를 감수해야 되지만 전송 속도가 빠르다.
QUIC (Quick UDP Internet Connections)
Google에서 개발한 UDP 기반의 전송 프로토콜로 UDP와 다르게 TLS 암호화가 내장되어 있다.
또한 데이터 스트림을 동시에 병렬로 전송할 수 있어 빠른 데이터 전송이 가능하다.
TCP처럼 패킷 복구 및 재전송 기능을 갖고 있어 신뢰성 있는 데이터 전송을 보장한다.
참조
IT 엔지니어를 위한 네트워크 입문 - 길벗
널널한 개발자 - 이해하면 인생이 바뀌는 TCP 송/수신 원리
널널한 개발자 - SACK에 대한 간략한 소개