[네트워크] transport layer!

Transport layer

  • reliable이 핵심! 즉, packet이 왔으면 정확한지 확인하고 전달하는 구간이다! 
  • communication between process!!
  • TCP(reliable) , UDP(unreliable)
  • port number

그림1. TCP,UDP data format
Connection-oriented demux
  • TCP socket은 UDP와 다르게 source IP, source Port, dest IP, dest Port로 identify된다. (UDP는 dest IP, dest Port)
  • 이게 뭔뜻인고 하니, 우선 UDP 의 경우 host 내 포트에 위치한 프로세스의 소켓으로 여러 소켓들이 들어온다.
  • 반면, TCP는 host의 포트에 위치한 프로세스에 여러 source로부터 소켓이 들어올 경우, 소켓이 fork되어 분리된다.
  • 그림2를 봐라. 같은 프로세스가 여러 socket을 갖는 TCP 의 모습이다. (다시 정리하자면, host(IP)내 port는 하나의 process와 대응되고, UDP에서는 이 process가 하나의 socket을 갖는 반면, TCP는 하나의 process에 여러 socket이 대응된다.)
  • 왤까? 내생각엔 TCP는 reliable 데이터 전송을 위해 source와 destination간의 hand shaking과정을 거치며 자체 채널을 구축한다. 따라서 destination의 process은 각 source에 대해 개별적으로 대응할 socket이 필요할듯하다. UDP처럼 한 소켓으로 여러 source를 대응하면, state를 개별적으로 저장하여 각기 다른 대응이 불가능할테니 말이다.



그림2 TCP socket
UDP
  • best effort : reliable은 보장하지 않는 대신에, 현재 traffic에서 가장 best한 service를 user에게 제공하는 방식!!
  • DNS, SNMP
  • checksum은 제공한다.  아예 unreliable하다고 단정지으면 억울할듯
그림3 UDP data format

Checksum
  • error check
  • sender은 segment내의 모든 비트를 16bit씩 쪼개주고, 더한다. 이후 carry를 더해주고, 1's complement를 취해준다. 이녀석을 보내주면 receiver은 checksum을 다시 구하고 비교해서 두 값이 서로 일치하는지 체크한다.
  • 모든 error에 대한 대비책이 될 순 당연히 없다.

그림4 checksum

Principle of rdt (reliable data transfer)
  • rdt 1.0
    • socket에 state가 존재한다.(FSM : finite state machines)
    • no bit error, no packet loss 가정한다.
  • rdt 2.0
    • bit error이 일어날 수 있다. -> checksum을 통해 감지 -> 어떻게 recover??
    • ACK, NAK 으로 확인하고 resend!
  • rdt 2.1
    • ACK, NAK 도 bit error이 일어날 수 있다.
    • sequence number을 packet에 부과한다. (0,1만 부과해도 됨) -> sender 와 receiver 사이의 sync 를 맞춰줄 수 있다.
  • rdt 2.2
    • NAK을 제거한다. (그 전 sequence number + ACK으로 하면 됨)
  • rdt 3.0
    • packet loss가 일어날 수 있다.
    • timeout 기능을 추가한다.(sender) -> timeout시 resend
  • pipelined protocol
    • timeout 의 오버헤드가 지나치게 크다. 
    • 여러개를 슉슉 보내자!
    • GBN(Go-back-N), Selective Repeat
그림5 timeout overhead

그림6 pipelined protocol

  • GBN(Go-back-N)
    • 전송 실패가 뜬 packet부터 순서대로 다시 보내버림(오버헤드)
  • Selective Repeat
    • 전송 실패가 뜬 packet만 다시보낸다.
    • buffer에 실패 이후의 packet들을 임시보관
그림7 Go-back-N

그림8 Selective repeat

여기서 개념 정리하고 가자!
  • window size : RTT(Round Trip delay Time)동안 전송할 수 있는 패킷의 수
  • sequence number : 임의로 지정해준 패킷 번호(그림8에선 9이다.)


