DongDD's IT

TCP - State Transition, Flow Control, Error Control 본문

네트워크

TCP - State Transition, Flow Control, Error Control

DongDD 2017. 8. 6. 14:58

TCP


Connection Establishment Diagram



Establishment 에는 5가지 상태가 있음

1) LISTEN : SYN 받기를 기다리는 상태 (Server)

2) SYN-SENT : SYN을 보내고 ACK을 기다리는 상태

3) SYN-RCVD : SYN을 받고 ACK을 보냄

4) EStABLISHED : 3-handshake 이후 연결이 된 상태

5) CLOSED : 연결 종료 상태



3-Handshake Termination



3-Handshake에는 4가지 상태가 있음

1) FIN-WAIT-1 : 연결 종료를 위해 FIN을 보낸 상태

2) CLOSE-WAIT : FIN을 받은 후 FIN+ACK을 보내기 전까지의 상태

3) LAST-ACK : FIN+ACK이후 마지막 ACK을 받기 위해 기다리는 상태

4) TIME-WAIT : ACK을 보낸 후 일정시간 종료하지 않고 기다리는 상태




4-Handshake에는 5가지 상태가 있음

1) FIN-WAIT-1 : 연결 종료를 위해 FIN을 보낸 상태

2) FIN-WAIT-2 : FIN에 대한 ACK을 받은 후 FIN을 기다리는 상태

3) CLOSE-WAIT : FIN을 받은 후 FIN을보내기 전까지의 상태

4) LAST-ACK : FIN이후 마지막 ACK을 받기 위해 기다리는 상태

5) TIME-WAIT : ACK을 보낸 후 일정시간 종료하지 않고 기다리는 상태


Time-Wait 상태를 두는 두 가지 이유


1) 마지막 ACK이 없어진 경우 Server측은 다시 FIN을 보내게 되는데 이 FIN에 대한 ACK을 보내기 위해 바로 종료하지 않고 기다림

2) 같은 Port 번호 부여로 생기는 error를 막기 위해 기다림. time-wait이 지난 후에는 같은 Port 번호이더라도 다른 연결로 취급함


Window Size 


- Packet을 보낸 후 ACK을 받기 전까지 보낼 수 있는 Maximum



Left wall(왼쪽 끝) : ACK이 오는 것에 따라 변함(Closing - 오른쪽으로 이동)

Right wall(오른쪽 끝) : 상대가 보내는 rwnd(window size)에 따라 변함 (Opening - 오른쪽으로 이동, Shrinking - 왼쪽으로 이동)

- Shrinking은 Time delay로 보통 발생하는데 TCP에서는 일어나지 않도록 되어있음



Flow Control


- 네트워크 상황이나 Receiver측의 상황을 고려해 보내는 양을 조절


Window size = minimum(rwnd,cwnd)

rwnd : Receiver가 받을 수 있는 양

cwnd : Network 상태에 따른 보낼 수 있는 양


현재는 컴퓨터 성능이 향상되어 일반적으로 cwnd가 rwnd보다 작을 확률이 높음


Silly Window Syndrome


- Header에 비해 보낸 data의 크키가 작아 overhead가 생기는 현상

1. 송신 측

   - 해결책

    1) Nagle 알고리즘

- 하나의 packet 전송 후 MSS를 채울때까지 기다리는 방식

- MSS가 찰 때까지 무작정 기다리는 것을 비효율적일 수 있기 때문에 Maximum wait time(ACK이 올때까지)를 두어 비효율성을 방지함

- Delay에 민감한 Application에서는 사용하지 않는 것이 좋음

2. 수신 측

   - 해결책

    1) Clark 알고리즘

- 수신 측의 window size가 작을 경우 sender에게 rwnd를 0으로 표시해서 보냄

- Sender는 이 window size를 보고 전송을 멈춤

- Receiver는 buffer에 있는 data를 비우다가 MSS크기가 되거나 buffer가 반 이상 비워지면 제대로 된 rwnd를 보냄

- 이 packet이 손실될 수 있기 때문에 Sender측에서는 수시로 probe를 보내 rwnd를 받음

    2) 확인응답 지연

- 수신 측의 window size가 작은 경우 ACK을 보내지 않고 그냥 기다리는 방식


Ref ) SYN Flooding


- 흔히 많이 알려진 DoS(Denial of Service) 공격

- 연결 요청 큐를 꽉 채워 다른 SYN을 받지 못하게 하는 방식

- 인위적으로 header를 수정하여 보내기 때문에 SYN을 받고 SYN+ACK을 보내지만 이에 대한 ACK을 받을 수 없기 때문에 연결을 하지 못하고 큐에 계속 남아 다른 SYN이 오지 못함

- DDoS(Distributed Denial of Service) : DoS 공격을 막기 위해 여러 방법이 생겨 DoS공격을 한 사람이 분산시켜 보내는 공격 방법


Error Control


1. Normal Operation

- Overhead를 줄이기 위해 ACK수를 줄이는 방법

1) Rule 1 : data를 받고 ACK을 보낼때 sending buffer를 보고 data가 있으면 같이 보냄

2) Rule 2 : Sending buffer에 data가 없을 때 특정시간(500ms) 기다린 후에 보냄.

-> data가 들어올 때: ack과 같이 보냄

-> data가 안들어올 때: ack만 보냄

3) Rule 3 : Sending buffer를 기다리는 동안 두 개의 packet이 오면 바로 ack을 보냄

