-
[Network]신뢰적인 데이터 전송과 TCP(1)CS/Network 2022. 7. 28. 17:59
UDP와 TCP의 가장 큰 차이는 TCP가 신뢰적인 데이터 전송을 기반으로 하는 프로토콜이라는 것이다. 이번 글에서는 신뢰적인 데이터 전송이란 무엇인 지 알아본 뒤 다음 글에서 본격적으로 TCP에 대하여 다뤄보자.
1. 신뢰적인 데이터 전송
신뢰적인 채널에서는 데이터가 손상되거나 손실되지 않는다. 신뢰적인 채널에서 발생하는 일들을 차례대로 살펴보자. 일종의 프로토타입을 살펴보는 것이다.
1.1 완벽하게 신뢰적인 채널에서 데이터 전송, rdt1.0
만약 하위 채널이 완전히 신뢰적인 상황이라면 수신 측에서는 송신측으로 어떠한 피드백도 보낼 필요가 없다.
1.2 손실은 없으나 손상이 있는 채널에서 데이터 전송, rdt2.0
우리가 전화 통화를 하는 경우를 생각해보자. 상대가 말할 때, 어. 응. 음. 등의 피드백을 준다. 잘 안들린다면 뭐?라고 피드백을 준다.
컴퓨터 네트워크에서 비트 오류를 처리하기 위해서는 다음과 같은 기능들이 필요하다.
- 오류 검출 : 비트 오류가 발생했을 때 체크섬 필드를 통해 오류를 검출할 수 있어야 한다.
- 수신자 피드백 : 컴퓨터 네트워크 상황에서 송신자와 수신자는 매우 먼 거리에 위치한다. 송신자가 수신자의 상태를 알기 위한 방법은 수신자의 피드백이 유일하다. 전화 통화 상황과 마찬가지로 수신자의 긍정 확인응답(ACK)와 부정 확인응답(NAK) 피드백이 필요하다. 네트워크 상황에서는 이러한 정보를 한 비트 길이의 패킷으로 전달할 것이다. (0:NAK, 1:ACK)
- 재전송 : 오류를 검출했다면 송신자는 재전송해야 한다.
이러한 프로토콜에서 송신자는 패킷을 전송하고 수신자의 피드백을 확인하기 전까지 새로운 데이터를 전송하지 않을 것이다. 이를 전송-후-대기 프로토콜이라고 부른다.
이제 다시 전화 통화 상황으로 돌아가보자. 만약 수신자 B가 “어”, ”응”, “다시 말해주세요” 와 같은 피드백을 보냈지만 이러한 피드백이 안들리는 경우도 있을 것이다. 이러한 경우에 송신자 A가 “다시 말해주세요” 라는 피드백을 보내고 이것 또한 손상된다면 다시 수신자 B가 “다시 말해주세요". 이것 또한 손상된다면.. 그만 생각하자.
송신자가 왜곡된 확인 응답 패킷을 받았을 때, 단순히 재전송하는 방법이 가장 간단하다. 이 경우에 수신자가 중복된 패킷을 수신하고 있는지 새로운 패킷을 수신하고 있는지 알 수 있는 방법만 존재하면 된다.
- 순서 번호 : 데이터 패킷에 송신자가 순서 번호를 포함시킨다. 수신자는 이를 통해 재전송 여부를 확인한다. 순서 번호를 사용하게 되면 NAK를 사용할 필요도 없어진다. 가장 최근에 정확하게 수신된 패킷에 대하여 ACK를 송신함으로써 NAK를 대체할 수 있다.
전송-후-대기 방식에서는 순서 번호 0과 함께 패킷 전송 → ACK와 순서 번호 0 → 순서 번호 1과 함께 패킷 전송 → ACK와 순서 번호 1 → 순서 번호 0과 함께 패킷 전송…
위와 같은 과정으로 순서 번호를 위해 1비트만 할당하면 된다. (재전송일 때는 중복된 순서 번호를 새로운 전송이면 0과 1을 번갈아가며 사용하면 된다.)
1.3 손실과 비트오류가 있는 채널에서 데이터 전송, rdt3.0
만약 송신자의 메시지 혹은 수신자의 피드백이 손실되었다면, 이를 어떻게 알 수 있을까? 기다려도 답이 오지 않을 것이다.
단순하게 생각해서 우리는 일정 시간동안 응답이 없다면(타임아웃) 재전송을 통해 손실에 대응하면 된다.
송신자의 입장에서는 재전송은 만병통치약이다. 데이터 패킷이 손실되었는지, ACK가 손실되었는지, 지연되었는지 알지 못한다. 다만 똑같이 재전송으로 대응할 뿐이다. 이것이 가능한 이유는 수신자 입장에서 패킷이 중복 되었을 경우 순서번호로 판단할 수 있기 때문이다.
2. 파이프라인된 신뢰적 데이터 전송
이전까지 살펴본 rdt3.0은 신뢰적 데이터 전송이라는 기능을 정확하게 구현한다. 하지만 성능 문제가 남았다. 전송-후-대기 방식에서는 패킷을 한 번 전송 후 다음 패킷을 보내기 위해서는 최소 1RTT+패킷전송 시간이 흘러야 한다.
파이프라이닝을 통해 확인응답을 기다리지 않고 여러 패킷을 전송한다면 좋은 성능을 얻을 수 있다. 좋은 성능을 가진 파이프라이닝에서는 새로운 문제가 발생한다.
- 더 이상 순서번호 0과 1을 번갈아 사용할 수 없다. 각각의 전송 중인 패킷의 유일한 순서번호가 필요하다.
- N부터 반복, 선택적 반복 등을 통해 새로운 오류 회복 방법을 사용해야 한다.
2.1 윈도우 사이즈
TCP 연결에 성공하면 각 소켓에는 전송 버퍼와 수신 버퍼가 생긴다. 전송 버퍼에는 애플리케이션 계층에서 전송을 호출할 때 내려온 패킷이 대기하고 있다. 이 때 버퍼의 모든 데이터를 한 번에 보낼 수 있는 것이 아니기 때문에 패킷 전송 후에 확인 응답을 기다리고 있는 순서 번호의 범위가 정해져있다. 이를 윈도우 사이즈 라고 부른다.
아래 사이트에서 2가지 프로토콜의 애니메이션을 확인할 수 있다.
https://www2.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/
3. N부터 반복, Go-Back-N
N부터 반복 프로토콜에서 송신자의 동작을 살펴보자.
- 상위 계층의 호출 : 상위 계층의 send()가 호출되면, 윈도우가 가득 찼는지 확인한다. 만약 윈도우가 가득 차 있지 않다면 패킷이 생성되고 버퍼에 저장된다. 윈도우가 가득 차 있다면 상위 계층에게 데이터를 반환한다.
- ACK의 수신 : 패킷을 수신자에게 보낸 후 송신자는 누적 확인응답을 받게 된다.
- 타임아웃 : 만약 타임아웃이 발생한다면 송신자는 이전에 전송되었지만 아직 확인응답을 받지 않은 모든 패킷을 재전송한다.
수신자의 동작 또한 단순하다. 중요한 것은 신뢰적인 네트워크에서 수신자는 상위 계층에게 패킷을 순서대로 전달해야 한다.
- 순서번호 n을 가진 패킷까지 오류 없이 도착하면 n에 대한 ACK를 송신한다.
- 만약 순서대로 패킷 n이 도착해야 하지만 그 다음 패킷인 n+1이 도착한다면, 패킷 n을 버린다.
- 순서가 잘못된 패킷들은 모두 버린다.
- 송신자는 n-1에 대한 ACK만 수신했으므로 타임아웃 이벤트에서 패킷 n부터 모두 재전송 할 것이다.
4. 선택적 반복, Selective Repeat
누적 확인응답이 아닌 개별적인 확인응답을 통해 재전송이 필요하다. 이를 위해서는 각 패킷이 각자의 타이머를 가져야 할 것이다. 송신자는 N부터 반복 프로토콜에서와 마찬가지로 패킷을 전송하고 ACK를 수신한다.
수신측이 패킷을 받았더라도 송신측 윈도우의 맨 앞에 있는 패킷에 대한 응답을 받아야만 송신측 윈도우를 이동시킨다.
다음 글에서는 TCP에서의 신뢰적인 데이터 전송이 어떻게 적용되는 지 알아보겠습니다.
'CS > Network' 카테고리의 다른 글
[Network]TCP 계층 혼잡제어 완벽 정리 (0) 2022.07.29 [Network]TCP 연결 관리 - 3/4way handshake (0) 2022.07.29 [Network]다중화와 역다중화란 무엇인가? (0) 2022.07.26 [Network]애플리케이션 계층과 HTTP (0) 2022.07.26 [Network]패킷 교환과 회선 교환이란? (0) 2022.07.25