목차
- TCP란?
- 오류제어와 방법
- 체크섬
- ARQ : Automatic Repeat reQuest
- 흐름제어와 방법
- Stop And Wait
- Sliding Window
- 혼잡제어와 방법
- AIMD : Additive Increase / Multiplicative Decrease
- Slow Start
- 데이터링크 계층에서의 오류 제어, 흐름제어와 차이
1. TCP란?
TCP 프로토콜은 OSI 7계층 중 전송 계층에서 사용되는 프로토콜로, 컴퓨터 간의 데이터를 전송할 때 TCP 연결을 이뤄 데이터에 대한 신뢰성을 보장한다. 3-way handshake 과정을 통해 연결된 두 엔드포인트 사이의 오류제어, 흐름제어, 혼잡제어 기능을 제공한다.
** 전송 계층에서의 데이터 전송 단위(PDU)는 세그먼트이다.
2. 오류제어
네트워크를 통해 패킷이 전달되는 동안, 패킷이 변형되거나 유실되는 일이 발생할 수 있다. 따라서 데이터를 송수신하는 양 끝단의 엔드포인트에서 패킷에 대한 오류를 확인해 복구하는 과정이 필요하다.
오류제어는 오류를 확인하는 메커니즘과 오류를 복구하는 메커니즘으로 나눌 수 있다. 수신 측에서는 체크섬을 이용해 오류를 확인하고 송신 측에서는 확인응답을 통해 패킷을 재전송하는 방법으로 동작한다.
2-1. 오류 제어 방법
1) 체크섬
: 체크섬은 송신 측에서 패킷의 오류를 확인하는 방법이다. TCP 헤더에는 16비트의 체크섬 필드가 존재하는데, 송신 측은 체크섬 필드에 계산한 체크섬을 포함시키고, 수신 측은 동일한 체크섬 알고리즘을 이용해 패킷의 무결성을 확인한다.
2) ARQ
: ARQ는 Automatic Repeat reQuest의 약자로, 수신 측에서 패킷을 재전송함으로써 데이터에 대한 복구가 이뤄지도록 한다. Stop And Wait ARQ, Go Back N ARQ, Selective Repeat ARQ 등의 방식으로 패킷 오류를 확인했거나 일정 기간 동안 확인 응답이 오지 않아 패킷 유실을 확인했을 때 패킷을 재전송한다.
3. 흐름제어
흐름제어는 수신 측과 송신 측에 패킷 처리에 대한 속도 차이를 해결하기 위한 기능이다. 수신 측에서 패킷을 처리하는 속도가 더 빠를 경우에는 상관없지만, 수신측보다 송신 측에서 패킷을 보내는 속도가 더 빠를 경우에는 문제가 된다.
수신 측에서 전달받은 패킷을 버퍼에 담아두어 처리하는데, 이 버퍼가 모두 차게 되면 유실되는 패킷이 생길 것이고 재전송 과정을 통해 송신 측의 불필요한 리소스 낭비로 이어진다. 따라서 수신 측의 패킷 처리 속도에 따라 송신 측에서 전송되는 패킷의 양을 조절함으로써 이를 해결할 수 있다.
4. 흐름제어 방법
1) Stop And Wait
: Stop And Wait 방식은 매번 전송한 패킷에 대한 응답을 받은 후에 다음 패킷을 보내는 방식이다. 응답에 데이터를 재전송해 달라는 플래그를 포함하면 흐름 제어뿐만 아니라, 오류 제어 기능으로도 동작한다.
2) Sliding Window
: 우선 윈도우(Window)는 송수신 측에 존재하는 패킷을 담아두는 버퍼이다. TCP 헤더에는 Window Size라는 필드가 존재해 수신 측에 남은 버퍼 사이즈에 따라 송신 측에서 보내는 패킷의 개수를 줄이거나 늘려달라고 요구할 수 있다.
Sliding Window는 윈도우를 이용하여 Stop And Wait 방식을 개선한 방식이다. 하나의 패킷에 대한 응답 패킷을 받아야 했던 Stop And Wait 방식은 응답 대기에 대한 오버헤드를 가지고 있다. 하지만 응답을 기다리는 패킷의 수를 수신 측의 윈도우 사이즈로 조절하게 된다면, 송신 측은 수신 측의 처리 속도에 맞춰 패킷을 전송할 수 있게 된다.
5. 혼잡제어
흐름 제어는 엔드포인트(서버와 클라이언트)에서 송수신되는 패킷의 수를 제어했다면, 혼잡 제어는 네트워크 중간에 라우터 등 통신 장비가 처리할 수 있는 패킷의 수를 조절하는 기능이다.
네트워크 상에서 트래픽이 몰려 송신 측에서 일정 시간 내에 응답 패킷을 받지 못했다면 패킷을 재전송한다. 이는 결국 네트워크 혼잡만 가중시키고, 송신 측 컴퓨터 리소스가 낭비된다. 따라서 네트워크 상에서 패킷을 처리하는 속도에 따라 송신되는 패킷의 수를 조절하는 것이다.
혼잡제어는 흐름제어보다 더 넓은 범위를 고려해 송신되는 패킷의 수를 조절하며, 라우터, 스위치 등 네트워크 상에서 이용하고 있는 다양한 장비들을 고려해 네트워크 트래픽을 제어할 수 있다.
6. 혼잡제어 방법
1) AIMD, Additive Increase / Multiplicative Decrease
: 우리말로 직역하면, 합 증가 / 곱 감소이다. 처음에 패킷을 하나씩 보내고, 패킷이 문제없이 도착하면 윈도우 사이즈를 1씩 증가시킨다. 만약 전송에 실패하거나 일정 시간 내 응답이 도착하지 못한다면, 윈도우 사이즈를 절반으로 줄인다. 네트워크에 진입하는 초반은 불리하지만 결과적으로 평형 상태로 수렴하게 된다.
(단점)
- 초기에는 높은 대역폭을 사용하지 못하며, 전송 속도를 올리는 데에 오랜 시간이 걸린다.
- 네트워크가 혼잡해진 후에 윈도우 사이즈를 줄여, 네트워크 혼잡을 미리 탐지하지 못한다.
2) Slow Start
: 예전에 비해서 대역폭이 넓어지고 네트워크가 혼잡해지는 상황이 줄어들어 AIMD의 단점이 부각되어 나오게 된 방식이다. AIMD와 같이 패킷을 하나씩 보내는 것은 동일하나, 패킷이 문제없이 도착했다는 ACK 패킷을 받을 때마다 윈도우 사이즈를 2배씩(지수적으로) 증가시킨다. 혼잡이 증가하면 윈도우 사이즈를 1로 줄인다.
다양한 혼잡 제어 정책이 존재한다. 정책에 따라 혼잡을 어떻게 대처할 것인가에 대한 내용은 다르지만, AIMD와 Slow Start를 섞어서 사용하고 있다.
7. 데이터링크 계층과 전송 계층에서의 오류제어, 흐름제어 차이
데이터링크 계층은 네트워크 상에 존재하는 "모든 노드들 간"의 오류제어와 흐름제어를 제공한다. 이에 반해 전송 계층은 클라이언트와 서버로 칭할 수 있는 "엔드포인트 간"의 오류제어, 흐름제어, 혼잡제어를 제공한다.
아래 사진을 보면 각 노드들 간의 연결에서 신뢰성은 데이터링크 계층이 담당하고 있는 것을 볼 수 있다. 데이터링크 계층에서 검증된 데이터의 신뢰를 기반으로 각 엔드포인트에 도착했을 때 전송계층에서 제공하고 있는 오류제어, 흐름제어, 혼잡제어 기능이 동작하는 것이다.
댓글