💡 해당 포스트는 kocw 이석복 교수님의 컴퓨터 네트워크 강의를 듣고 작성하였습니다.
개요: tcp는 reliable 데이터를 제공하기 위해서, (unreliable 환경(underlying channel)에서 발생하는) message error
와 message loss
를 처리한다.
이 때 어떤 메카니즘을 사용하는가.
let's build rdt protocol.
하나 보내고 100%로 받았는 지 확인하는 식으로 진행해본다.
ACK/NAK 등 피드백에서 에러가 발생한다면, 재전송을 한다.
중복패킷 관리 : handling duplicate packets
패킷에 0과 1 번호를 붙여 중복 여부를 구분한다.
sender add seq number to each packet
피드백 에러가 발생하면 재전송한다.
sender retransmits current packet
receiver가 트랙킹해서 중복이 발생하면 버린다
receiver discards duplicate packet
패킷 번호 부여
seq# added to pkt
피드백 에러 확인
must check if received ack/nak corrupted
피드백 에러가 발생했거나 피드백이 nak일 때 재전송
retransmit on nak or corrupted feedback
receiver는 seq#와 ack만 사용하는 방식.
예를 들어 패킷(1) 받을 때 에러나면, receiver는 naks 대신에 ack(0)을 보낸다.
sender가 에러를 인지하고 다시 패킷(1)을 재전송한다.
유실이 발생하면,
recevier가 피드백을 보낼 수 없고 sender가 상황을 인지할 수 없게 된다.
timer
sender는 패킷을 보내고 일정시간이 지나면 패킷을 재전송한다.
이 때 시간은 적당히 맞춘다.(sender waits 'reasonable' amoount of time for ack)
실제 data transfer protocol은 훨씬 복잡하다.
현재 조건으로는, 하나의 한 패킷 밖에 못 보내고 피드백이 올동안 네트워크를 활용하지 않는다.
피드백을 기다리지 않고 패킷 쏟아 붓는다(pipelined protocols). 이 때, 어떻게 시퀀스넘버 및 유실 관리하고 reliable한 전송을 할 수 있는 지 배울 것이다.