1. TCP와 패킷
- 이메일, 채팅 메시지, 금융 거래 내용 등의 데이터를 전송하는 기본 단위가 패킷이다.
- 하나의 데이터는 여러 개의 패킷으로 쪼개져서 전송된다.
- TCP는 신뢰성을 보장하기 위해, 각 패킷에 번호를 부여하여 누락을 확인하고 순서에 맞게 재조립한다.
- TCP는 신뢰성을 보장하기 위해, 흐름제어/혼잡제어/오류제어 기법을 사용한다.
2 . 흐름 제어
- 송신자와 수신자 사이의 데이터 처리 속도 차이로 인해 수신자 버퍼의 오버플로우가 발생할 수 있다.
- 이것을 방지하는 기법이 흐름제어다.
- 수신자가 감당할 수 있는 속도로 데이터를 보내도록 송신자의 데이터 전송 속도를 제어한다.
1) 정지 - 대기
- 패킷을 전송하고 확인 응답을 받은 후에 다음 패킷을 전송한다.
- 속도가 느리다는 단점이 있다.
2) 슬라이딩 윈도우
- 한 번에 보낼 데이터 개수를 동적으로 제어하는 기법이다.
- 윈도우 : 송신자와 수신자의 버퍼 크기
- 송신자는 수신자가 설정한 윈도우 크기만큼 확인 응답 없이 여러 개의 패킷을 전송할 수 있다.
- 윈도우 크기는 동적으로 조절된다.
- 윈도우 크기가 2이고 송신자가 0, 1, 2, 3, 4를 보내려고 한다. 송신자가 데이터 0, 1을 전송한 후 수신자에게 ACK을 받게 되면 송신자의 윈도우는 정상적으로 전송된 데이터 수만큼 오른쪽으로 이동한다.
- 정지-대기 방식의 느린 속도를 개선했다.
3. 오류 제어
- 오류를 검출하고 재전송하는 기법이다.
- ARQ(Automatic Repeat Request) 기법을 사용해 패킷이 손상되었거나 손실되었을 경우, 재전송을 통해 오류를 복구한다.
1) Stop and Wait ARQ
- 송신자가 패킷 하나를 송신하고, 수신자는 패킷의 에러 유무를 확인한 후 ACK 또는 NAK을 보낸다.
- 수신자가 데이터를 받지 못했을 경우 NAK을 보내고, NAK을 받은 수신자는 데이터를 재전송한다.
- 데이터나 ACK이 분실되었을 경우, 타임 아웃을 기다린 후 데이터를 재전송한다.
2) Go-Back-N ARQ
- 송신자가 NAK을 받으면, NAK 프레임 번호부터 데이터를 재전송한다.
- 수신자는 원하는 패킷 번호가 아닐 경우 데이터를 모두 폐기 처분한다.
- 타임아웃(ACK 분실)의 경우, 마지막 ACK된 데이터부터 재전송한다.
출처: https://velog.io/@jsj3282/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4-%EC%98%A4%EB%A5%98%EC%A0%9C%EC%96%B4
출처: https://velog.io/@jsj3282/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4-%EC%98%A4%EB%A5%98%EC%A0%9C%EC%96%B4
3) SR(Selective-Reject) ARQ
- GBn ARQ의 확인된 마지막 프레임 이후의 모든 프레임을 재전송하는 단점을 보완하는 기법이다.
- SR ARQ는 손상되거나 손실된 프레임만 재전송한다.
- 그러므로 수신자는 별도의 버퍼를 두고 수신한 데이터를 정렬해야 한다.
GBn ARQ |
SR ARQ |
손상/분실된 프레임 이후의 프레임을 모두 재전송 |
손상/분실된 프레임만을 재전송 |
구조가 비교적 간단하고 구현이 단순 |
구조가 복잡(프레임 재배열 등의 추가 로직 필요) |
데이터 폐기 방식을 사용하여 추가적 버퍼가 필요 없음 |
폐기 방식을 사용하지 않으므로 순차적이지 않은 프레임을 재배열하기 위한 버퍼가 필요 |
비용이 비교적 저렴(SR ARQ에 비해) |
비용 및 유지관리 비용이 증가 |
4. 혼잡 제어
- 한 라우터에 데이터가 몰려 모든 데이터를 처리할 수 없는 경우, 호스트들은 재전송을 하게 되고 결국 혼잡을 가중시켜 오버플로우나 데이터 손실이 발생한다.
- 이러한 네트워크의 혼잡을 피하기 위해 송신자가 보내는 데이터의 전송 속도를 제어하는 것이 혼잡 제어다.
1) AIMD(Additive Increase Multicative Decrease)
- 합 증가/곱 감소 알고리즘이다.
- 윈도우 크기를 1로 시작한 후에 ACK 신호를 받을 때마다 윈도우 크기를 1씩 증가시킨다.
- NAK을 받거나 타임 아웃이 발생하면, 윈도우 크기를 절반으로 감소시킨다.
- 네트워크를 공유하는 호스트들이 비슷한 수준의 네트워크 사용률을 보이는 알고리즘이다.
- 그러나 초반 전송 속도를 상승시키는데 오랜 시간이 걸리고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다.
2) Slow Start
- 윈도우 크기를 1로 시작한 후에 패킷 전송에 성공하면 윈도우 크기를 2배로 늘린다.
- 혼잡 현상이 발생하면 윈도우 크기를 1로 줄이고, Threshold를 이전 윈도우 크기의 절반으로 설정한다.
- Threshold까지는 지수적으로 윈도우 크기를 증가시키고, Threshold를 넘어가면 윈도우 크기를 1씩 증가시킨다.
https://velog.io/@jsj3282/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4-%EC%98%A4%EB%A5%98%EC%A0%9C%EC%96%B4
혼잡 회피
- 윈도우의 크기가 임계 값에 도달한 이후에는 데이터의 손실이 발생할 확률이 높다.
- 따라서 이를 회피하기 위해 윈도우 크기를 선형적으로 증가시킨다.
- 수신자가 일정 시간 동안 ACK을 수신하지 못하면 혼잡 상황이라고 인식
빠른 회복 정책
- 혼잡 상태가 되면 윈도우 크기를 1이 아니라 절반으로 줄이고 선형 증가시키는 방법이다.
- 이 정책을 적용하면 혼잡 상황 발생 이후에는 AIMD 방식으로 작동된다.
빠른 재전송
- 수신자가 패킷을 받을 때 먼저 도착해야 할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보낸다.
- 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보낸다.
- 따라서 중간에 패킷 하나가 손실되면 송신자는 순번이 중복된 ACK 패킷을 받게 되고, 손실된 패킷을 빠르게 재전송할 수 있다.
- 빠른 재전송은 중복된 순번의 패킷을 3개(3 ACK) 받으면 재전송한다. 그리고 네트워크에 약간의 혼잡이 발생한 것으로 간주하여 윈도우 크기를 절반으로 줄인다.