<목차>
1. Selective Repeate의 문제
2. TCP
1) TCP 개요
2) TCP Header
3) TCP의 seq #와 ACK
3. RTT & Timeout
1) timeout 설정
2) 적절한 RTT
3) timeout 설정
4) TCP reliable data transfer
5) TCP sender event
6) TCP의 ACK생성 권고
7) 빠른 재전송
1. Selective Repeate의 문제
window size가 크고 ACK가 중간에 손실되는경우 receiver는 seq#가 같은 패킷을 구별 할 수 없다.
2. TCP
1) TCP 개요
point to point방식으로 통신한다. 즉, end system에서간에만 작동한다.
신뢰적인 제이터를 pipelined방식을 통해 전송하고 혼잡제어나 흐름제어를 통해 window size를 제어한다.
대부분 혼잡제어를 통해 window size를 조절하지만 송신칙이 수신측이 감당하지 못할정도로 패킷을 많이 송신하는 등의 압박을 하지 못하도록 수신측도 흐름제어를 통해 전송량을 통제한다.
송신측, 수신측 모두 패킷이 손실되는 경우에 대비해 buffer을 갖는다.
full duple 동시에 데이터 전송이 가능한 양방향통신이다.
connection oriented는 handshake를 먼저 수행한다는 것이다.
2) TCP Header
name | size(bits) | using |
Source Port Number | 16 | 송신측의 포트 넘버 |
Destination Port Number | 16 | 수신측의 포트 넘버 |
Sequence Number | 32 |
송신측이 보내는 패킷의 번호(byte strip number)인데 예를 들면 1100번째 byte라는 걸 말한다. |
Acknowledgement Number | 32 | 다음에 받아야할 패킷의 seqence number로 누적 ACK #이다. |
Header Length | 4 | 여분 헤더의 길이 |
Reserved | 6 | 사용하지 않는다. |
URG | 1 | urgent data (일반적으로 사용하지 않는다.) |
ACK | 1 | ACK # 유무 결정 |
PSH | 1 | push data now (일반적으로 사용하지 않는다.) |
RST / SYN / FIN | 1 / 1 / 1 |
RST : 1이면 통신을 재시작을 의미한다. |
Window Size | 16 | 흐름 제어를 위한 window size 크기 |
Checksum | 16 | 오류 검사 |
Urg data pointer | 16 | 사용하지 않는다. |
Options(variable length) | unknown | (일반적으로 사용하지 않는다.) |
application data (variable length) | unknown | 데이터이다. |
3) TCP의 seq #와 ACK
<요약>
seq #는 보내는 데이터의 순서를 의미한다. ack 는 몇번째 데이터까지 수신했다는 것을 의미한다.
eg1 )
eg2 )
3. RTT & Timeout
1) timeout 설정
timeout은 RTT보다 작게되면 의미없는 재전송이 너무 빈번하게 일어나기 때문에 기본적으로 RTT보다 크다. 하지만 너무 크게 되면 Segment손실에 대한 대응이 너무 늦어진다.
2) 적절한 RTT
3) timeout 설정
EstimatedRTT보다 약간의 여유값을 더한 값으로 설정한다.
보통 SampleRTT의 변화량이 큰경우는 따라서 커져야한다. (반대의 경우도 동일)
DevRTT는 SampleRTT가 EstimatedRTT로 부터 얼마나 벗어나느지에 대한 예측값이다.
DevRTT = (1-β)* DevRTT + β* |SampleRTT-EstimatedRTT| (β의 권장값 : 0.25)
실제 timeout 설정은 다음 수식을 이용해 사용한다.
TimeoutInterval = EstimatedRTT + 4*DevRTT
4) TCP reliable data transfer
TCP는 비신뢰적인 IP 상위에서 신뢰적인 통신 서비스를 제공한다.
Pipelined segment를 사용한다. 누적 ACK를 사용한다. TCP는 단일 재전송 timer를 사용 한다. 전송 segment 각각에 대한 timer는 개념적으로는 쉽지만 overhead가 크다. timeout이나 중복 ACK가 발생하는 event가 발생하면 재전송을 일으킨다. 간소화된 TCP sender는 중복 ACK 무시하고, 혼잡제어나 흐름제어를 무시한다.
5) TCP sender event
App로 부터 data 수신하게 되면 seq#를 가진 segement 생성한다. seq#는 첫번째 바이트의 byte stream #이다.
다른 segment에서 의해서 timer가 실행중이 아닐때 timer 시작하며, timer의 만료 주기는 TimeoutInterval이다.
timeout이 일어나면 timeout을 일으킨 segment를 재전송하고, timer 재시작한다.
ACK에 대한 event는 ACK가 확인 안 된 segment의 ACK인경우에 발생한다. ACK의 seq#가 send base보다 크면 이전에 확인 응답 안 된 segment에 대해 확인하고 sendbase를 갱신한다. 아직 확인 응답 안된 segment가 존재하면 timer를 재시작한다.
6) TCP의 ACK생성 권고
Receiver의 event |
Receiver의 동작 |
기다리는 seq#를 가진 segment도착. 이 미 기다리는 seq#까지의 모든 segment 수신 |
지연된 ACK. 다음 순서의 segment를 500ms 기다렸다가 도착하지 않으면 ACK 를 전송한다. |
기다리는 seq#를 가진 segment도착. 이 전에 수신한 seq에대한 ACK는 아직 전송 전 |
하나의 누적된 ACK를 전송 |
기다리는 것보다 높은 순서의 seq#를 가 진 segment가 도착. Gap이 발견 |
즉시 중복된 ACK전송 |
수신 segment의 gap부분에 해당하는 segment 도착 |
즉시 ACK전송 (segment가 gap의 낮은 쪽에서 시작하도록) |
TCP의 ACK생성 권고안은 반드시 지켜야 하는것은 아니다. 권고안에 따르면 손실이나 응답없음이나 같은 결과므로 응답하지 않는다. timeout이전에 중복 ACK오면 재전송을 한다.
7) 빠른 재전송
timeout이 유발하는 재전송의 문제는 주기가 비교적 길어 segment가 손실됬을때 송신자를 기다리게 해서 종단간의 지연이 증가하는 것이다.
중복된 ACK와 segment 손실에 대한 처리방식은 수신자는 기다리는것보다 큰 seq# 의 segment를 수신하면 이를 buffering하고 중복 ACK를 전송 하게 한다. segment를 손실하면 많은 중복된 ACK가 전송된다.
만약 Seq#가 10, 20, 30, 40, …인 경우 20이 loss 되면 30, 40, 50, … 을 보낼때 마다 ACK(20) 이 중복해서 sender에게 전달 된다. 만일 3번의 중복된 ACK가 sender에게 전송되면 해당 segment가 loss되었다고 판단한다. 이경우 timeout이전이라도 해당 segment를 재전송한다. 이 방식이 빠른 재전송(fast retransmit)방식이다.
'교육 > Netwrok' 카테고리의 다른 글
Day 62 (TCP Header) (0) | 2020.02.19 |
---|---|
Day 62(TCP_4) (0) | 2020.02.19 |
Day 61 (TCP_3_1) (0) | 2020.02.14 |
Day 60 (Network Layer) (0) | 2020.02.13 |
Day 60 (TCP_2) (0) | 2020.02.13 |