TCP의 기능
Reliable Data Transfer

- Transport layer는 하위 계층을 통해 통신
- 하위 계층은 reliable 하지 x
Unreliable Channel
- packet error
- packet loss
- transport layer에서 packet loss, packet error을 체크해주어야 함
Reliable Data Transfer (RDT) protocol
- transport layer에서 reliable한 통신이 이루어지도록 하는 protocol
- 하나 보내고 확인, 하나 보내고 확인
RDT 1.0
- 매우 간단한 상황부터 가정
- if) underlying network 채널에서 error, loss가 발생하지 않음
- 그냥 보내면 됨
- 매우 비현실적인 상황
RDT 2.0
- if) underlying channel에서 error가 발생, loss는 발생 x
- sender가 packet을 보냄
- 받으면 receiver가 feedback을 보냄 (ACK, NAK)
- 만약 receiver가 NAK을 받으면 sender는 packet을 재전송
1. Error detection (에러 감지)
- error 감지를 위해 보내는 packet에 checksum을 담아서 보냄
2. Feedback (피드백)
- packet을 받을 때마다 데이터를 오류 없이 잘 받았는지 feedback을 주어야함
Acknowledgements(ACKs) : packet을 정상적으로 받았을 때
Negative Acknowledgements(NAKs) : packet에 에러가 있었을 때
3. Retransmission (재전송)
- sender는 NAK을 받으면 이전에 보낸 packet을 재전송
RDT 2.1
Feedback 자체가 에러라면?
- Feedback에도 checksum이 필요
- sender는 ACK, NAK을 받았는지 판단 불가
-> 무조건 재전송
-> receiver는 packet이 중복인지 새로운것인지 판단할 수 없음
- 해결방안 : header에 packet 번호를 붙이면 됨 (sequence number)
- header의 크기는 작을수록 좋음 = Sequence number 개수를 최소화하고 싶음
- 2개로 충분하다

packet error -> error detection, feedback, retransmisson, sequence number로 해결
RDT 2.2
- NAK 없이 ACK만 사용
- receiver가 마지막으로 정상적으로 받은 ACK 번호를 sender에게 보냄

RDT 3.0
- if) underlying channel에서 error, loss 모두 발생
- Timer 사용
- 유실되었다면 아무 feedback 없음 = Time out
- Timer 시간을 얼마로 해야할 것인가?
- timer 시간 짧을 때
장점 : 유실 일어났을 경우 recovery가 빠름
단점 : 네트워크 오버헤드가 커짐
- timer 시간 길 때
장점 : 네트워크 오버헤드 작음
단점 : loss 발생했을 때 반응이 늦음


Recap : Principles of Reliable Data Transfer
- unreliable channel에서는 packet error, packet loss가 발생할 수 있음
- packet error를 해결하기 위해 error detection, feedback, retransmission, sequence number을 사용
- packet loss를 해결하기 위해 timer 사용
Pipelined protocols

- 하지만 지금까지의 RDT 프로토콜은 1번에 1개씩만 전송
- packet 1개 전송 후 ACK가 올 때까지 소켓은 아무것도 안함
- 실제 TCP는 pipelined 방식으로 동작
- 한번에 packet 보내고 한번에 feedback 받음