호우동의 개발일지

Today :

article thumbnail

TCP 연결


TCP - 연결지향형(connection-oriented)

  • 두 프로세스 간의 데이터 전송 및 수신을 위해 핸드셰이크가 필요
    • 데이터 전송을 보장하는 파라미터들을 설정해야 함
      → 각자 어떤 사전 세그먼트들을 보낸다.

  • TCP 연결의 양단은 TCP 연결과 연관된 많은 TCP 상태 변수를 초기화한다.

TCP 관점에서의 연결

  • 두 통신 종단 시스템의 TCP에 존재하는 상태를 공유하는 논리적인 것
  • TCP 프로토콜은 오직 종단 시스템에서만 동작, 중간 네트워크 요소에서는 동작 X
    → 중간 네트워크 요소들은 TCP 연결 상태를 유지하지 않는다.

    • 중간 라우터들은 TCP 연결을 전혀 감지하지 못한다.
      • 중간 라우터는 연결은 보지 못하고, 데이터그램만 봄

  • TCP 연결은 한쪽 호스트에서의 소켓 연결과 다른 쪽 호스트에서의 소켓 연결의 집합으로 이뤄짐
    • 소켄 연결의 집합 → 버퍼, 변수, 프로세스에 대한 것
    • 버퍼와 변수는 호스트 간에 있는 네트워크 연결에는 할당하지 않는다.

TCP가 제공하는 서비스

  • TCP 연결은 전이중 서비스(full-duplex service)를 제공한다.
  • 호스트 A와 B의 프로세스 사이에 TCP 연결이 있는 경우
    • 애플리케이션 계층 데이터는 A에서 B로 가는 동시에, B에서 A로 갈 수 있다.

  • TCP 연결은 항상 단일 송신자와 수신자 사이의 점대점(point-to-point)이다.
    • TCP에서 단일 송신 동작으로는 멀티캐스팅(multicasting) 불가능
      • 멀티캐스팅 : 한 송신자가 여러 수신자에게 데이터를 전송하는 것

 


TCP 연결 과정

  • 가정
    • 한 호스트에서 동작하는 프로세스가 다른 호스트의 프로세스와 연결 초기화를 원함
    • 클라이언트 프로세스(client process) : 연결을 초기화하는 프로세스
    • 서버 프로세스 : 반대편의 프로세스

과정

  1. 클라이언트 애플리케이션 프로세스는 서버 프로세스 연결 설정을 TCP 클라이언트에게 알린다.
    • 파이썬 → clientSocket.connect((serverName, serverPort))
      • serverName : 서버 이름
      • serverPort : 서버 프로세스를 식별

  2. 클라이언트의 트랜스포트 계층은 서버의 TCP와의 TCP 연결 설정을 진행
    • 세 방향 핸드셰이크(three-way handshake)를 진행
      1. 클라이언트가 특별한 TCP 세그먼트를 서버에게 보낸다.
      2. 서버는 두 번째 특별한 TCP 세그먼트로 응답한다.
      3. 마지막으로, 클라이언트가 세 번째 특별한 세그먼트로 다시 응답

    • 세 방향 핸드셰이크에서 첫 번째와 두 번째 세그먼트에는 페이로드가 없다.
      → 애플리케이션 계층 데이터가 없다는 뜻
      • 세 번째 세그먼트는 페이로드를 포함할 수 있다.

 


클라이언트 → 서버 프로세스로의 데이터 송신

  • 클라이언트 프로세스는 소켓을 통해 데이터의 스트림을 전달
  • 데이터가 관문을 통해 전달되면, 데이터는 클라이언트에 동작하는 TCP에 맡겨짐

송신 버퍼

TCP 송신 버퍼와 수신 버퍼
TCP 송신 버퍼와 수신 버퍼

  • TCP는 연결의 송신 버퍼(send buffer)로 데이터를 보낸다.
    • 송신 버퍼 : 세 방향 핸드셰이크 동안 준비된 버퍼 중의 하나
    • 때때로, TCP는 송신 버퍼에서 데이터 묶음을 만들어서 네트워크로 보낸다.
    • 연결의 양 끝단에는 송신 버퍼수신 버퍼를 가지고 있음

