http://www.kocw.net/home/cview.do?cid=6166c077e545b736
복습
지금까지 배운 내용을 간단하게 복습한다.
persistent http
위와 같은 상황을 가정하고 pipelining 방식을 사용하지 않는다고 해보자.
3way handshake : (k/R+d)*3 (마지막은 http request)
http response : (L/R+d)
N개의 reference object가 있고, pipelining을 사용하지 않기 때문에 N번의 http response, requeset 필요
: {(k/R+d) +(L/R+d)}*N
위 시간들을 모두 더한 것이다.
udp
udp는 4개의 필드만 갖는다. 따라서 tcp에 비해 매우 단순하고 기능이 적다.
- checksum : 에러체킹
- port# : mux, demux
그래도 transport layer의 기본적인 기능은 제공한다.
UDP를 사용하는 protocol은 DNS가 대표적이다. 왜 DNS는 UDP를 사용할까?
RDT
실제 channel은 unreliable하기 때문에 pkt loss, pkt error가 발생한다. 각각 해결해야 한다.
- pkt error
- error detection
- checksum을 활용한 에러 감지
- feedback
- 에러가 감지되었으면 sender에게 feedback (ack, nak)
- retransmission
- sender는 nak에 대해 재전송
- sequence#
- 새로운 pkt과 재전송한 pkt을 구분하기 위함
- error detection
- pkt loss
- timeout
- timeout시까지 feedback을 받지 못하면 loss라 판단하고 재전송
- timeout
pipelining
실제로는 한번에 여러 pkt을 보내는 pipelining을 사용한다.
pipelining을 위한 protocol은 gbn과 selective repeat이 있다.
gbn
gbn은 단순하게 동작한다는 장점이 있다.
recevier는 현재 받아야 할 pkt만 기다리고 아닐 경우는 버린다.
sender는 window를 대표하는 하나의 timer만 사용하면 된다.
window의 가장 앞 seq#에 대한 timer만 사용한다.
window 1234일때 ack(1)을 수신하면 2에 대한 timer를 사용하고 window가 1칸 옮겨간다(2345).
단점으로는 sender는 loss나 error가 발생하면 여러개의 pkt을 재전송해야 해서 overhead가 크다.
(cumulative ack를 사용하기 때문)
gbn에서 ack(n)은 seq(n)까지 수신했고 seq(n+1)을 보내달라는 의미이다.
selective repeat
pkt loss 발생 시 유실된 pkt만 재전송해도 된다는 장점이 있다.
하지만 buffer를 사용해야 하고 구현이 비교적 복잡하다.
window 안의 모든 pkt마다 timer를 가지고 있어야 한다.
tcp
- point to point
- 2개의 socket 간 통신
- reliable, in-order
- pipelined
- send,receive buffers
- 양 쪽에 버퍼 2개씩 생성
- ful duplex data
- 양방향 데이터 흐름
- connection oriented
- 3 way handshake
- flow control
- sender will not overwhelm receiver
tcp에서는 cumulative ack를 사용한다.
ack(n)은 n-1번까지 정상수신했으며 n번째 pkt을 요구한다는 뜻이다.
seq#는 data의 맨 앞번째 byte 번호다.
cumulative ack를 사용하므로 중간의 ack들이 유실되어도 마지막 ack만 정상적으로 온다면 상관없다.
tcp에서는 timer로 pkt loss를 판단하는데 실제 timeout이 발생하는 시간은 넉넉해서 더 빠른 다른 방법도 사용한다.
fast retransmit으로 같은 seq#에 해당하는 duplicated ack를 3개 받으면 pkt loss로 판단하고 재전송 할 수 있다.
timer만으로도 tcp는 잘 동작하지만 fast retransmit이 더 효율적이게 해준다.
tcp에서도 sender는 window당 하나의 timer를 사용한다. (맨 앞 세그먼트에 대한 타이머)
receiver는 순서에 어긋난 세그먼트라도 recv buf에 저장한다.
3 duplicated ack에 의해 seq(400)을 sender가 재전송하면 recevier는 ack(900)을 응답한다.
congestion control
flow control은 구현이 간단하다. receiver가 header field로 버퍼의 가용 공간을 알려주면 되기 때문이다.
congetsion control은 nw 상황을 고려해서 sender가 세그먼트를 전송하는 것이다.
세로축의 window size 단위는 MSS(max segment size)를 의미한다.
즉 window size = 4 면 한번에 4개의 segment를 보내는 것이다.