일상 메모장

TCP sliding window 개념 본문

Kernel TCP IP

TCP sliding window 개념

핸드오버 2019. 12. 21. 07:00

TCP에는 sliding window 라는 용어를 사용하는데, 이는 TCP가 stream data 이고 이를 유연하게 처리하기 위해서,

각 Peer 마다 TCP session 이 생성되면 send buffer 와 recv buffer를 생성합니다.

네트워크의 특성상 전송된 패킷은 전송 도중에 손실 되거나, packet의 순서가 바뀔수 있는데,

이를 수신자 입장에서는 recv buffer를 통해서 손실된 패킷은 재전송을 유도하고 순서가 바뀌어서 도착한 패킷은

순서를 원래대로 돌리기 위해서 sequence number (추후 sequence number에 대해서 자세히 다루도록 하겠습니다)

를 사용합니다.

 

아래 그림은 send buffer 와 recv buffer를 표현한 그림입니다.

 

send buffer (send window)

send buffer 는 데이터를 상대방에게 보낼때 데이터 관리를 위해서 사용되는 개념입니다.

  • write_seq
    • user space에서 send() function 을 사용해서 데이터를 전송하면 send buffer의
      write_seq이후에 데이터를 추가하고 write_seq 를 send한 양만큼 증가시킵니다.

      (write_seq += send_data_len)

  • snd_una
    • 보낸 데이터가 정상적으로 전송이 되면 수신자가 정상적으로 수신한 sequence number 를 ACK로 전송하는데,이 수신된 ACK sequence number 를 기반으로 snd_una 변수를 증가시키고, 이미 상대방에게 전송되었다는게 검증되었으니snd_una 아래의 user data는 send buffer에서 삭제 합니다.

  • snd_nxt
    • snd_nxt 는 수신자에게 데이터를 실제로 보내야 하는 sequence number(offset) 입니다. 데이터를 실제로 보내게되면 이 값이 증가합니다.

 

recv buffer (recv window)

recv buffer 는 상대방으로부터 수신한 데이터를 관리하기 위한 버퍼입니다.

  • rcv_wup
    • rcv_wup 은 sequence number 가 빠짐없이 정상적으로 전송이 되면 마지막으로 받은 sequence number를 ACK 로 전송하는이 이 값을 나타냅니다. 이 이전까지의 데이터는 모두 정상적으로 받았다는것을 나타냅니다.
      이외 selective ACK라고 하여 소위 손실된 (중간중간 이빨빠진) sequnce number도 전송하는데
      이는 추후 다시 다루도록 하겠습니다.

  • copied_seq
    • copied_seq는 위의 rcv_wup에서 설명한 바와 같이 이미 user data를 정상적으로 받은 상태로 buffer에 쌓여있는 중이고, user level에서 recv() 함수를 호출하게 되면 copied_seq 부터 요청한 만큼 데이터를 user space로 보내고 recv buffer에서 삭제합니다. 만약 user space에서 데이터가 계속 도착하고 있는데도 불구하고, recv()를 호출하지 않는다면 어느순간 recv buffer는 꽉 차게 됩니다.

  • rcv_nxt
    • 데이터가 도착하면 다음으로 수신받을 sequence number 이며 정상적으로 데이터가 도착했을 경우에는, 이 이후에 데이터를 저장하고 ACK packet에 sequence number를 보냅니다. rcv_wup에서 말했듯이 예상하던 sequence number 가 아니더라도 recv window 에 저장은 하고 (이빨이 빠진상태로) Selective ACK로 현재 도착하지 않은 패킷(이빨빠진)의 정보를 보내줍니다.