오늘은 TCP에 대해서 알아보도록하겠습니다. TCP 패킷에는 어떤 내용이 담겨있고 어떤역할을 담당하는지 , TCP가 어떠한 방법을 통해 신뢰성을 보장하는지 알아보려고 합니다.
TCP는 일반적으로 IP와 함께 사용되는데, IP가 데이터 배달을 처리한다면 TCP는 패킷을 추적하고 관리하는 역할을 한다고 볼 수 있다.
신뢰성있는 데이터 전송을 지원하는 연결 지향형 프로토콜이라고도 볼 수 있죠.
TCP는 흐름제어,혼잡제어,오류제어 이 세가지 방법을 통해 신뢰성을 보장하며
전송순서를 보장하기 때문에 수신여부를 확인할 수 있습니다.
주로 사용되는 곳은 HTTP 통신,이메일,파일전송입니다.
TCP 패킷에 대한 얘기를 하기에 앞서 간단한 질문을 던지며 궁금할 수 있는 부분에 대해 설명해드릴려고 합니다.
Source port
, Destination port
포트 정보를 가지고 있습니다.Sequence number
데이터의 순서번호를 표기함. 3 way handshaking 수행시 초기 순서를 알려주는 역할을 합니다. 통신의 신뢰성을 보장하는 요소로도 쓰입니다.Acknowledgement Number
상대방으로부터 수신한 데이터의 다음으로 수신할 데이터 순서번호를 나타냅니다. Sequence Number
의 확인 응답으로서 데이터 전송자에게 패킷을 잘 받았으니 그 다음 패킷을 송신하라는 의미로도 사용됩니다. 다음에 전송할 패킷의 Sequence Number
이기도 합니다.Data Offset
헤더가 아닌 데이터가 시작되는 위치를 말하는 부분입니다.Flags
세그먼트의 속성을 표현하기 위한 플래그, 수신자측에 전달하는 과정 중에서 발생할 수 있는 상황들에 대한 정의를 내려 어떤 행동을 해야하는지 알려주는 역할을 합니다.Window Size
한번에 전송할 수 있는 데이터의 양을 말합니다. 즉, 송신 시스템에서 자신이 수용하는 한 버퍼의 크기를 byte 단위로 나타낸 것입니다. 이 필드를 이용하여 수신 사이즈를 변경할 수 있습니다.Checksum
데이터를 송신하는 중 발생할 수 있는 오류검출을 위한 값입니다.데이터가 전송 중에 손실되지 않고 원본과 동일한지 검사할때 사용되는 값입니다. 네트워크 통신에서의 데이터 무결성 검사 | EOS수신측이 송신측보다 데이터처리 속도가 느릴경우 문제가 발생합니다.
송신측의 전송량이 수신측의 처리량을 넘을 경우 전송된 패킷은 수신측의 큐를 넘어서 손실될 가능성이 있기 때문에 송신측의 패킷 전송량을 제어해야합니다.
이러한 처리속도차이를 해결하기 위한 기법이 바로 흐름제어 입니다.
흐름제어에는 두가지 방법이 있습니다.
정지 - 대기 (Stop and Wait)
데이터를 1개 보내고 ACK(받았다는 확인)이 오면 그 다음 데이터를 보내는 방식입니다. 이 방식의 경우 패킷에 대한 확인 응답을 받아야만 하기 때문에 속도가 느리고 비효율적입니다.
슬라이딩 윈도우 (Sliding Window)
수신측이 한번에 처리할 수 없는 양의 데이터를 송신측이 전송하게 되면 드랍패킷이 발생합니다. 이 때 전송하는 패킷의 양을 슬라이딩 윈도우를 통해 조절합니다.
먼저 윈도우에 포함되는 모든 패킷들을 전송하고, 그 패킷들의 전달이 확인되는대로 윈도우를 옆으로 옮김으로써 그 다음 패킷들을 전송하는 방식으로 작동합니다.
데이터가 몰려 혼잡할 경우 처리하지 못한 데이터가 발생할 수 있습니다.
그럴경우 다시 데이터를 처리해달라고 요청이 오면, 오버플로우 혹은 데이터 손실이 발생하게 됩니다.
이런 경우 송신측에서 보내는 데이터의 전송속도를 강제로 줄이는 것을 혼잡제어
라고 합니다.
혼잡제어의 경우 전송속도를 다루는 흐름제어와 달리, 호스트와 라우터를 포함하여 보다 넓은 관점에서 전송문제를 다룹니다.
혼잡제어의 방법에는 세가지가 있습니다.
합 증가 / 곱 감소
처음에 패킷을 하나씩 보내고 패킷이 문제 없이 도착하면 윈도우를 1씩 증가시켜 전송하는 방법. 단, 일정시간을 넘기거나 패킷전송에 실패하면 윈도우 사이즈를 절반으로 감소시킨다.
해당 방법의 경우 초기 네트워크의 높은 대역폭을 사용하지 못하고, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이라는 단점이 있다.
Slow Start
합 증가 / 곱 감소 방식과 비슷하게 패킷을 하나씩 보내는 방식입니다.
하나의 주기가 끝나면 윈도우의 크기가 2배가 되지만, 혼잡현상이 발생하면 윈도우 크기를 1로 줄여버립니다.
초기 네트워크 수용량을 예상할 수 없다는 문제가 있지만 혼잡현상을 경험하고 나면 네트워크 수용량을 예상할 수 있습니다.
빠른 재전송, 빠른 회복
빠른 재전송
정상적인 재전송 큐 과정을 따르지 않고, 중간 누락된 세그먼트를 빠르게 재전송하는 방식이다.
빠른 회복
혼잡 상태가 되면 윈도우 크기를 반으로 줄이고 선형으로 증가시키는 방법입니다. 해당 기법을 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 합 증가/곱 감소 방식으로 동작하게 된다.
오류제어는 호스트 간의 데이터 전송이 일어날 때 오류검출과 재전송의 역할을 담당하고 있습니다.
Automatic Repeat Request(ARQ) 기법을 사용하여 프레임이 손상되거나 손실되었을 경우, 재전송을 통해 오류를 복구합니다.
ARQ 기법의 경우 흐름제어기법과 관련되어 있는데요, 다음의 오류제어기법을 보면서 이게 무슨얘기인지 알아봅시다.
ACK : 다음 프레임을 전송
NACK : 손상된 프레임 자체 번호를 반환
Stop and Wait ARQ
ACK를 받고나서 다음 데이터를 보내는 방식입니다. 일정시간이 지나 타임아웃이 발생하면 이전 데이터를 재전송합니다.
흐름제어의 Stop and Wait와 유사하지만 수신측에서 수신된 프레임의 에러 유무 판단에 따라 Ack or Nak 를 보낸다는 것이 다릅니다.
Go Back n ARQ (슬라이딩 윈도우)
오류가 발생한 데이터만 재전송하는 방식입니다.
마지막으로 확인된 프레임 이후로 모든 프레임을 재전송합니다. 에러가 발생한 부분 이후의 데이터를 모두 삭제한 뒤 재전송합니다.
예시)
NAK 프레임을 받았을 경우 : 0~5 까지의 데이터를 보내었을 경우 수신측에서 데이터를 받았다는 ACK를 중간중간 리턴하는 상황입니다. 여기에서 만약 2번 프레임이 잘못되었다는 것을 발견하고 NAK 2를 전송측에 보내면 전송측은 2번 프레임 이후의 데이터를 모두 전송합니다
전송 데이터 프레임의 분실 : 수신측에서 데이터 1을 받은 뒤 데이터 3을 받게되면, 데이터 2를 못받았기 때문에 데이터 3을 폐기하고 NAK 2를 전송측에 보냅니다. 이렇게 되면 2번 데이터 이후의 데이터를 모두 폐기하고 2번 데이터 부터 다시보냅니다.
지정된 타임아웃 내의 ACK 프레임 분실 : 전송 스테이션은 분실된 ACK를 다루기 위해 타이머를 가지고 있습니다. 전송측에서는 이 타이머의 타임아웃동안 ACK를 받지 못했을 경우, 마지막 ACK부터 재전송합니다.
Selective - Reject(SR) ARQ
앞의 방법들과 달리 재전송되는 프레임 이후의 모든 프레임을 재전송하는 단점을 개선한 방법이다. 손상되거나 분실된 프레임만 재전송합니다.
그렇기 때문에 별도의 데이터 정렬을 수행해야하며, 별도의 버퍼를 필요로합니다.
[Network] TCP 신뢰성의 특징: 흐름제어 / 혼잡제어
TCP/IP (흐름제어/혼잡제어) | 👨🏻💻 Tech Interview
Ready-For-Tech-Interview/TCP.md at master · WooVictory/Ready-For-Tech-Interview