9.2 Transport-layer protocols
transport-layer의 프로토콜은 전 챕터에서 다뤘던 내용들을 합치면 된다.
먼저 TCP/IP 프로토콜은 전 챕터에서 배운 프로토콜의 집합체라 볼 수 있다.
Simple protocol
놀랍게도 이게 전부다. 그냥 그림만 봐도 이해가 가능할 정도의 간단한 connection protocol이다.
Stop-and-Wait Protocol
- connection-oriented protocol인 stop-and-Wait 프로토콜이다.
- flow control과 error control을 둘 다 사용한다.
- sliding window의 size는 1이다. (buffer size)
- sender는 ACK가 도착하기를 기다리면서 하나씩 패킷을 보낸다.
- corruption 정도를 파악하기 위해 packet에 checksum을 추가해야 한다.
receiver에 패킷이 도착했다면 이건 이미 확인된 패킷일 것이다. 만약 corrupted된 패킷이었다면 discarded 되었을 것이다.
반대로 receiver에게서 ACK가 보내지지 않으면 패킷이 뭔가 잘못되었다는 뜻이다.
ACK가 도착하지 않으면 sender는 패킷을 다시 보내야 한다. 즉, 패킷의 데이터를 복사하고 있어야 한다는 뜻이 된다.
sequence number는 어떻게 될까? sliding window의 size가 1이니 2^1 - 1 = 1
그래서 0 1 0 1 계속 sequence number는 반복되게 된다.
이 상황에서 Acknowledgement number는 어떻게 될까?
만약 패킷 1이 도착하면 0을 보내고, 0이 도착하면 1을 보낸다. 이것은 1이 도착했을 때 0을 다음번에 보내라는 뜻이다.
이 stop-and-wait protocol에도 단점이 있다.
길고 두꺼운 파이프에서 통신한다면 매우 비효율적이다.
chennl을 파이프에 비유한 것인데, 두껍다는 것은 큰 bandwidth를 가지고 있다는 것을,
long이라는 것은 delay가 길다는 것을 의미한다.
네트워킹에서 작업들을 미리 task에 저장하는 경우도 있는데 이를 pipelining이라고 한다.
stop-and-wait protocol에서는 pipelining이 없다. 상황에 따라 task가 달라지는 프로토콜이다보니, 작업을 미리 정해놓을 수가 없는 것이다.
Go-back-N Protocol
go-back-n protocol은 위에서 언급한 두껍고 긴 파이프에서의 통신의 문제점을 해결할 수 있다.
ACK를 받을 때까지 기다리는 것은 너무 비효율적이다. channel의 bandwidth가 큰데도 불구하고 ACK를 기다리는 건 낭비가 심하다.
그래서 한번에 여러 패킷을 보내는 것을 고려할 수 있다. 그 중 하나의 프로토콜의 go-back-n protocol이다.
sequence number와 ACK number 개념은 위의 프로토콜과 똑같다.
Send window
send window는 보낼 수 있는 패킷이 들어있는 window이다. 최대 크기는 2^3 - 1 = 7이다.
만일 ACK 6이 도착하면 위 그림과 같이 sliding되어 이동한다.
Receive Window
Receive window의 사이즈는 항상 1이다.
저기 가르키고 있는 숫자는 도착할 것으로 예상되는 패킷의 sequence number이다.
해당 패킷을 받으면 다음 window로 넘어간다.
근데 만약 여기서 ACK가 너무 늦게 도착해서 timer가 끝나버린다면?
sender는 다시 다 보내야 한다. Send window에 패킷들을 저장해놨기에 이것들을 전부 다시 보내게 된다.
위 그림은 전체 플로우이다.
다음은 packet이 lost되었을 때의 flow이다.
Selective Repeat (SR)
Go-back-N protocol은 receiver의 프로토콜을 간단화 시킨다.
그냥 한 변수만 계속 관리하면 되기 때문이다.
하지만 패킷을 많이 지속적으로 잃어버린다면 전체 과정을 다시 해야 할수도 있기에 비효율적일 수 있다.
selective repeat은 이름에서도 알 수 있듯이 resend가 필요한 패킷만 선택적으로 resend하는 것이다.
SR에서는 receive window가 send window와 크기가 같다.
selective로 resend를 해야 하기에 receive window에서 패킷들을 저장하고 있다가 나머지 패킷이 올 때까지 기다려야 하기 때문이다.
SR은 이론적으로는 각 패킷에 대한 타이머를 실행한다.
즉 각 패킷을 그룹으로 생각하는 것이 아닌 개별적인 패킷으로 생각한다는 의미이다.
하지만 많은 transport-layer protocol은 하나의 타이머를 사용하므로 하나의 타이머만 사용하게 된다.
그리고 GBN과 ACK에서 다른 점이 또 있다.
GBN에서 ACK는 기대되는 다음 패킷을 가르키게 되지만
SR에서는 잘 도착한 sequence number들을 가르키고 있다.
SR의 플로우를 나타낸 것이다.
위 그림들로 적절한 window size를 어떻게 설정해야 하는지 알 수 있을 것이다.