MSS와 MTU

  • 세그먼트로 담을 수 있는 최대 데이터 양은 최대 세그먼트 크기(MSS)로 제한됨
    • MSS : 로컬 송신 호스트에 의해 전송될 수 있는 최대 전송 단위(MTU)에 의해 결정됨
      • MTU : 전송될 수 있는 가장 큰 링크 계층 프레임의 길이

  • MSS는 TCP 세그먼트 안에 있는 애플리케이션 계층 데이터의 최대 크기
    • TCP 세그먼트 자체의 최대 크기를 뜻하는 것이 아님

  • 이후, TCP 세그먼트와 TCP/IP 헤더 길이가 단일 링크 계층 프레임에 딱 맞도록 정해짐
    • 이때의 세그먼트는 IP 데이터그램 안에 캡슐화됐을 때를 뜻한다.
    • TCP/IP 헤더 길이 → 통상 40바이트
    • 이더넷과 PPP 링크 계층 프로토콜 → 1500 Bytes의 MTU를 가짐
      → 따라서, MSS의 일반적인 값은 1460 Bytes라고함

TCP 세그먼트의 수신

  • TCP 헤더와 클라이언트 데이터를 하나로 짝지어 TCP 세그먼트를 구성
  • 세그먼트는 네트워크 계층에 전달
    → 네트워크 계층 IP 데이터그램 안에 각각 캡슐화됨

  • TCP가 상대에게서 세그먼트를 수신한 경우
    1. TCP 연결의 수신 버퍼에 세그먼트 데이터들이 위치하게 됨
    2. 애플리케이션은 수신 버퍼로부터 데이터의 스트림을 읽음

 

 


TCP 세그먼트 구조

  • TCP 세그먼트는 헤더 필드데이터 필드로 구성되어 있음


데이터 필드

  • 데이터 필드에는 애플리케이션 데이터의 일정량을 담는다.
    • MSS가 세그먼트 데이터 필드의 크기를 제한

  • TCP가 큰 파일을 전송하는 경우 → MSS 크기로 파일을 분절하여 전송
  • 대화식 애플리케이션은 MSS보다 작은 양의 데이터를 전송하는 경우가 많음
    • 텔넷, ssh→
      • TCP 세그먼트 데이터 필드 = 1 Byte
      • TCP 헤더 = 20 Bytes

 


TCP 세그먼트 구조 분석

세그먼트 구조

헤더

  • 출발지/목적지 포트 번호 : 상위 계층 애플리케이션으로부터 다중화와 역다중화를 하는 데 사용
  • 체크섬 필드(checksum field) : 오류 검출
  • 순서/확인응답 번호 필드(sequence/acknowledgement number field)(32 bits)
    • 신뢰적인 데이터 전송 서비스 구현에서 TCP 송/수신자에 의해 사용

  • 수신 윈도(receive window) 필드(16 bits) : 흐름 제어에 사용
    • 수신자가 받아들이려는 바이트의 크기를 나타내는 데 사용

  • 헤더 길이 필드(header length field)(4bit) : 32비트 워드 단위로 TCP 헤더 길이를 나타냄
    • TCP 헤더는 TCP 옵션 필드 때문에 가변적인 길이가 될 수 있다.
      • 일반적으로 옵션 필드는 TCP의 길이가 기본적으로 20바이트가 되도록 비어있음

  • 옵션 필드(option filed) : 송/수신자가 MSS를 협상하거나 윈도 확장 요소로 이용
    • 윈도 확장하는 이유 → 고속 네트워크에서 사용하기 위해
    • 타임스탬프 옵션 또한 정의됨

  • 플래그 필드(flag field)(6 bits) :
    • ACK 비트 : 확인응답 필드에 있는 값이 유용함을 가리키는 데 사용
      • TCP 세그먼트는 성공적으로 수신된 세그먼트에 대한 확인 응답을 포함한다.

    • RST, SYN, FIN 비트 : 연결 설정과 해제에 사용
    • PSH 비트 설정 : 수신자가 데이터를 상위 계층에 즉시 전달해야 함을 가리킴
      • 실제 사용되진 않음

    • URG 비트 : 이 세그먼트에서 송신 측 상위 계층 개체가 ‘긴급’으로 표시하는 데이터임을 가리킴
      • 긴급 데이터의 마지막 바이트의 위치는 16비트의 긴급 데이터 포인터 필드가 가리킴
      • TCP는 긴급 데이터가 존재할 때 수신 측 상위 개체에게 통지해야 하고,
        긴급 데이터의 끝에 대한 포인터를 전달한다.
      • URG 비트와 긴급 데이터 포인터 필드는 실제 사용되진 않음