신뢰적 데이터 전송의 원리
슬라이딩 윈도우
슬라이딩 윈도우 프로토콜은 두 호스트 간 데이터 전송을 해주는 일반적인 통신 프로토콜이며 . 오류 제어와 흐름 제어를 지원하는 방식입니다. 송신자와 수신자가 각각 윈도우라는 버퍼를 가지고 있으며 , 윈도우의 크기에 따라 한 번에 보낼 수 있는 패킷의 개수가 결정된다.
즉 슬라이딩 윈도우는 윈도우의 크기를 동적으로 조절하면서 효율적인 패킷 전송을 가능하게 한다.
동작 과정
- 송신자는 윈도우의 크기만큼 패킷을 전송하고 , 각 패킷에 순서 번호를 부여한다.
- 수신자는 패킷을 받으면 순서 번호에 따라 자신의 윈도우에 저장하고 , 가장 작은 순서 번호를 가진 패킷부터 상위 계층으로 전달한다. 또한 송신자에게 ACK(acknowledgement) 메시지를 보내 받은 패킷을 확인한다.
- 송신자는 ACK 메시지를 받으면 자신의 윈도우를 오른쪽으로 이동시키고 , 새로운 패킷을 전송합니다. ACK 메시지가 오지 않은 패킷은 일정 시간이 지나면 재전송한다.
- 수신자는 자신의 윈도우를 왼쪽으로 이동시키면서 상위 계층으로 전달 할 수 있는 패킷을 찾는다. 만약 순서대로 받지 못한 패킷이 있으면 NAK(negative acknowledgement)를 보내어 재전송을 요청한다.

위의 이미지에서 알 수 있듯이 송신 측에서는 1 ~ 5까지의 프레임이 전송이 가능하다 . 따라서 1 ~ 5 까지를 window에 담고 먼저 1 , 2 를 전송한다. 그럼 송신측의 윈도우는 (그림에는 나타나지 않았지만) 3 , 4 , 5 만큼 윈도우의 크기가 줄어든다.
이때 수신측에서 1, 2 데이터를 정상적으로 수신했음을 알리는 ACK를 송신측에 보내면 송신측은 ACK를 받고 ACK의 프레임 수만큼 오른 쪽으로 윈도우를 이동한다.
Go - Back - N
Go - Back - N 은 수신자측에서 순서대로 받지 못한 패킷이 있다면 해당 패킷을 포함해 다시 재전송 하는 방식이다.
단점으로 패킷 하나가 오류가 발생하면 정상 전송된 패킷이여도 버리고 잘못된 패킷부터 다시 재전송하는 문제가 있다.

Selective Repeat
Selective Repeat 은 수신자측에서 받은 각각의 패킷들에 대해 ACK을 보내는 방식이다. ACK 를 받지 않은 패킷은 손실된 패킷으로 간주하고 해당 패킷만 재전송한다. 정상 패킷은 버리지 않고 버퍼에 저장 한다.

TCP
TCP 란
TCP 프로토콜은 전송계층인 4계층에서 포함되어있 대표 프로토콜이며 호스트간의 데이터 전송을 할 때 연결지향 , 신뢰성 , 오류 제어 , 혼잡 제어 기능을 활용하여 안전하게 통신하게 해주는 프로토콜이다.
데이터 단위는 세그먼트(TCP Header + Data)이다.
TCP 특징
- 연결 지향 프로토콜
- 순서 제어 : 데이터의 전송 순서를 보장
- Stream 기반 전송 방식 : 데이터를 임의의 크기로 나누어서 전송하는 방식
- 신뢰성 있는 프로토콜
- 흐름 제어(Flow Control) : 수신자가 수용 할 수 있는 데이터의 크기만큼만 전송
- 슬라이딩 윈도우 방식 : 상대방의 ACK를 기다리지 않고 연속적으로 전송
- 윈도우 : 수신 버퍼의 여유 공간 크기로 수신 ACK 없이 전송할 수 있는 최대 Byte 크기
- 오류 제어
- 재전송 : 데이터 전송 오류 또는 누락 발생시 재전송
- 혼잡 제어(Congestion Control)
- 타임 아웃 재전송 ( 매우 혼잡한 상태)
- 재전송은 일정 시간 또는 횟수 동안만 발생하여 무한 재전송을 방지
- 타임 아웃 재전송 ( 매우 혼잡한 상태)
3 - way - handshake
서버와 클라이언트가 데이터 송수신을 하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 연결을 수립하는 과정을 의미한다.
- Client > Server : TCP SYN
- Server > Client : TCP SYN , ACK
- Client > Server : TCP ACK

