Ch 4. TCP(1) - TCP 헤더, 타이머


TCP(Transmission Control Protocol)

  • 전송 제어 프로토콜의 약자
  • IP를 통해 확인된 목적지 주소로 데이터를 전송하는 프로토콜로서 전송 계층(4계층)의 기능을 수행
  • 두 호스트 간에 전송되는 데이터와 메시지의 형식을 정의함

TCP의 특징

  • 연결형 : IP계층 위에 가상의 회선을 설정하여 종단간 데이터 송/수신 서비스를 제공
  • 신뢰성 : 데이터 송/수신 확인을 통한 신뢰성있는 통신 서비스 제공 (ACK 필드)
  • 흐름 제어 : 송/수신측의 데이터 처리 속도 차이를 해결하기 위한 방법, 처리할 수 있는 범위 내에서 데이터를 보내도록 제어 (슬라이딩 윈도우, 슬로우 스타트)
  • 혼잡 제어 : 송신측의 데이터 전달과 네트워크의 데이터 처리 속도 차이를 해결하기 위한 방법, 혼잡 현상을 방지하거나 제어 (혼잡 회피)
  • 스트림 통신 : 데이터를 바이트 단위로 나누어 전송(버퍼 사용)

포트(Port)

  • 호스트 내의 프로세스가 통신을 수행하기 위해 할당 받는 고유 번호
  • 데이터 링크 계층(2계층)의 MAC 주소, 네트워크 계층 (3계층)의 IP 주소와 같이 전송 계층(4계층)에서 사용하는 식별 번호
  • 포트 번호는 16비트로 이루어져 있으며 번호의 범위에 따라 사용 목적이 나뉘어져 있음
    • 0 ~ 1023번 : 잘 알려진 포트(well-known port), HTTP(80), FTP(20)와 같은 포트로 특정한 쓰임새를 위해 IANA에서 할당한 TCP, UDP포트
    • 1024 ~ 49151번: 등록된 포트(registered port), 기업이나 사업자들을 위해 IANA에서 할당한 포트
    • 49152 ~ 65535번: 동적 포트(dynamic port), 일반 사용자들이 사용할 수 있는 포트
  • 포트 번호는 IP주소 뒤에 콜론으로 표기됨 (127.0.0.1:61000)

TCP 소켓

  • TCP/IP 통신 인터페이스
  • 두 프로세스의 소켓은 프로토콜, 송신자 IP주소, 송신자 프로세스 번호, 수신자 IP 주소, 수신자 프로세스 번호로 식별

TCP 헤더

소스 포트번호

  • 세그먼트(segment)를 전송하는 응용 프로그램의 포트번호

목적지 포트번호

  • 세그먼트를 수신하는 응용 프로그램의 포트번호

순서번호(SEQuence number)

  • 데이터 스트림의 순서를 구분
  • 32비트의 부호 없는 번호
  • $2^{32}-1$의 값이 초과되면 다시 0부터 시작(Overflow)

확인 응답번호(ACKnowledgement sequence number)

  • 다음 세그먼트로 받고자 하는 순서 번호를 나타냄
  • 정상적으로 수신된 세그먼트에 대하여 ACK필드 값은 수신된 SEQ 필드 값 중 가장 큰 SEQ 값+1의 값을 갖는다.

헤더 길이

  • 4바이트 단위로 기술됨, 최대 길이는 60바이트(필드 값 15)

플래그 비트

  • URG : 긴급 포인터 존재
  • ACK : 확인 응답번호 존재
  • PSH : 데이터를 가능한 빨리 응용 계층으로 보내야 함을 표시
  • RST : 연결을 재설정
  • SYN : 송신측 응용 프로그램의 연결의 초기화를 위해 순서번호를 동기화
  • FIN : 송신측 응용 프로그램의 연결 해제

윈도우 크기(Window size)

  • 흐름 제어를 위해 사용
  • 수신 가능한 데이터의 양을 바이트 단위로 알림
  • 16비트로 표현되며 최대 값은 $2^{16}-1 = 65,535$바이트
  • 옵션 필드의 스케일 펙터를 이용하여 더 큰 윈도우 크기 값을 가질 수 있음

체크섬

  • TCP 헤더와 데이터의 에러를 검출
  • IPv4 프로토콜 이용시 체크섬 검사는 총 2번 수행됨(IP계층, TCP 계층)

긴급포인터(URGment pointer)

  • 긴급 데이터의 마지막 위치를 포인터로 저장
  • 긴급 모드로 받은 수신 프로그램은 긴급 포인터를 통해 데이터로 빠른 접근 가능

TCP헤더 옵션

옵션의 끝(End of Option)

  • 코드 값: 0x00
  • 마지막 옵션임을 나타냄

무작동(NO-OPeration)

  • 코드 값: 0x01
  • TCP헤더를 4byte단위로 나타내기 위해 옵션들 사이에 한 바이트로 존재

최대 세그먼트 크기(Maximum Segment Size)

  • 코드 값: 0x02
  • 수신할 수 있는 가장 큰 패킷의 크기를 정의, TCP헤더를 제외한 TCP데이터 크기의 최대 값을 바이트 단위로 표현함
  • 16비트로 표현되며 최대 값은 65,535바이트

