Chapter 3-4 principles of reliable data transfer
신뢰적인 데이터 전송의 원리
완벽하게 신뢰적인 채널상에서의 신뢰적인 데이터 전송 : rdt 1.0
- 하위 채널이 완전히 신뢰적인 가장 간단한 경우
no bit errors(물건의 부분적 파손이 없다)
no loss of packets(내가 보낸 물건 자체가 분실되는 경우가 없다)
- 오류가 생길 수 없으므로 수신 측이 송신 측에게 어떤 피드백도 제공할 필요가 없다
- 신뢰성이 있으니까 추가적으로 제공해야되는 기능이 없다. 보내기만 하면 된다
비트 오류가 있는 채널상에서의 신뢰적 데이터 전송 : rdt 2.0
- 패킷 안의 비트들이 하위 채널에서 손상되는 모델
- 패킷이 전송 또는 전파되거나 버퍼링될 때 네트워크의 물리적 구성요소에서 일반적으로 발생
비트 오류를 처리하기 위해 세 가지 부가 프로토콜 기능
1. 오류 검출
-체크섬 용 : 비트 오류가 발생했을 때 수신자가 검출할 수 있는 기능
그럼 에러는 검출했는데 어떻게 해결하지?
2. 수신자 피드백
- 송신자가 수신자의 상태(패킷이 정확하게 수신되었는지 아닌지)를 알기 위한 유일한 방법은 수신자가 송신자에게 피드백을 제공하는 것
-긍정 확인응답(acknowledgements ACKs) :에러 없는거 받으면 이거 전송
-부정 확인응답(negative acknowledgements NAKs)
3. 재전송
-수신자가 송신자에게 보낸다 NAK을!!!! => 체크했을때 error가 있었으니까 알려주기 위해서(sender야 너가 보낸 패킷에 에러가 있어), 그럼 sender가 NAK을 받았다면 재전송 해주면됨!!!! 너가 제대로 패킷을 받을때까지 다 보내면 됨, 언젠간 에러 없이 전송될거니까
파이프라이닝 : 확인응답을 기다리지 않고 여러 패킷을 전송하도록 허용, 확인응답들을 기다리기 전에 패킷 전송, 많은 전송 중인 패킷을 파이프라인에 채워넣음
두가지 파이프라인 프로토콜이 있음
1. GBN(Go-Back-N, N부터 반복)
송신자는 확인응답을 기다리지 않고 여러 패킷을 전송(가능할 때) 할 수 있다.
그러나 파이프라인에서 확인응답이 안 된 패킷의 최대 허용수 N보다 크지 말아야 한다.
= N개까지만 ACK없이(확인응답없이) 보낼 수 있다
ACK(n) : 모든패킷, 이 ack안에 들어가잇는 seq #n을 포함하는 n까지 모든 패킷에 대해서 ack이 왔다
=> cumulative ACK
원래는 0 -> 0
1 -> 1 이렇게 ACK이 와야함
1 2 3 4 -> 4
ACK이 4만옴
=> 1,2,3,4까지 ACK을 받았다
ACK을 하나만 보내고 해당하는 번호 포함 그 밑애 애들은 ACK을 이미 받았다
=> 그럼 중복을 어떻게 확인?
1 2 3 4 -> 4 받고 그다음에 또 4가옴 => 중복
1 2 3 4 -> 4
그다음 5를 받아야하는데 6이옴 -> 그럼 4까지만 받았으니까 4에 대한 ACK또 보냄
7이 와도 -> 여전히 5를 못받았으니 4에 대한 ACK또 보냄
모든 각 패킷마다 파이머를 두지 않는다.
윈도우 내에서 가장 오래된 패킷(send_base)에 대해서만 타이머 세팅함
이 타이머가 만료되서 타임아웃 발생? -> timeout(n)
n번째가진 패킷에 대해서 재전송(노랭)하고, n포함 안에서 윈도우 내에서 큰 시퀀스 넘버
Selective repeat
고백엔 - 재전송할때 ㅂㅔ이스부터 전부 다시보냄
얘는 잃어버린것만 재전송함
리시버가 받은건 개별적으로 ack보내야함
5번와야하는데 7번이 온다
고백엔은 순서 안맞으니 무시하지만
얘는 7번 저장함 왜? 개별적으로 보내니까 순서가 안맞아도 저장함 순서가 맞는 부분까지 되면 한꺼번에 애플리케이션에 올려준다
ack을 받지 못한거만 재전송
sendet는 내가 보내는 패킷마다 타이머 유지
타임아웃이 나면 그 패킷만 재전송함
센더에서 데이터를 보내라고 요청오면
넥스트시퀀스 넘버 이용해서 패킷만들고 전송하고 타이머