3.3 connection less transport : UDP
UDP
- best effort : 최선을 다하겠지만 loss, error, delay, bandwidth, order 등 아무것도 보장할 수 없다.
- connectionless : no, handshaking, UDP segment independently
- UDP use : 손상되고 없어져도 되는데 빨라야한다.
loss tolerant, rate sensitive → streaming multimedia, DNS, SNMP
대신 여러번 보내서 도착하는 것이 없도록 노력한다.
- reliable 하고 싶다면 application layer에서 구현하면 된다.
UDP segment
- payload의 길이는 고정되어 있지 않으므로 segment의 길이인 length값이 필요하다.
- checksum : error를 감지 → 감지되면 segment를 버린다.
check sum
segment를 16 bit마다 잘라서 더한다.
- error이 발생할 때마다 캐리 1을 더해서 16bit를 넘어가면 그 비트를 0번째 자리에 더함
- 이런 식으로 16bit씩 자른 bits를 다 더하면 sum이 나옴
- sum의 1의 보수를 checksum이라고 함 ⇒ 이걸 헤더에 넣는거임
- 데이터가 이동 할 때마다 sum을 계산해서 헤더에 check sum에 더하면 FF(16)이 나오면 error발생안함 아닐경우 error발생해서 버림
3.4 principles of reliable data transfer
transport layer에서 unreliable한 network layer과 데이터를 주고 받을 때 reliable하게 만들 method을 구현한다.
finite state machines(FSM)을 이용해서 method를 구현
reliable data transfer (rdt)
rdt 1.0 → reliable channel
- error도 loss도 없다.
sender
- app layer에서 rdt_send 메소드를 app에서 만든 data를 넣어서 보낸다. (event)
- data를 통해서 packet을 만들고 (action)
- transport layer에서 udt_send 메소드에 packet을 넣어서 보낸다.(action)
- 다시 wait for call from above
receiver
- network layer에서 rdt_rcv 메소드에 packet을 넣어서 transport layer로 보낸다.(event)
- transport layer에서는 받은 packet에서 data를 추출하여 (action)
- app layer로 deliver_data 메소드에 data를 넣어 보낸다.(action)
- 다시 wait for call from below
reliable channel이기 때문에 error도 loss도 체크할 필요가 없이 데이터만 이동시키면 된다.
rdt 2.0 → channel with bit errors
- checksum을 통한 error detection
- control megs(ACK,NAK)를 receiver에서 sender로 보내는 feedback
acknowledgements (ACKs) : receiver가 sender에게 packet을 받는다.
negative acknowledgements (NAKs) : receiver가 sender에게 packet을 못받는다.
sender
- app layer에서 rdt_send 메소드를 app에서 만든 data를 넣어서 보낸다. (event)
- data와 checksum을 통해서 packet을 만들고 (action)
- transport layer에서 udt_send 메소드에 packet을 넣어서 보낸다.(action)
- wait for ACK or NAK 상태가 된다.
- rdt_rcv(rcvpkt)를 통해 패킷이 receiver에 도착했지만 error가 발생해 NAK이 발생한 경우 (event)
- udt_send 메소드에 다시 packet을 넣어서 보낸다.(action)
- 만약 ACK이 발생한 경우 (event)
- 다시 wait for call from above로 돌아간다.
receiver
- rdt_rcv(rcvpkt)로 packet이 왔지만 corrupt가 발생한 경우 (event)
- sender에게 udt_send(NAK) msg를 보낸다 (action)
- 만약 corrupt가 발생하지 않은 경우 (event)
- packet에서 data를 추출하고 application layer로 data를 보낸다. (action)
- 그리고 sender에게 ACK msg를 보낸다.
sender가 다음 packet을 보내기 전에 ACK인지 NAK인지 알지 못한다.
그래서 다시 보내면 packet이 중복될 수 있다.
⇒ sender은 packet에 sequence number를 추가하고 receiver는 중복되는 packet을 버린다.
sender는 하나의 packet만 보내고 receiver의 response가 올 때까지 기다린다.
⇒ 이러면 순서가 바뀔일이 없다.
rdt 2.1 → handles garabled ACK/NAK
- 다음에 오는 수만 구별하면 되므로 sequence#이 0과 1로 구성되어 있다.
- sender의 상태 4개, receiver의 상태2개
sender
receiver
rdt 2.2 → a NAK-free protocol
- NAK대신 ACK와 seq#으로 NAK을 표현한다.
(sender에서 0을 보냄 → receiver가 0을 받고 0을 보냄 → sender가 0을 받고 1을 보냄 → error이 발생해 receiver에 1이 도착하지 않음 → receiver은 마지막으로 받은 0을 보낸다.(NAK))
sender, receiver
rdt 3.0 → channel with errors and loss
- error도 발생하고 packet의 loss도 있다.
- loss가 data가 될 수도 있고 ACK가 될 수도 있다.
- sender에 reasonable한 시간동안 기다리게 할 timer가 있다.
- sender에서 보낸 packet이 loss될 경우 time out이 되면 packet을 다시 보낸다.
- ACK msg가 loss될 경우 sender가 다시 packet을 보내고 receiver에서 중복을 제거한다.
- timer 값을 너무 작게 잡거나 ACK msg가 너무 오래 걸려서 오는 경우
sender
- packet을 보내며 timer가 시작된다.
- timeout event가 발생하면 packet을 다시 보낸다.
문제점
stop and wait이므로 시간이 너무 오래 걸린다.
0.027%의 효율이 나오고 나머지는 packet과 ACK을 기다리는 시간이다.
해결방안 → pipelined protocols
3개의 packet을 동시에 보내면 3배 효율이 증가한다.
pipelined protocols
- Go-back-N
- Selective Repeat
1. Go-Back-N
sender
- sender가 N개의 packet을 보낸다.
- sender가 가진 timer가 만료되면 만료된 패킷부터 다시 보낸다.
receiver
- 순서에 맞는 패킷이 오면 ack를 보낸다.
- 순서에 맞지 않는 패킷이 오면 버린다.
2. Selective Repeat
sender
- 패킷마다 타이머가 있다.
- N개의 패킷을 보내고 타임 아웃이 되면 해당 패킷만 다시 보낸다.
receiver
- 순서대로 패킷이 오지 않아도 buffer에 저장해둔다.
- 앞 순서의 패킷이 오면 그 때 buffer에 있는 패킷들을 application layer로 올린다.