일상 메모장

TCP timers (Persistent, Keep alive, Time wait) 본문

Kernel TCP IP

TCP timers (Persistent, Keep alive, Time wait)

핸드오버 2019. 12. 27. 09:06

Persistent timer

  1. Persistent timer는 Receive window size 가 0일때 데드락을 방지하기 위한 timer 입니다.
  2. 수신자는 자신의 receive window size를 ACK와 함께 전송하는데, 만약 수신자의 receive window 사이즈가
    0라면 송신자는 persistent timer가 동작하게 됩니다.
    (예를들어 수신자의 user land에서 recv()함수를 호출하지 않게되면 어느순간 receive window 사이즈가 꽉차서
    0가 될것입니다.)
  3. Persistent timer가 expire되면 송신자는 probe라고 부르는 특별한 세그먼트를 수신자에게 보냅니다.
    이 세그먼트에는 1바이트의 새로운 데이터만 포함되어 있는데, 주기적으로 persistent timer에 의해서
    probe 세그먼트를 보내고 이에대한 수신자의 ACK로 receive window size를 체크합니다.
  4. 수신자는 probe 세그먼트를 받으면 자신의 receive window size를 ACK와 함께 보내는데, 주기적으로 persistent timer에 의해서 전송된 probe 세그먼트에 수신자는 계속 0을 반환하다가 receive window size에 여유가 생기게 됨을 확인하면, 다시 송신자는 데이터 전송을 재개하게 됩니다.

Keep Alive timer

  1. 이미 connection 된 상태에서 두 연결간의 오랜기간동안 휴지상태에(Long Idle time) 있지 않기위해 사용한다.
  2. 만약 TCP 연결이 되고, 데이터를 정상적으로 주고받다가 어느순간 client가 정상적인 종료를 하지않고 Crash 나게 되면, server는 이 연결이 비정상 종료된지 모르고 계속해서 connection을 유지할것입니다.
    이런 상황을 방지하기 위해서 keep alive timer를 사용합니다.
  3. 서버가 클라이언트로 부터 어떠한 데이터를 받을때마다 이 타이머는 초기화 됩니다. 일반적으로 linux 에서는 이 time out 시간이 2시간인데, 2시간동안 클라이언트로부터 어떠한 데이터도 받지 못하면 Probe 세그먼트를 전송합니다.
  4. 각 probe 세그먼트가 75초 간격으로 10개를 보내는데 이에대한 응답이 없으면, client가 종료된것으로 가정하고
    연결을 종료합니다.

Time wait timer

  1. 이 타이머는 TCP 연결 종료중에 사용됩니다. 먼저 연결을 종료한(FIN을 먼저 보낸)쪽에 이 타이머가 생기는데, Timer는 두번째 FIN에 대한 마지막 ACK를 전송하고, 연결을 종료한후 TIME_WAIT상태에서
    TIME_WAIT Timer가 시작됩니다. (아래 그림 참조)
  2. TCP 연결이 종료된 후에도 아직 전송중인 데이터가 도착할수도 있는데, 중복(Retransmission) 또는 지연된 패킷을 폐기하기 위해 사용합니다.
  3. 이 Timer의 기간은 2 * MSL기간동안 유지되는데, MSL 이란 Max Segment Lifetime이라고 해서 세그먼트가 최대로 네트워크상에 돌아다닐수 있는 시간입니다. 1MSL은 리눅스 상에서 최대 1분으로 2*MSL이기 때문에 최대 2분동안
    TIME_WAIT상태에로 대기하고 Close하게 됩니다

 

오늘 포스팅은 여기까지 하겠습니다. 읽어주셔서 감사합니다~

'Kernel TCP IP' 카테고리의 다른 글

TCP header (+ TCP 옵션)  (0) 2019.12.31
sk_buff 에서 Mac header, IP v4 and v6 header, TCP header 파싱  (0) 2019.12.28
TCP timer (Retransmission timer)  (0) 2019.12.26
TCP sliding window 개념  (0) 2019.12.21
struct sk_buff 관련 함수  (1) 2019.12.20