[CS] 컴퓨터 네트워크 TCP Timer

재오·2023년 5월 24일
3

CS

목록 보기
18/35
post-thumbnail

타이머

TCP 프로토콜에서는 회선 연결의 신뢰성을 확보하기 위해 4개의 타이머를 활용한다.

Retransmission

Retransmission은 타임 아웃이 발생하였을 때 쓰이는 타이머이다. 송신측은 매 세그먼트를 전송할 때마다 재전송 타이머를 가동한다. 정해진 시간(RTO) 내 ACK이 도착하지 않으면 재전송을 하게된다. 여기서 RTO는 고정된 값이 아니라 조정이 가능하다.

*RTO

재전송 타이머로 재전송까지 걸리는 시간을 의미한다.

처음에는 초기값 이고, 그 이후의 측정값은 RTTs + 4RTTd 이다.

*RTT(왕복시간)

송신지부터 목적지까지 패켓이 왕복하는데 걸리는 시간을 의미한다. IP패켓의 왕복시간은 ping 명령어를 사용하여 RTT 및 TTL(IP패켓수명) 수치를 알 수 있다.

*RTTm

TCP 세그먼트들이 보내면 그 세그먼트에 대한 ACK 수신까지 걸리는 실제 시간이다. 네트워크의 가변성 때문에 RTT 측정값은 그때마다 달라진다. 동시에 여러 세그먼트에 대한 RTTm을 측정하지 않는다.

*RTTs

RTTm은 변동성이 너무 커서 RTO로 사용하기 부적절하다. 이를 해결하기 위해 이전 RTTs와 측정된 RTTm이 필요하다.

처음에 RTTs = RTTm 이다. 그 이후에 RTTs = (1-α) 기존 RTTs + α 측정 RTTm 이다. 일반적으로 α = 1/8이다. 여기서 α는 현재 측정한 것에 가중치를 두는 것이고 (1-α)는 기존 측정에 가중치를 더 둔 것이다.

*RTTd

RTTs를 더 보완해서 RTO를 구하기 위해 사용하는 것으로 편차 를 의미한다.

처음에 RTTd = RTTm / 2 이다. 그 이후에 RTTd = (1-β)기존 RTTd + β|측정 RTTs - 측정 RTTm| 이다. 일반적으로 β = 1/4이다.

Persistence

Persistence timer (영속 타이머)는 윈도우 크기 결정을 위한 타이머이다. 수신자가 rwnd=0 을 보내 송신자가 데이터 송신을 멈춘 상황에 persistence timer가 작동한다. persistence timer가 time out이 되었는데도 상대방에게서 아무런 반응이 없으면, 송신자는 1 바이트 길이의 데이터(probe segment)를 수신자에게 보낸다. 수신자는 자신의 window size를 ACK과 함께 보내는데, 주기적으로 계속 0을 반환하다가 size에 여유가 생기게 됨을 확인하면, 송신자는 데이터 전송을 재개하게 된다.

Keep Alive Timer

이미 connection이 된 상태에서 두 연결간의 오랜기간 동안 휴지상태에 있지 않기 위해 사용한다. 클라이언트가 정상적인 종료를 하지 않으면 서버는 연결이 비정상적으로 종료된 지를 모른 채 계속 connection 상태를 유지할 것이다. 이런 상황을 방지하기 위해 Keep Alive Timer 를 사용한다. 서버가 클라이언트로부터 어떠한 데이터를 받을 때마다 이 타이머는 초기화 되는데, 2시간동안 세그먼트를 받지 못하면 probe segment를 전송한다. ACK이 오지 않으면 죽었구나…온다면 살아있구나 확인이 가능하다.

TIME-WAIT

TIME-WAIT 타이머는 TCP 연결 종료 중에 사용된다. 먼저 연결을 종료한 쪽에 이 타이머가 생기는데, Timer는 두번째 FIN에 대한 마지막 ACK을 전송하고, 연결을 종료한 후 TIME-WAIT 상태에서 TIME-WAIT 타이머가 시작된다. 최대 2분동안 TIME-WAIT상태에서 대기하고 CLOSED하게 된다.

처음에는 타이머를 켜고 SYN 패켓을 보낸다. 갔다 오는데 measurement 1.5초가 측정되었다. 4.50인 RTO를 계산이 되었다면 다음 ACK을 보냈을 때 4.50초 안에 응답이 오지 않으면 타임아웃을 한다. 여기서 계산한 값 4.74는 다음 패켓을 보낼 때 4.74로 세팅을 해놓겠다는 의미이다.

