3. Transport Layer
- -
Must do in transport layer
- Multiplexing/demultiplexing
- Error checking
Multiplexing/demultiplexing
socket을 통해 message가 transport layer로 내려올 것이다.
Transport layer는 이를 segment로 만들어서 하위 layer로 보내게 된다.
How demultiplexing works
segment는 다음 2개의 파트로 나눌 수 있다.
- data 부분
- header부분
이때, header부분에 source port와 destination port에 대한 정보가 있는 것이다.
→ 이러한 정보를 가지고 demultiplexing을 진행할 수 있다.
추가적으로 1개의 datagram에는 1개의 transport layer segment가 들어있다.
UDP : User Datagram Protocol
- often used for streaming multimedia apps
- loss tolerant
- rate sensitive
- other UDP uses
- DNS
- SNMP
- reliable transfer over UDP : add reliability at application layer
Header
- source port number: 16bit (0 ~ 216−1)
- destination port number : 16bit (0 ~ 216−1)
- length
- checksum : 전송 도중 error가 있는지 없는지 판단하는데 사용
Principles of Reliable Data Transfer
일단은 단순한 모델부터 생각해보도록 하자.
이후에는 별다른 언급이 없으면, 하나의 패킷이 receiver에게 다 도착했다는 것을 확인한 이후 그다음 packet을 보낸다고 가정하겠다.
Rdt1.0 : Data Transfer over a Perfect Channel
- The underlying channel is perfectly reliable
- no packet errors
- no packet loss
- What mechanism do we need for reliable transfer?
→
Nothing!
Rdt2.0 : channel with packet errors (no loss)
- What mechanisms do we need to deal with error?
- Error detection
- Add checksum bits
- Feedback
Acknowledgement (ACKs)
: receiver explicitly tells sender that packet received correctly
Negative acknowledgment (NAKs)
: receiver explicitly tells sender that packet had errors
- Retransmission
- sender retransmits packet an receipt of NAK
- Error detection
따라서 우리는 다음 3가지의 mechanism이 필요하게 된다.
- Error detection
- Feedback
- Retransmission
Rdt2.1
하지만, 만약 ACK나 NAK에 error가 있는 경우에는 문제가 발생하게 된다.
하지만, receiver 입장에서는 중복된 패킷인지 새로운 패킷인지 알 길이 없다.
→ 그래서 packet에 번호를 붙이는 것이다.
즉 rdt 2.0과 거의 유사하지만 sequence number를 추가했다는 점에서 차이를 보인다. Mechanism을 정리하면 다음과 같다.
- Error detection
- Feedback
- Retransmission
- Sequence
Handling Duplicate Packets
- Sender adds
sequence number
to each packet
- Sender retransmits current packet if ACK/NAK unclear
- Receiver discards duplicate packet
Example
Rdt2.2 : a NAK-free protocol
Functionality는 rdt2.1과 동일하지만 ACK만 사용하겠다는 것
→ Instead of NAK, receiver sends ACK for the last correctly received packet
Rdt3.0 : channel with loss & packet errors
- What mechanisms do we need for packet loss?
Timer!
- Sender waits “reasonable” amount of time for ACK (a Time-out)
- If packet (or ACK) is just delayed (not lost):
- Retransmission will be duplicate, but use of sequence number already handles this
Timer의 간격에 따라 장단점이 존재한다
- 짧게 한 경우
- 장점 : loss 되었을 때 recovery가 빠름
- 단점 : retransmission이 너무 빈번하게 발생해서 overhead가 발생한다.
- 길게 한 경우
- 장점 : network의 overhead가 적음
- 단점 : loss가 발생했을 때 recovery가 느리다
Example
Recap : Principles of Reliable Data Transfer
- What can happen over unreliable channel?
- packet error, packet loss
- What mechanisms for
packet error
?- Error detection (by using checksum), feedback, retransmission, sequence number
- What mechanisms for
packet loss
?- Timeout
Performance of rdt3.0
하지만 여태까지 언급한 방식은 한번에 하나의 패킷만 보낼 수 있다는 점에서 unrealistic하다. (신뢰성은 있지만 느려터졌다.)
→ 이러한 방식을 stop-and-wait
이라고 부른다.
Usender : utilization - fraction of time sender busy sending
Pipelined protocols
sender allows multiple
, yet to be acknowledged packets
- range of sequence numbers must be increased
- buffering at sender and/or receiver
pipelined protocol을 구현하기 위한 방법은 2가지가 존재한다
go-Back-N
selective repeat
아래 사이트에서 직접 구동을 확인해보도록 하자.
Example
Go-Back-N
- ACK(n) : ACKs all packets up to, including sequence number of n -
cumulative ACK
→ 예를 들어 ACK 11이라는 것은 11번 packet까지 잘 받았다는 것을 의미한다.
→ 따라서 여러 번의 중복된 ACK를 수신할 수 있다.
receiver와 sender의 입장에서의 procedure는 다음과 같다.
Sender
- 첫 packet을 보내고 timeout timer를 킨다.
- 첫 packet에 대한 응답이 오지 않아도 윈도우 크기 만큼의 packet을 순서대로 보낸다.
- 윈도우의 맨 앞에 있는 순서번호에 해당하는 ACK가 왔을 때, 윈도우를 오른쪽으로 민다.
- 윈도우를 이동시킬 때 (ACK가 도착했을 때) timeout timer를 재시작시킨다.
- packet에 대한 응답이 오지 않아 타임아웃이 되면, 윈도우 처음부터 packet을 다시 순서대로 보낸다.
Receiver
- 패킷을 수신하면 ACK(n)을 sender에게 보낸다.
- 만약, k번 packet까지 정상적으로 받았는데, 다음에 k + 2번 packet을 수신하면 해당 패킷은 버린다.
- 이후 k + 1번 패킷을 받게 되면 ACK(k + 1)를 sender에게 보낸다.
Example
→ 오른쪽에서 packet 2를 기다리는데 packet 3이 도착했기 때문에 버리는 것이다. 그리고 1번까지는 잘 받았으므로 ACK1를 보낸 것이다.
→ TimeOut된 것 기준으로 window size만큼 다시 보낸다.
Sequence number bit
The sequence number in each packet is used to identify and distinguish between different packets. To accommodate a window size of n, you need enough bits for n + 1 distinct sequence numbers. This allows for n unacknowledged but sent packets at the sender side, and one additional sequence number for the next expected packet at the receiver side.
Therefore, you would need log2(n+1)
bits for the sequence number in each packet with Go-Back-N protocol.
→ 예를 들어 window size가 4이고 packet의 number는 절대적으로 가정하겠다. 만약에 0 ~ 3에 해당하는 packet을 receiver가 수신했지만, 이에 대한 ACK가 sender에게 가다가 유실되었다고 가정해보자. 그러면 sender 입장에서는 timeout때문에 packet 0부터 다시 보내게 될 것이다. 반면 receiver입장에서는 3번까지 받은 상황이기 때문에 ACK(3)을 전송할 것이다. 이 상황에서 만약 sequence number의 크기를 4로 한정한다면 receiver입장에서는 packet 4에 해당하는 정보가 온 것인지 아니면 ACK(3)이 또다시 sender에게 도착하지 않아서 packet 0을 재전송한 것인지를 구분할 수 없다. 이러한 문제때문에 +1만큼 조금 더 여유를 줬다고 생각해주면 된다.
Selective repeat
Go-Back-N의 경우에는 window size만큼 다시 재전송을 한다는 측면때문에 비효율성이 발생한다.
이에 개선을 하고자 ACK를 cumulative하는게 아니라 각각의 packet이 수신이 되었는지를 확인하는 용도로 사용하게 된다. 즉 ACK(n)의 의미가 해당 n번 packet이 잘 수신되었다는 것을 의미하는 것으로 변하게 된다.
추가적으로 Go-Back-N과 달리 순서에 맞지 않게 들어온 packet이라도 받아줘야 한다는 점에서 차이를 보인다. 또한 각 packet에 대해서 timer를 설정해야한다는 점에서 단점이 발생한다.
주의해야할 점은 receiver와 sender 모두 window를 가진다는 점이다. 이때 receiver가 packet을 받았더라도 sender 입장에서 윈도우의 맨 앞에 있는 packet에 대한 ACK를 받지 않으면 sender측의 윈도우는 이동하지 않는다.
직접 구현해보는게 이해가 가장 빠르다.
Example
Sequence number bit
In the selective repeat protocol, the sender maintains a window of up to n unacknowledged packets that have been sent. Similarly, the receiver also maintains a window of up to n packets that it is willing to receive.
The sequence number in each packet is used to identify and distinguish between different packets. To accommodate a window size of n, you need enough bits for 2n distinct sequence numbers. This allows for n unacknowledged but sent packets at the sender side, and another n unsent but receivable packets at the receiver side.
Therefore, you would need log2(2n)
bits for the sequence number in each packet with selective repeat protocol.
Dilemma
sequence number를 줄이는 것이 header의 크기를 줄이기 위해서는 중요하다.
그렇다면, window size와 sequence number 사이의 관계에 대해서 알아보고 싶다. 예를 들어 window size가 3이고, sequence의 개수를 4로 설정했다고 가정하자. 그러면 다음과 같은 상황을 구분할 수 없는 문제가 발생한다.
TCP
- point-to-point
→ 소켓 1쌍 끼리의 통신을 책임지는 것
- reliable, in-order byte stream
- pipelined
- send & receive buffers
- full duplex data
→ bi-directional data flow in same connection
- connection-oriented
- flow controlled
→ sender will not overwhelm receiver
- congestion controlled
→ 내부 네트워크가 받아들일 수 있는 양만큼 조절한다는 것
TCP segment structure
- 각각 port 주소는 16bit이다.
- checksum : 해당 segment가 network를 거쳐오면서 error가 있었는지 확인하는 목적
→ 이것을 활용해서 error detection을 수행하게 된다.
- Receive window : receiver buffer에 얼마나 많은 공간이 있는지에 대한 정보가 담겨있는 field
소중한 공감 감사합니다