1. 브라우저에 HTTP 입력하면 일어나는 일(OSI 7 Layer || TCP/IP 4 Layer)
2. TCP/UDP 특징
TCP (Transfer Controller Protocol)
Server-Client구조에서 사용되는 연결 지향형 프로토콜로 HTTP 1, 2버전에 적용된 프로토콜이다. 연결/연결해제 시 사용되는 N-way Handshake 규약으로 신뢰성을 확보한다.
TCP가 신뢰성을 보장할 수 있는 이유
- 데이터의 순서를 보장한다. 보낸 순서와 받는 순서가 일치하게 해준다. (패킷의 Sequence Number, Ack Number를 활용)
- 데이터의 도착을 보장한다. 보낸 데이터가 반드시 도착한다는 것을 보장한다. (재전송)
- 데이터의 무결성을 보장한다. 보낸 데이터와 받는 데이터가 일치 하다는 것을 보장한다. (CheckSum을 통한 오류검출)
3-way handshake - 연결
- Client가 SYNC 신호를 Server에 보낸다.
- Server가 SYNC, ACK 신호로 응답한다. (이 때 Server는 SYN flag가 설정된 패킷을 발송한다.)
- Client가 ACK 신호로 응답한다. (Server측 Establish 상태로 변경)
위 과정이 정상적으로 수행된다면 Server-Client간 연결이 수립된다.
3-way handshake - 연결 실패
- Client가 SYNC 신호를 Server에 보낸다.
- Server가 SYNC, ACK 신호로 응답한다. (이 때 Server는 SYN flag가 설정된 패킷을 발송한다.)
- Client가 SYNC, ACK 신호를 받지 못했다. NAK을 전송한다.
- Server가 2번 과정을 다시 수행한다. (재전송)
- Client 가 ACK 신호로 응답한다.
위 과정이 정상적으로 수행된다면 Server-Client간 연결이 수립된다.
4-way handshake - 연결 해제
- Client가 FIN 신호를 Server에 보낸다.
- Server가 ACK 신호로 응답한다.
- Server가 FIN 신호를 보낸다.
- Client가 ACK 신호로 응답한다.
UDP
Server-Client구조에서 사용되는 전송 프로토콜이고 TCP와 같이 연결을 수립하고/해제하는 Handshake과정이 없기 때문에 속도는 빠르지만, 신뢰성을 보장할 수 없는 프로토콜이다.
HTTP 3버전부터는 UDP를 기반으로한 프로토콜을 사용하는데 어떻게 이 프로토콜로 변경한건지 알아보자.
Reliable UDP
RUDP 또한 TCP가 신뢰성을 보장하는 방법을 최소화하여 구현한 프로토콜이다.
순서를 보장하는 방법
패킷에 번호를 붙이고, 번호순서대로 패킷이 도착할때까지 기다렸다가 패킷이 모두 모이면 그때 패킷을 사용한다.
도착을 보장하는 방법
패킷에 번호를 붙이고, 해당 번호의 패킷이 도착할때까지 재전송한다. 보내는 입장에서 재전송을 하는 이유는, UDP이기에 받는 입장에서는 자신에게 보내려는 패킷이 있었는지 알 방법이 없기 때문이다.
무결성을 보장하는 방법
CheckSum을 통해서, 데이터가 손실되지 않았는지 검증한다.
RUDP 구현 모델 - 패킷구성
전송하는 패킷에 RDUP 관련된 헤더를 추가해서 네트워크 패킷을 구성한다.
- 전송 타입
- 패킷의 고유넘버
- 에러 검출코드
RUDP 구현 모델 - 전송 타입
RUDP에서 UDP의 특성을 보완하는 것은 전송을 보장하는 것
과 순서를 보정하는 것
이다. 이 특성을로 3가지 타입의 패킷
을 나눌 수 있다.
전송을 보장하지 않는
타입 (도착하지 않더라도 상관없다는 UDP의 특징)- 이 타입은 수신 즉시 클라이언트에 넘겨주면 된다.
전송을 보장
하지만순서가 상관없는
타입 (보내기만 하면 된다는 UDP의 특징)- 이 타입은 즉시 처리하되 수신했다는 패킷을 상대방에게 보낸다.
전송을 보장
하며, 보낸순서대로 받는
타입 (TCP의 특징)- 이 타입은 받았다는 패킷을 상대방에게 전송은 하며, 순서가 맞으면 즉시 처리하고 그렇지 않는 패킷은 버퍼에 쌓아둔 후 순서가 맞으면 순서대로 패킷을 처리한다.
RUDP 구현 모델 - 연결 검사
UDP의 경우 기본적으로 연결이 끊겼는지에 대한 이벤트가 없으므로 disconnect에 대한 패킷을 정의할 필요가 있다.
WSAECONNRESET 에러를 내는 경우에는 끊겼다고 판단할 수 있지만, 강제 종료된 경우(혹은 시스템이 강제 종료된 경우)에 한해서는 판단할 수가 없으므로 주기적으로 연결 여부를 확인
하는 것이 좋다.