Karn’s algorithm

a인 경우에는 별 문제가 생기지는 않지만 b와 같은 경우에는 ACK이 늦게 도착할 뿐이다. 그래서 재전송하고나서 ACK이 도착하는 경우가 발생할 수도 있어서 위 두개의 차이를 구분하기 힘들다. 따라서 등장한 것이 재전송 될 때 RTTs 와 RTTd를 update하지 않기로 한다. 그것이 karn’s Algorithm이다.

(a)처럼 패킷이 타임아웃되어 재전송한 패킷의 ACK이 들어왔을 때, 재전송한 순간부터 RTT를 측정해야 하는가? (b)처럼 타임아웃 하자마자 재전송했는데 기존 ACK의 혼잡이 심해져서 타임아웃이 지나고 들어오는 경우가 있다. 이때 재전송된 패킷의 ACK이 없어졌다고 가정하면 sender입장에서는 (a) 케이스인지 (b) 케이스인지 구별할 수가 없다. 따라서 칸 알고리즘은 재전송에 대한 측정값(RTTs 와 RTTd)은 RTO에 사용하지 않고, 재전송이 아닌 패킷에 대한 ACK이 들어오면 그때부터 다시 측정하는 것이다.

시간이 지나 응답이 안와서 TIME-OUT 상태가 되었다. 그래서 이번에는 RTO를 2배로 키워서 재전송한다. RTO를 새로 해서 보내는 것이다. 그리고 그 시간 내에 응답이 오면 STOP을 한다. 그리고 칸의 알고리즘과 같이 RTTs, RTTd 값을 업데이트 하지 않는다. 그 이후에는 정상적으로 업데이트를 해서 RTO를 계산한다.

Maximum segment size

리시버가 받고 싶은 사이즈에 대해 요청할 때 쓰이는 것이 Maximun segment size이다(MSS). MSS는 연결 중간에 바꿀 수 없다. SYN / SYN+ACK 주고 받을 때에만 쓰일 수 있다.

헤더에는 64K byte만큼의 데이터가 전송 가능하다. 1초마다 64K byte만큼 쏠 수 있다. = 512Kbps = 0.5Mbps이다.

RTT가 0.1초(100ms)일 때 : 64kbyte/0.1s = 5120kbps = 5Mbps가 최대이다.

Window-scale-factor

이것이 Window-scale-factor option이다. Scale factor에 n이 들어있다면 rwnd * 2^n이다. 이것 역시 연결 셋업 과정에만 결정이 되고, 중간에는 바꿀 수 없다. SYN / SYN+ACK 과정에서 이미 결정이 되어야만 한다.

Maximum Throughput을 16배 또는 4배 늘리기 위해서는 TCP 헤더의 window-scale-factor 옵션의 n값을 써서 보내면 된다.

TimeStamp

출발시간에 대한 정보를 적어서 보낸다면 ACK을 보낼 때에도 그 해당 시간 정보를 같이 적어서 보낸다. 현재 시간에서 패켓 안 시간을 빼면 그것이 RTT이다. TimeStamp는 또 시퀀스 넘버가 한바퀴 돌아가더라도 다시 쓸 수 있다. 이렇게 두가지 역할을 한다.

우리가 쓰는 것은 Accumulative ACK이고 이 반대가 Selective ACK이다.

SACK Option

Culmulative ACK의 단점 중 하나는 ACK이 없어지면 이후에 없어진 packet들에 대한 설명을 할 수 없다. 이는 중간에 packet loss가 발생하면 ACK을 통해 없어진 packet부터 그 이후에 packet들까지 다시 재전송한다는 의미다.

2001~4000까지 못갔다. ACK을 2001만 보내는 것이 아니라 SACK은 옵션을 더해준다. 따라서 시작부터 받은 것 +1 블락과 8001부터 9000번 +1 블락 이 두개를 붙여서 보내준다. 그러면 받은 것 말고 못받은 것만 깔끔하게 받게 된다.

Cumulative ACK의 장점은 패킷 2개당 ACK 하나가 나가니까 ACK의 개수를 줄일 수 있다. 하지만 패킷 하나가 없어지면 그 패킷 이후에 없어진 패킷들에 대한 상황을 알 수 없다. 이런 단점을 보완하기 위해 SACK 옵션을 사용한다. 없어진 패킷들만 보낸다.

profile
블로그 이전했습니다

0개의 댓글