Without a Break

TCP: Transmission Control Protocol 본문

Network/네트워크보안과프로그래밍

TCP: Transmission Control Protocol

와븨 2022. 9. 30. 01:40

TCP가 제공하는 서비스

TCP 서비스

  • UDP와 같은 네트워크 계층(IP) 이용
  • UDP와는 완전히 다른 서비스를 응용 계층에 제공
  • 연결지향의 신뢰성있는 바이트스트림 서비스를 제공 => "TCP provides a connection-oriented, reliable, byte stream service"

1. 신뢰성 서비스

1) 정보단위인 세그먼트인 IP로 전송

  • 응용이 보내는 데이터는 TCP가 전송하기 적합한 크기로 나뉘어짐 (반면, UDP는 각 응용이 UDP 데이터그램을 적절한 크기로 만들어 줌)
  • IP 데이터그램 = IP 헤더 + TCP 세그먼트(TCP 헤더+TCP데이터)

2)TCP는 세그먼트를 보낼 때마다 타이머를 설정

  • 수신측으로부터 확인 응답 (ACK) 메세지를 기다림
  • 확인 응답이 오지 않을 경우 세그먼트를 재전송

3) TCP가 연결의 상대편으로부터 데이터를 받으면 확인응답을 보냄

  • 보통 짧은 시간동안(<1초) 지연된 후에 보내짐

4) end-to-end checksum: TCP 헤더와 데이터에 검사합(checksum)을 함

  • 데이터가 전송 중에 변화되었는지 검출하는 것이 목적
  • 오류가 난 세그먼트는 버리고 확인 응답을 보내지 않음 (송신자의 타임아웃과 재전송을 기다림)

5)TCP 세그먼트는 IP 데이터그램 형태로 전송되므로, 순서를 지키지 않고 수신측에 도착 가능

  • 수신측 TCP는 필요 시 데이터를 재정렬해, 정확한 순서대로 응용에 전달

6) IP는 라우팅 과정에서 중복이 발생해도 이를 허용하나, 수신측 TCP는 중복된 데이터를 반드시 폐기

7) TCP는 흐름 제어(flow control) 제공

  • TCP 연결의 각 종단은 유한한 버퍼를 가짐
  • 수신측 TCP는 버퍼용량을 초과하지 않는 범위의 데이터만 버퍼에 저장 => 송신측 TCP는 수신측 TCP의 빈 버퍼 공간만큼만 보내도록 제어)

 

2. 바이트 스트림 서비스

  • TCP 연결을 통해서 양방향의 8-bit byte stream이 교환 => 응용에 full-duplex 서비스 제공해 입력 스트림과 출력 스트림이 독립됨
  • TCP는 레코드 구분자 삽입 기능을 전혀 지원하지 않음 => 응용은 메세지를 구분하는 단위인 레코드 구분자가 필요시, 알아서 삽입해야 함
  • TCP 바이트에 대한 해석을 전혀 하지 않음

 

 

연결-지향(connection-oriented) 서비스의 의미

  • 두 응용 프로세스(클라이언트, 서버)가 데이터를 교환 하기 전에 서로 TCP 연결을 확립함을 의미
  • Three-way handshake

TCP 헤더 필드

Port number 필드

1) TCP 세그먼트를 송신하고 수신하는 응용을 구분하기 위해서 사용

 

2) IP 주소 하나와 포트 번호 하나의 조합을 소켓이라고 함

  • socket pair : 클라이언트와 서버의 두 소켓을 묶어서 부르는 말
  • socket pair는 인터넷 상의 TCP 연결을 유일하게 식별하는데 사용 가능한 식별자

 

Sequence number 필드

  • 송신 측의 TCP로부터 수신 측의 TCP로 간느 데이터 스트림의 바이트를 구분하기 위해 매 바이트에 붙여진 번호
  • 32비트 부호 없는 번호로서, 0부터 2^32-1을 초과하면 다시 0부터 시작
  • 새로운 연결을 확립하는 과정에서, 세그먼트에 SYN 플래그가 설정될 경우, 순서 번호 필드에는 호스트가 연결에 선택한 초기 순서 번호(ISN)을 기재 (SYN 플래그는 1바이트를 소모한다고 가정)

 

확인 응답 번호 (acknowledgement number; ACK number) 필드

  • 수신한 마지막 바이트의 순서 번호 +1을 기재 => 즉, 다음 수신할 첫 바이트의 순서 번호를 나타냄
  • 이 필드는 ACK 플래그가 설정 되어 있을 때만 유효 (연결이 설립된 이후엔 계속 ACK 플래그가 설정됨)

 

TCP에서 순서 번호와 확인 응답 번호의 특징

1) TCP는 각 방향으로 데이터를 흘려보내는 full-duplex 서비스를 응용에 제공함

  • 따라서, ㅇ녀결의 각 종단 호스트는 각 방향에 대한 순서 번호를 저장하고 관리해야 함

2) tcp는 Selective ACK(SACK)나 Negative ACK(NACK)를 지원하지 않는 슬라이딩 윈도우 프로토콜의 일종

  • 확인 응답 번호 필드의 의미 상, 먼저 도착한 세그먼트나 손상된 세그먼트에 대한 정보를 알릴 수도 없음
  • SACK의 경우 TCP 옵션으로 추후 추가됨

3) Cumulative ACK : 어디까지 전송이 완료되었는지 송신자에게 알림

 

Checksum 필드

  • TCP header와 TCP data 모두에 대한 checksum
  • 필수 필드로서 송신 측에서 계산, 저장되고 수신 측에서 검사
  • UDP checksum과 같은 의사 헤더를 이용하여 계산

 

긴급 포인터 필드

  • (데이터 필드 앞부분에 삽입된) 긴급 데이터의 크기를 나타냄
  • URG 플래그가 설정되어 있을 때만 유효
  • 송신 측이 상대편에게 긴급한 데이터를 보낼 수 있음 (순서 번호에 계산되지 않음)
  • 요즘은 거의 안 쓰임

 

 

* TCP 사양은 RFC793