-> 이 때 Sending buffer에 data가 있으면 같이 보냄

 2. Lost Segment

- packet loss로 문제가 생겼을 때

1) Rule 4 : Packet loss로 packet의 순서가 바뀌어서 왔을 때 바로 ack을 보냄

2) Rule 5 : 못 받았던 data가 들어오면 바로 ack을 보냄

 3. Lost Acknowledgment

- ack loss로 문제가 생겼을 때

1) Rule 6 : Ack이 사라져서 같은 data가 온 경우 바로 ack을 보냄


 4. Fast retransmission : packet 손실 후 timeout까지 기다리는 비효율성을 방지하기 위해 사용

- 이 방법을 쓰지 않으면 packet loss를 timeout까지 가서 detect해야 함 (비효율적)

- packet 전송 후 제대로 된 ack이후 같은 ack이 3번 올 경우 packet loss로 간주하고

이 후에 보냈던 data 다시 전송(Three duplicate ack)


Congestion Control(혼잡 제어)


- Packet switching Network이기 때문에 발생하는 혼잡으로 Bottleneck(병목현상)이 일어나는 것을 막기 위해

필요



Load : Network에 보내는 data양을 늘리는 정도


1. Slow start, exponential increase

- cwnd의 size = 1

- threshold에 도달할 때까지 exponential increase로 증가함

2. Congestion, additive increase

- cwnd의 size = 특정 size

- Congestion이 detect될 때까지 1씩 증가시킴



- 3 duplicate ACK으로 Congestion을 감지한 경우는 심한 혼잡이 아니라 판단하고 cwnd를 반으로 줄여 additive increate로 바꿈

- Time-out으로 Congestion을 감지한 경우는 심한 혼잡이라 판단하고 threshold를 현재 cwnd의 반으로 줄이고 cwnd를 1 MSS로 바꾼 후 exponential increase로 바꿈


TCP Fair


- 시작 점이 다르더라도 TCP에서는 같은 bandwidth 되도록 되어 있음

-> 하나의 bandwidth를 1/n씩 나눠가지게 됨 (RTT가 같을 경우)

- throuput의 합이 congestion 경계선을 넘어가면 반으로 줄어들게 되고 증가하는 폭은 RTT가 같을 경우 y=x와 평행하게 증가하고 결국 y=x 에 수렴하여 Fair하게 bandwidth를 나눠가짐

- RTT : Packet을 보내고 ack을 받을 때까지의 시간

example)

- Maximum capacity = 100Mbps

- c1 RTT = 20ms, c2 RTT = 10ms

-> c1 Throughput= 33.3Mbps, c2 Throughput= 66.6 Mbps

 

TCP Timers

 

1. Retransmission Timer : Fast Retransmission에 쓰이는 Timer

2. Persistence Timer : Clark 알고리즘에서 정상적인 rwnd의 packet이 손실 될 경우 사용

-> rwnd=0을 받으면 TImer시작, Time out시 probe 세그먼트 전송

3. Keepalive Timer : 오랜기간 idel 상태에 있는 것을 방지

-> 서버가 2시간 동안 클라이언트로부터 packet을 받지 못하면 probe 세그먼트 전송

4. TIME_WAIT Timer : Connection Termination후 종료될 때까지 wait하는 timer


RTT, RTO


1. RTTs(Smoothed RTT)

- default : X

- 첫 번째 측정 : RTTs = RTTm

- 이후 측정 : RTTs = (1-a)RTTs + aRTTm

   -> RTTm : 현재 측정된 값, a = 1/8 (현재 측정값의 가중치)

2. RTTd(RTT Deviation)

- default : X

- 첫 번째 측정 : RTTd = RTTm/2

- 이후 측정 : RTTd = (1-B)RTTd + B|RTTs-RTTm|

    -> RTTs : 이번에 계산된 RTTs, B= 1/4 (새로구한 편차의 가중치)

3. RTO(Timer에 사용할 값)

- default : 임의

- 이후 측정: RTO = RTTs + 4*RTTd

4. Karn's Algorithm

- 재전송에 대한 RTO계산을 하지 않음

- Timeout 이후 재전송한 후에 ack이 오는 경우가 있기 때문에 RTO계산을 하지 않음

- 재전송을 할때는 RTO*2로 해서 보냄


TCP Options


1. Single-byte

1) End-of-option option : option의 마지막에 쓰임

2) No-Operation option : option의 빈 공간을 채움

2. Multiple-byte

1) Maximum-segment-size option

- Recevier가 받고 싶은 size를 Sender에게 요청

2) Window-scale-factor option

- Bandwidth가 증가함에 따라 window size를 증가하기 위해 사용

- 1byte형태로 되어있고 이 값을 x라 할때 window size = window size * 2^x

-> 1), 2)은 Connection setup 과정에서 설정

3) Timestamp option

- RTT측정에 사용하기위해 사용

- Sender가 보내는 시간을 적어서 보냄, 이 정보가 적혀있는 ack이 오면 현재 시간에서 적혀있는 시간을 빼서 RTT 계산

- 또한 PAWS(Protection Aginst Wrapped Sequence Number)에 사용

-> file이 클경우 Sequence Number는 32bit가 최대 이므로 Sequence Number가 재사용되어야 하는 경우에 Timestamp를 사용해 혼동을 막을 수 있음

4) SACK

- Packet loss 이후 받은 packet의 Sequence number block을 표시

- 또한 Duplicate block도 표현

Comments