신뢰적 데이터 전송의 원리
슬라이딩 윈도우 프로토콜(Sliding Window Protocol)
- 데이터 통신에서 사용되는 흐름 제어 기법 중 하나
- 송신자와 수신자가 각각 윈도우라는 버퍼를 가지고 있으며, 윈도우의 크기에 따라 한 번에 보낼 수 있는 패킷의 개수가 결정됨
- 슬라이딩 윈도우는 윈도우의 크기를 동적으로 조절하면서 효율적인 패킷 전송을 가능하게 함
- 즉, 패킷을 전송할 때 수신자로부터 승인을 받기 전에 송신자가 전송할 수 있는 데이터의 양을 규제하는 흐름 제어 메커니즘
GBN(Go-Back-N) ARQ 기법
- Go-Back-N 방식은 송신 측에서 전송할 패킷의 개수를 정함
- 버퍼에 그 개수만큼의 패킷을 저장하여 전송
- 버퍼를 window, 버퍼의 사이즈를 window size라고 함
- 버퍼의 시작점인 send_base, 다음에 보낼 패킷 번호인 next_seq_num을 가짐
- 수신 측은 이번에 받을 패킷의 번호를 기억하고 있음
- 이때 수신측은 누적 ACK(Cumulative ACK)을 사용
- 각 버퍼가 전송될 때 ACK를 받지 못한 가장 오래된 패킷의 Timer를 기준으로 Timeout이 발생
- Timeout 이 발생하면 window에 있는 모든 패킷을 전송
SR(Selective-Repeat) ARQ 기법
- GBN의 비효율성을 해결하기 위한 방식
- 송신측은 각 패킷마다 timer를 설정하고 timeout 된 패킷만 재전송 (GBN처럼 버퍼 모두를 전송하지 않음)
- 수신 측도 버퍼(window)를 가지고 있음
- 수신 측은 기다리던 패킷이 오면 바로 상위 계층으로 전달하고 ACK 신호를 보냄
- 수신 측은 기다리고 있던 패킷이 오지 않으면 일단 버퍼에 넣어놓고 ACK 신호를 보냄
- 수신 측의 버퍼가 가득 차면(패킷이 모두 도착하면) 상위 계층으로 전달
- 이외는 GBN과 비슷함
- GBN보다 효율적으로 보이지만 모든 패킷에 timer가 있기 때문에 overhead가 큼
TCP
- Transmission Control Protocol의 약자로 1:1 연결을 지향하며 신뢰할 수 있는 통신을 제공함
- 여기서 1:1은 각각 클라이언트와 서버를 의미
- 양 단에 연결을 수립한 뒤 데이터를 전송하고 연결을 종료함
- 일반적인 HTTP 통신은 TCP 방식을 따름
TCP Handshake
HandShake 는 직역하면 '악수'라는 뜻으로 마치 우리가 다른 사람과의 첫 만남에서 만나서 악수를 요청하고 악수를 받듯이,
정상적인 통신을 하기 전에, 일련의 과정을 거쳐 연결을 성립시키는 것을 말함
- TCP 방식에서 연결을 수립할 때 사용하는 방식
- 연결할 때는 3way-HandShake
- 연결을 종료할 때는 4way-HandShake를 사용함
3 way HandShake
-
TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정(Connection Establish) 하는 과정
-
양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한 쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 함
-
즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미
-
3 way HandShake엔 총 세 가지 과정이 존재
A 👉 B : 내 말 들리니?
B 👉 A : 그래, 잘 들려. 내 말은 들리니?
A 👉 B : 나도 잘 들려!
-
STEP 1
- 클라이언트는 서버에 접속을 요청하는 SYN 패킷을 전송
- 이때 클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됨
-
STEP 2
- 서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다림
- 이때 B서버는 SYN_RECEIVED 상태가 됨
-
STEP 3
- 클라이언트는 서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 됨
- 이때의 서버 상태가 ESTABLISHED 임
👉 위와 같은 방식으로 통신하는 것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식
<용어 정리>
- SYN(Synchronize sequence numbers)
- 연결 확인을 위해 보내는 무작위 숫자값(내 말 잘 들려?)
- ACK(Acknowledgements)
- 직역하면 '인정하다'라는 뜻
- Client 혹은 Server로 부터 받은 SYN에 1d을 더해 SYN을 잘 받았다는 뜻 (잘 들려!)
- ISN(Initial Sequence Numbers)
- Client와 Server가 각각 처음으로 생성한 SYN
- CLOSED
- LISTEN
- SYN-SENT
- SYN-RECEIVED
- SYN 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED
- 연결의 수립이 완료된 상태
- 서로 데이터를 교환할 수 있는 상태임
4 way HandShake
👉 즉, 4 way HandShake는 클라이언트와 서버가 서로 연결되어 있는 상태에서 통신을 종료하는 과정에 사용하는 방식임
<용어 정리>
- CLOSE-WAIT
- 상대방의 FIN(종료 요청)을 받은 상태
- 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알림
- LAST-ACK
- CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태
- FIN-WAIT-1
- 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다리는 상태
- FIN-WAIT-2
- 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다리는 상태
- CLOSING
- 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태
- TIME-WAIT
- 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태
- 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED 상태로 전이함
흐름제어(Flow control)
- 수신측이 송신측보다 데이터 처리 속도가 빠르면 문제없지만, 송신측의 속도가 빠를 경우 문제가 생김
- 수신측에서 제한된 저장 용량을 초과한 이후에 도착하는 데이터는 손실 될 수 있으며, 만약 손실 된다면 불필요하게 응답과 데이터 전송이 송/수신 측 간에 빈번이 발생
- 이러한 위험을 줄이기 위해 송신 측의 데이터 전송량을 수신측에 따라 제어해야 함
👉 송신측과 수신측 사이의 데이터 처리 속도 차이(흐름)를 해결하기 위한 기법
해결방법
- Stop and Wait
- 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법
- Sliding Window (Go Back N ARQ)
- 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어기법
혼잡제어(Congestion Control)
- 송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달됨
- 만약 한 라우터에 데이터가 몰릴 경우, 자신에게 온 데이터를 모두 처리할 수 없게 됨
- 이런 경우 호스트들은 또 다시 재전송을 하게되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실 발생
- 따라서 이러한 네트워크의 혼잡을 피하기 우해 송신측에서 보내는 데이터의 전송속도를 강제로 줄이게 되는데, 이러한 작업을 혼잡제어라고 함
- 또한 네트워크 내에 패킷의 수가 과도하게 증가하는 현상을 혼잡이라 하며, 혼잡 현상을 방지하거나 제거하는 기능을 혼잡제어라고 함
- 흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를포함한 보다 넓은 관점에서 전송 문제를 다루게 됨
👉 송신측의 데이터 전달과 네트워크 상의 데이터 처리 속도 차이를 해결하기 위한 기법
: 송신측에서 보내는 데이터의 전송 속도를 제어
해결방법
참조
TCP와 Handshake
흐름제어/혼잡제어1
흐름제어/혼잡제어2