그림9 Go-back-N 의 sender packets
문제를 풀어볼까?
그림10 window/seqnum 관련 예제

  • 그림  (a)와 그림 (b)를 보면, (a)는 보내는 패킷 하나가 loss가 일어났고, (b)에는 돌아오는 window size만큼의 패킷이 loss가 일어났다. 그런데 문제는 receiver입장에서 이 둘을 구분할 방법이 없다. 아마 receiver은 (a)와 같이 loss가 일어났다 생각할테고, 그에 따라 sender 와 receiver에 packet이 서로 sync가 안맞게 된다.
  • 이 일이 발생한건 window size에 비해 sequence number이 작아서이다. 한번에 loss가 일어날 수 있는 최대의 packet수는 window size인데 (왜냐면 RTT동안 window size만큼만 보내므로) 이 문제를 피하기 위해선 sequence number의 크기가 window size보다 2배이상 커야한다.
  • 그 이유는 sequence number이 한바퀴 돌아 0으로 오는걸 피해야 하기 때문이다. 0에서 시작한 packet이 RTT동안 최대 window size-1만큼 보내고, 최대 window size-1큼의 loss가 일어난후 1만큼 다시 보내는 것이 sequence number을 최대한 소비하는 방식인데, 이만큼 소비한 이후에도 0으로 돌아와선 안된다.
  • windowsize -1 + windowsize -1 + 1 = windowsize*2 -1 보다 sequence number가 커야 가능한 일이다.
  • 헷갈리다면 window size 3, sequence number 5,6 을 두고 한번 직접 해봐라.

-> 마무리 rdt는 transport layer에서 핵심적인 내용이다. rdt는 내가 보기에 TCP 뿐 아니라 UDP에도 적용된다고 보는 것이 합리적이며, 다시말해 UDP역시 어느정도의 reliable data transfer을 위해 노력한다.(UDP header에는 checksum 이 존재하고 이는 rdt2.0버전을 함유함을 의미함) 다만 UDP의 헤더에는 sequence number가 없다는 것, 즉 rdt 2.0까지만을 제공한다고 생각하는 게 맞을듯하다.

TCP 
  • reliable data (congestion control, flow control)
  • ACK를 보낼때 받고싶은 sequence number을 보냄 (그림12)




그림11 TCP data format



  • TCP fast transmit
    • time out overhead를 피하기 위해 같은 seq의 ack를 3회이상 받으면 resend 수행
그림12 TCP fast transmit
  • TCP flow control
    • receiver가 buffer을 갖고, sender의 보내는 속도를 조절한다.
    • 그림14를 보면 rwnd가 수신 윈도우 크기(수신측 버퍼 여유 용량)이다. 다시말해 sender의 window size(awnd)는 rwnd보다 작거나 같도록 receiver이 조절한다. 
그림13 TCP flow control

그림14 TCP flow control

  • TCP congestion control
    • Tahoe : 초기 cwnd(혼잡 윈도우)는 1, 지수적으로 증가하다가 threshold지나면서 선형적 증가하다 data loss(3 duplicated ACK / timeout)시 다시 1로 떨어진다.(그림 16)
    • Reno :  data loss(3 duplicated ACK / timeout) 시 cwnd는 절반으로 줄어들고, 다시 선형적 증가한다.(그림 16)
그림15 Tahoe 방식
그림16 TCP congestion control

  • window size 
    • awnd = minimum [ cwnd, rwnd ]
      • awnd : 전송 윈도우 크기
      • cwnd : 혼잡 윈도우 크기
      • rwnd : 수신 윈도우 크기(수신 측 버퍼 여유 용량)


댓글

  1. 그림 8의 sequence number가 9인 이유는 0~8까지라서 인가요?

    답글삭제

댓글 쓰기

가장 많이 본 글