[네트워크] TCP 에서 신뢰성을 보장하는 방법

Narcoker·2023년 6월 8일
0

네트워크

목록 보기
11/12

TCP 란

TCP(Transmission Control Protocol)는 인터넷에서 데이터를 전송하는 주요 프로토콜 중 하나

IP와 함께 TCP/IP라고 불린다.

특징 중 하나로 신뢰성을 보장한다.

[네트워크] TCP 와 UDP

신뢰성을 보장하는 방법

순서보장

데이터 패킷에 순서 번호(Sequence Numnber)를 부여하여
수신자가 패킷을 올바른 순서대로 재조립 할 수 있도록한다.

만약 순서대로 도착하지 않는다면 누락된 패킷이 도착할 때 까지 대기하고
그 후에 패킷을 순서대로 재조립하여 애플리케이션에 전달한다.

오류 검출 및 재전송

체크섬(Checksum) 을 이용하여 데이터의 오류를 검출한다.
체크섬은 송신자에서 계산되어 패킷 헤더에 포함되어 전송되며
수신자는 체크섬을 다시 계산하여 원래의 체크섬과 비교한다.

만약 두 체크섬이 일치하지 않으면 손상 되었음을 의미하고
수신자는 송신자에게 해당 패킷을 다시 요청한다.

저 방법 뿐만이 아니라 체크섬 검증 방식에는 여러가지가 있다.
[네트워크] checksum 생성 및 검증

Stop and Wait ARQ(Automatic Repeat reQuest)

송신측에서 1개의 프레임을 송신하고,
수신측에서 수신된 프레임의 에러 유무 판단에 따라
ACK or NAK(Negative Acknowledgement)를 보내는 방식.

식별을 위해 데이터 프레임과 ACK 프레임은 각각 0,1 을 번갈아가면 부여한다.

수신측이 데이터를 받지 못했을 경우 NAK 을 보내고
NAK을 보낸 송신측은 데이터를 재전송한다.

만약 데이터나, ACK이 분실됐을 경우, 타임아웃이 발생하게 되는데
이때 송신측은 데이터를 재전송한다.

Go-Back-n ARQ(슬라이딩 윈도우)

전송된 프레임이 손상되거나 분실된 경우 또는 ACK 이 손실되어 TIME_OUT이 발생한 경우
확인된 마지막 프레임 이후로 모든 프레임을 재전송한다.

슬라이딩 윈도우는 연속적인 프레임 전송기법으로
전송 측은 전송된 프레임의 복사본을 가지고 있어야하며,
ACK과 NAK 모두 각각 구별해야한다.

  • ACK : 다음 프레임을 전송하라는 의미
  • NAK : 손상된 프레임 자체 번호를 가지고 있다.
NAK 프레임을 받았을 경우

수신측으로 0~5의 데이터를 보냈고 송신 도중 ACK 을 받는다.
ACK 을 받은 송신 측은 윈도우를 이동해가며 전송을 지속한다.

만약 2에서 이상을 감지하고 NAK2를 송신측으로 보내면
2 부터 다시 재전송한다.

전송 데이터의 분실

수신측에서 데이터 1을 받고 다음에 데이터 3을 받은 경우 ,

데이터 2를 받지 못했으므로
수신측에서는 데이터 3 예상한 데이터가 아닌 것 을 폐기하고
데이터 2를 받지 못했다는 NAK2를 보낸다.

송신측은 데이터 2번부터 다시 재전송 한다.

지정된 타임 아웃 내의 ACK 분실(LOST ACK)

전송 측은 분실된 ACK을 다루기 위해 타이머를 가지고 있다.

전송 측에서는 이 타이머 동안 수신 측으로 ACK 데이터를 받지 못했을 경우
마지막 ACK된 데이터부터 재전송한다.

SR(Selective-Reject) ARQ

Go-Back-N ARQ 의 단점을 보완한 방식이다.

손상되거나 손실된 프레임만 재전송한다.
따라서 데이터 재정렬을 수행해야하며 별도의 버퍼를 필요로 하다.
수신 측에서는 이 버퍼로 데이터를 정렬을 한다.

흐름제어