윈도우 스케일 펙터(Window Scale: WSCALE)

  • TCP 헤더에서 윈도우 크기는 16비트로 65,535바이트로 제한되어 있음(이는 고속 네트워크에서 처리량을 최대화 하기에는 부족함)
  • 스케일 펙터를 두어 윈도우 크기를 2배씩 증가시킬 수 있음
  • 새로운 윈도우 크기 = 기본 헤더에 정의된 윈도우 크기$\times 2^{윈도우 스케일 펙터}$

타임스탬프(Timestamp)

  • 신뢰성 있는 데이터의 전송을 위해 누락된 패킷의 누락을 확인할 수 있어야함
  • 타이머를 설정하여 타이머 내에 확인응답을 받지 못한 패킷은 재전송됨 (패킷의 재전송)
  • 타이머의 적절한 시간 설정을 위해 패킷의 왕복시간인 RTT(Round-Trip Time)의 측정이 필요
  • 타임스탬프 옵션은 코드와 길이 1바이트, 타임 스탬프 값과 타임 스탬프 에코 응답 4바이트로 총 10바이트 크기
  • 송신 측은 전송 시의 시간을 타임스탬프 값에 채움
  • 수신 측은 확인 응답 전송 시 타임 스탬프 에코 응답 필드에 원래의 타임스탬프 값을 넣어 전송
  • 확인 응답 메시지를 수신한 송신측은 현재의 시간과 타임스탬프 에코 응답에 기록된 시간의 차로써 구함 (RTT측정)

TCP 타이머와 재전송

  • TCP 송신 측은 수신 측으로부터 긍정 확인 응답만을 받음
  • 세그먼트가 손실되거나 손상되었을 경우 이를 확인할 방식이 필요
  • 재전송 타이머를 설정하여 타이머가 종료되면 세그먼트가 손실되거나 손상되었음을 가정하고 재전송
  • 네트워크 상황이 혼잡하거나 목적지까지의 경로가 길 경우 TCP 세그먼트를 전송하고 확인 응답(ACK)를 받기까지 긴 시간이 걸릴 수 있음.
  • 적응적(adaptive) 재전송 알고리즘을 사용하여 재전송 타이머의 값을 설정

RTT(Round Trip Time) 측정

  • 특정 세그먼트를 전송한 시간과 해당 세그먼트에 대한 확인 응답이 도착한 시간 차로 측정
  • 재전송 타이머는 적응적으로 재전송 타임아웃 시간을 결정하기 위해 지속적인 RTT 측정을 수행
  • RTT는 매우 가변적이므로 SRTT(Smoothed Round Trip Time)값을 이용
  • SRTT를 기초로 하여 재전송 타임아웃인 RTO(Retransmission TimeOut)를 설정

Karn의 알고리즘

  • RTT 계산은 세그먼트 재전송으로 인해 문제가 발생할 수 있음
  • 재전송 시 동일한 두개의 세그먼트를 보냈기 때문에 수신된 확인응답 세그먼트가 어떤 세그먼트에 대한 것인지 판단하기 어려움
  • 재전송 타이머가 종료되고 재전송을 수행한 경우에는 RTT 계산을 수행하지 않고 RTO 값만을 증가

TCP Persist 타이머

  • 수신측으로부터 0의 윈도우 크기를 수신하면 수신측 버퍼에 여유가 생겨 윈도우 크기를 새로 전송할 때까지 송신측의 전송이 중단
  • 수신측으로부터 윈도우 크기를 나타내는 확인응답 세그먼트가 손실될 경우 송신측은 윈도우 크기가 갱신되지 않아 송신하지 않고 계속하여 데이터의 송/수신은 이루어지지 않음
  • TCP 송신측은 윈도우 크기가 0인 세그먼트를 수신하면 Persist 타이머를 시작
  • Persist타이머가 타임아웃 되면 1바이트로 이루어진 탐색(probe) 세그먼트를 주기적으로 송신하여 수신측 윈도우 크기를 확인

TCP Keepalive타이머

  • 일정 기간동안 데이터를 전송하지 않는 연결의 해제를 위한 TCP keepalive 데이터를 사용
    • 연결된 후 클라이언트의 중지에도 FIN 세그먼트가 없다면 서버 측은 연결을 유지함
  • 유후 연결을 감지하기 위해 TCP는 keepalive 타이머를 사용하고 타이머 종료마다 탐색 세그먼트 전송
  • 탐색 세그먼트에도 응답이 없는 경우 서버는 TCP 연결을 종료

TCP Time-waited 타이머

  • TCP 연결 종료 세그먼트의 송/수신시에 즉시 TCP 연결을 종료한 경우 지연된 잔여 세그먼트에 의하여 이후 생성된 연결에 영향이 미칠 수 있음
  • TCP 연결 종료 세그먼트를 송/수신시에 완전히 종료하지 않고 Time-waited 타이머를 설정
  • Time-waited 타이머 기간동안 연결을 유지하여 지연된 세그먼트를 처리
  • Time-waited 타이머는 보통 세그먼트의 예상 생존시간을 두배로 설정

출처: 정진욱, 김현철 공저. “TCP/IP와 인터넷”, pp 194-233. 2004. (주)생능출판사

댓글