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 헤더

소스 포트번호
- 세그먼트(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. (주)생능출판사