TCP는 데이터를 보내는 속도를 제어하여 수신자의 버퍼가 넘치지 않도록 한다.

이를 위해 수신자는 수신 가능한 양을 송신자에게 알리며
송신자는 이 정보를 바탕으로 데이터를 보내는 속도를 조절한다.

Stop-and-Wait

매번 전송한 패킷에 대한 확인 응밥을 받아야만 그 다음 패킷을 전송하는 기법

Sliding Window (Go-Back-n ARQ)

  • window size : 7

수신 측에서 설정한 윈도우 크기만큼 송신측에서 패킷 각각에 대한 확인 응답없이 세그먼트를 전송하고
데이터의 흐름을 동적으로 조절하는 기법

최초 윈도우의 크기는 3 way handshaking 과정을 통해 설정된다.
이정보는 TCP header 에 저장되고 관리된다.

윈도우에 포함된 만큼은 수신 측의 응답 없이도 보낼 수 있지만, 그 이상은 보낼 수 없다.
그 이상의 데이터 패킷을 보내기 위해서는 수신의 응답이 확인이 되어
window 의 크기가 갱신되어야한다.

혼잡제어

네트워크의 혼잡 상태를 관리하여 패킷의 손실을 최소화한다.

패킷이 손실되면 네트워크가 혼잡하다고 가정하고 데이터를 보내는 속도를 줄인다.
이후 네트워크 상태가 개선되면 다시 속도를 늘리는 매커니즘을 사용한다.

AIMD (Addtive Increase Multicative Decrease)

합 증가 / 곱 감소 알고리즘

합 증가

처음에 패킷 하나를 보내는 것으로 시작하여 전송한 패킷이 문제 없이 도착한다면
window size 를 1씩 증가시킨다.

곱 감소

만약 패킷 전송에 실패하거나 TIME_OUT이 발생하면
window size 를 절반으로 감소시킨다.

여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만
시간이 흐르면 평형 상태로 수렴하게 되는 특징이 있다.

단점

  • 초기 네트워크의 높은 대역폭을 사용하지 못한다.
  • 네트워크가 혼잡해지는 상황을 미리 감지하지 못하여 혼잡해지고 나서야 대역폭을 줄이는 문제점이 있다.
  • 초기에 전송 속도를 올리는데 시간이 오래걸린다.

Slow Start

AIMD는 초기에 전송 속도를 올리는데 시간이 오래 걸린다는 단점이 있다.

Slow StartAIMD와 마찬가지로 패킷을 하나씩 보내는 것부터 시작한다.
송신은 ACK 을 받을 때마다 window size1씩 증가시킨다.

즉, 한 window를 다보내면 window size2배가 된다.
= RTT(Round Trip Time) 마다 window size는 2배가 된다.

이때 RTT 당 window size 그래프지수함수 그래프 모양이 된다.

window size임계값에 도달하면 Congestion Avoidance 방식으로 전환된다.

Congetsion Avoidance (혼잡 회피)

Slow Start 이후 window size가 임계 값에 도달하면 발생한다.

이 때부터 RTT 당 window size는 1 씩 증가한다.

만약 패킷 손실이 감지되면 임계값을 현재 window size의 절반으로 감소시키고
window size1로 재설정한다.

이후 Slow Start 부터 재시작한다.

Fast Recovery (빠른 회복)

혼잡 상태(패킷 손실)가 발생하면 Congetsion Avoidance 때 처럼
window size 를 1 로 재설정하는 것이 아닌
window size 의 절반으로 줄이고 AIMD 방식으로 동작시킨다.

Fast Retransmit (빠른 재전송)

먼저 도착해야할 패킷(2)이 도착하지 않고 다음 패킷(3)이 먼저 도착한 경우에도 ACK 을 보낸다.
단, 이 ACK원래 도착해야할 패킷 번호(2)를 담아서 보낸다.

따라서 이후 4,5,.. 가 도착하더라도 송신측으로 보내는 패킷에는 2 가 연속적으로 가게된다.

수신 측은 중복된 패킷번호 3개를 연속적 으로 받으면 그 패킷을 재전송한다.

이러한 상황을 혼잡 상태로 인지하고 window size를 절반으로 줄인다.

profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글