각 레이어는 상위 레이어에게 서비스를 제공하고 하위 레이어에게 서비스를 제공받는다.
UDP는 아무것도 안해주는 것 같지만, 데이터 에러 체크 (에러가 나면 application 레이어에게 전달하지 않는다), demultiplexing을 해준다.
data가 unreliable하다는 것은 데이터가 잘못됐거나 잃어버린거다.
아주 단순한 프로토콜을 가정하자. 하나 보내고 상대방이 받은거 확인하면 그 다음거를 보낸다.
하위 계층이 완벽하다면 그냥 위에서 데이터를 받아서 아래로 보내면된다.
에러가 났는지 안났는지 확인해야하니 보내는 페킷의 헤더에 checksum을 이용해서 판단한다. 만약 잘 받았으면 ACK라는 메시지를 보내고 에러가 있으면 NAK 메시지를 보낸다. sender는 nak를 받으면 다시 보낸다.
하지만 만약 feedback에 에러가 발생하면 또 문제가 생긴다. 만약 sender가 error된 ack을 받으면 잘 받았는지 모르니 또 보낸다고 생각해보자. 그러면 receiver는 중복된 메시지를 받아서 원래 메시지를 알기 어렵다. 그래서 구분하라고 번호를 붙인다 (sequence).
하지만 sequence는 부가적인 정보이고 header에 들어가는데 작을 수록 좋다. sequence는 최소 몇개가 필요할까? 두 개면 충분하다. 처음 보내는건지 다시 보내는건지만 확인하면된다.
NAK를 없앤 버전이다. 다만 가장 마지막에 제대로 받은 seq #를 보낸다.
packet이 loss된 경우를 대비해서 timer를 이용한다. 일정 시간 이후에고 응답이 오지 않으면 유실됐다고 판단한다. 타이머를 너무 짧게하면 네트워크 오버헤드가 커지고 길게 잡으면 loss가 발생했을 때 반응이 느리다.
왼쪽에서 처음 pck0와 아래 pkt0는 다른 패킷이다. 시퀀스 번호만 같다.
지금 만든 프로토콜은 reliable하지만, 하나 보내고 확인하고 하나 보내고 확인하고 너무 느리다.
실제로는 데이터를 한번에 대량으로 보내고 각 데이터에 대해 피드백을 받는다.