Chapter 3 Transport layer - 2

주리링·2021년 11월 30일
0

컴퓨터 네트워크

목록 보기
2/5
post-thumbnail

3.3 connection less transport : UDP

UDP

  1. best effort : 최선을 다하겠지만 loss, error, delay, bandwidth, order 등 아무것도 보장할 수 없다.
  2. connectionless : no, handshaking, UDP segment independently
  3. UDP use : 손상되고 없어져도 되는데 빨라야한다.
    loss tolerant, rate sensitive → streaming multimedia, DNS, SNMP
    대신 여러번 보내서 도착하는 것이 없도록 노력한다.
  4. reliable 하고 싶다면 application layer에서 구현하면 된다.

UDP segment

  1. payload의 길이는 고정되어 있지 않으므로 segment의 길이인 length값이 필요하다.
  2. checksum : error를 감지 → 감지되면 segment를 버린다.

check sum

segment를 16 bit마다 잘라서 더한다.

  1. error이 발생할 때마다 캐리 1을 더해서 16bit를 넘어가면 그 비트를 0번째 자리에 더함
  2. 이런 식으로 16bit씩 자른 bits를 다 더하면 sum이 나옴
  3. sum의 1의 보수를 checksum이라고 함 ⇒ 이걸 헤더에 넣는거임
  4. 데이터가 이동 할 때마다 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

  • 특징
  1. error도 loss도 없다.

sender

  1. app layer에서 rdt_send 메소드를 app에서 만든 data를 넣어서 보낸다. (event)
  2. data를 통해서 packet을 만들고 (action)
  3. transport layer에서 udt_send 메소드에 packet을 넣어서 보낸다.(action)
  4. 다시 wait for call from above

receiver

  1. network layer에서 rdt_rcv 메소드에 packet을 넣어서 transport layer로 보낸다.(event)
  2. transport layer에서는 받은 packet에서 data를 추출하여 (action)
  3. app layer로 deliver_data 메소드에 data를 넣어 보낸다.(action)
  4. 다시 wait for call from below

reliable channel이기 때문에 error도 loss도 체크할 필요가 없이 데이터만 이동시키면 된다.

rdt 2.0 → channel with bit errors

  • 특징
  1. checksum을 통한 error detection
  2. control megs(ACK,NAK)를 receiver에서 sender로 보내는 feedback
  • control message

acknowledgements (ACKs) : receiver가 sender에게 packet을 받는다.

negative acknowledgements (NAKs) : receiver가 sender에게 packet을 못받는다.

sender

  1. app layer에서 rdt_send 메소드를 app에서 만든 data를 넣어서 보낸다. (event)
  2. data와 checksum을 통해서 packet을 만들고 (action)
  3. transport layer에서 udt_send 메소드에 packet을 넣어서 보낸다.(action)
  4. wait for ACK or NAK 상태가 된다.
  5. rdt_rcv(rcvpkt)를 통해 패킷이 receiver에 도착했지만 error가 발생해 NAK이 발생한 경우 (event)
  6. udt_send 메소드에 다시 packet을 넣어서 보낸다.(action)
  7. 만약 ACK이 발생한 경우 (event)
  8. 다시 wait for call from above로 돌아간다.

receiver

  1. rdt_rcv(rcvpkt)로 packet이 왔지만 corrupt가 발생한 경우 (event)
  2. sender에게 udt_send(NAK) msg를 보낸다 (action)
  3. 만약 corrupt가 발생하지 않은 경우 (event)
  4. packet에서 data를 추출하고 application layer로 data를 보낸다. (action)
  5. 그리고 sender에게 ACK msg를 보낸다.
  • 문제점

sender가 다음 packet을 보내기 전에 ACK인지 NAK인지 알지 못한다.

그래서 다시 보내면 packet이 중복될 수 있다.

⇒ sender은 packet에 sequence number를 추가하고 receiver는 중복되는 packet을 버린다.

  • stop and wait

sender는 하나의 packet만 보내고 receiver의 response가 올 때까지 기다린다.

⇒ 이러면 순서가 바뀔일이 없다.

rdt 2.1 → handles garabled ACK/NAK

  • 특징
  1. 다음에 오는 수만 구별하면 되므로 sequence#이 0과 1로 구성되어 있다.
  2. sender의 상태 4개, receiver의 상태2개

sender

receiver

rdt 2.2 → a NAK-free protocol

  • 특징
  1. 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

  • 특징
  1. error도 발생하고 packet의 loss도 있다.
  2. loss가 data가 될 수도 있고 ACK가 될 수도 있다.
  3. sender에 reasonable한 시간동안 기다리게 할 timer가 있다.
  4. sender에서 보낸 packet이 loss될 경우 time out이 되면 packet을 다시 보낸다.

  1. ACK msg가 loss될 경우 sender가 다시 packet을 보내고 receiver에서 중복을 제거한다.

  1. timer 값을 너무 작게 잡거나 ACK msg가 너무 오래 걸려서 오는 경우

sender

  1. packet을 보내며 timer가 시작된다.
  2. timeout event가 발생하면 packet을 다시 보낸다.

문제점

stop and wait이므로 시간이 너무 오래 걸린다.

0.027%의 효율이 나오고 나머지는 packet과 ACK을 기다리는 시간이다.

해결방안 → pipelined protocols

3개의 packet을 동시에 보내면 3배 효율이 증가한다.

pipelined protocols

  1. Go-back-N
  2. Selective Repeat

1. Go-Back-N

sender

  • sender가 N개의 packet을 보낸다.
  • sender가 가진 timer가 만료되면 만료된 패킷부터 다시 보낸다.

receiver

  • 순서에 맞는 패킷이 오면 ack를 보낸다.
  • 순서에 맞지 않는 패킷이 오면 버린다.

2. Selective Repeat

sender

  • 패킷마다 타이머가 있다.
  • N개의 패킷을 보내고 타임 아웃이 되면 해당 패킷만 다시 보낸다.

receiver

  • 순서대로 패킷이 오지 않아도 buffer에 저장해둔다.
  • 앞 순서의 패킷이 오면 그 때 buffer에 있는 패킷들을 application layer로 올린다.

profile
코딩하는 감자

0개의 댓글