3 - way - handshake 과정
- A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다.
이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태 , B서버는 Wait for Client 상태이다. - B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.
- A클라이언트는 B서버에게 ACK를 보내고 이후로부터는 연결이 이루어지고 데이터 송수신이 이루어진다.
이때의 B서버 상태가 ESTABLISHED 이다.
4 - way - Handshake
3 - Way - handshake 는 TCP 의 연결을 초기화 할 때 사용한다면 ,
4 - Way - Handshake는 연결을 종료하기 위해 수행되는 절차다.

과정
- 데이터를 전부 송신한 Client가 FIN(연결종료 요청 TCP Flag) 송신
- 서버가 ACK(응답) 송신
- 서버에서 남은 패킷 송신(일정 시간 대기)
- 서버가 FIN 송신
- 클라이언트가 ACK 송신
TCP 빠른 재전송 ( Fast Retransmit)
빠른 재전송은 TCP 의 혼잡 제어(Congestion control) 조절 방법 중 하나이다. 패킷을 받는 수신자 입장에서는 패킷들이 순서대로 도착하지 않는 경우가 생길 수 있다. 예를 들어 1 , 2 , 3 , 4 , 5 번의 데이터가 순서대로 와야하는데 1 , 2 다음 4번이 온 것이다. 원래 기존의 방식은 3번이 Loss 가 발생 한 것이므로 5번을 추가로 전송하지 않고 1 , 2 ,3 , 4, 5 데이터를 다시 재전송하도록 요구 한다.
하지만 빠른 재전송 방식에서는 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다. 단 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보낸다.

위의 그림을 예를들어 설명하면 1, 2 , 3 , 4, 5 ... 번의 데이터가 순서대로 와야하는데 2, 3 다음 5번이 온 상황이다.
이런 상황이 발생했을 때 수신측에서는 순서대로 잘 도착한 마지막 패킷의 다음 순번을 ACK 패킷에 실어서 보낸다. 그러므로 ACK 3 번의 (다음 순번4)를 담아서 보낸다. 그리고 이런 중복 ACK를 3개 받으면 재전송이 이루어진다.
송신 측은 자신이 설정한 타임아웃 시간이 지나지 않았어도 바로 해당 패킷을 재전송 할 수 있기 때문에 보다 빠른 전송률을 유지할 수 있다.
Congestion Control ( 혼잡 제어 )
혼잡제어라고도 불리며 송신측의 데이터 전달과 네트워크 상의 데이터 처리 속도를 조절하여 네트워크가 혼잡해지지 않게 조절하는 것을 말한다.
- 송신측의 데이터는 지역망이나 인터넷으로 연결된 대형 네트워크를 통해 전달된다. 만약 한 라우터에 데이터가 몰릴 경우 , 자신에게 온 데이터를 모두 처리할 수 없게 된다. 이런 경우 호스트들은 또 다시 재전송을 하게되고 결국 혼잡만 가중시켜 오버플로우나 데이터 손실을 발생시키게 된다. 따라서 이러한 네트워크의 혼잡을 피하기 위해 네트워크 내의 패킷 수를 조절하여 네트워크의 오버플로우를 방지하는 기능이.
- 종류로는 Slow Start , Fast Retransimt ,Fast Recovery 등이 있다.
Flow control ( 흐름 제어 )
수신 측이 송신측보다 데이터 처리 속도가 빠르면 문제가 없지만 , 송신 측의 속도가 빠를 경우 수신 측 버퍼가 넘치는 오버 플로우 문제가 발생할 수 있다. 이러한 문제를 줄이기 위해 윈도우 크기로 송신 측의 데이터 전송량을 조절한다.
종류로는 stop and wait , sliding window 등이 있다.
혼합제어와의 차이로는 흐름제어는 송수신 측 사이의 패킷 수를 제어하는 기능이고 , 혼잡 제어는 네트워크 내의 패킷 수를 조절하는 기능이라는 것이다.
'network' 카테고리의 다른 글
| [컴퓨터 네트워크 스터디 5주] 쿠키 , 세션 , 토큰 , REST (0) | 2023.12.04 |
|---|---|
| [컴퓨터 네트워크 스터디 4주차] 네트워크 레이어 , IP 프로토콜 (0) | 2023.11.27 |
| [컴퓨터 네트워크 스터디 2주차] HTTPS , DNS , UDP , 신뢰적 데이터 전송 (0) | 2023.11.12 |
| [컴퓨터 네트워크 스터디 1주차] 컴퓨터 네트워크 와 HTTP 프로토콜 (0) | 2023.11.06 |
| 웹 소켓(Socket) 통신이란? (0) | 2023.08.02 |