전송 계층과 프로토콜(TCP/UDP)

박정빈·2024년 3월 7일

네트워크와 통신

목록 보기
9/10

전송 계층의 기능

전송 계층은 데이터 링크 계층과 유사하다. 그러나 데이터 링크 계층은 물리적 전송 선로로 연결된 노드 사이의 데이터 전송을 담당하지만, 전송 계층은 네트워크 끝의 호스트 사이의 논리적 선로를 담당한다.

따라서 데이터 링크 계층은 네트워크 계층의 중개 기능이 필요 없고,
전송 계층은 중개 기능이 필요하다.
전송 계층과 데이터 링크 계층

주요 기능

흐름 제어

데이터 링크 계층에서도 흐름 제어 기능을 수행하지만, 호스트 사이의 논리적 연결 수가 많으므로, 다른 버퍼 관리 방법이 필요하다.

수신 능력보다 빨리 데이터를 보내면, 데이터를 분실하게 되고, 재전송이 발생하므로 전송 효율이 떨어진다. 이론적으로 흐름 제어 기능은 수신자가 슬라이딩 윈도우 프로토콜의 윈도우 하단 값을 조정한다. 즉, 송신자가 보낼 수 있는 패킷의 한계를 지정하는 것이다.

오류 제어

데이터 변형이나 데이터 분실이 있을때, 데이터 재전송에 의한 오류 제어가 진행된다.
전송 계층의 오류는 선로의 오류 보다 각 계층의 소프트웨어가 동작하는 과정에서 데이터를 분실하는 경우가 많다. 예를 들어 네트워크 계층에서 라우팅 실패이다.

분할과 병합

상위 계층의 데이터를 전송 계층에서 처리할 수 있는 크기로 분할해야하며, 수신한 데이터를 병합하여 상위 계층에 전달해야한다.

서비스 프리미티브

전송 계층사용자가 전송 계층 서비스를 사용하기 위한 인터페이스

네트워크 계층에서 제공하는 서비스는 일반적으로 비신뢰성 비연결형 서비스 프리미티브가 정의된다.
전송 계층에서는 비연결형 서비스 뿐만 아니라, 연결형 서비스도 제공한다.

전송 계층 설계 시 고려사항

주소 표현

통신을 하기 위해 주소가 필요하다. 전송 계층의 주소를 보통
TSAP(Transport Service Access Point) 라고 한다.

주소는 구조적, 비구조적으로 표현될 수 있다.
구조적 표현은 계층적 필드로 구분하는 것이다.
대한민국:서울:국민대:소프트웨어학과:424호:김영호:50(포트번호)
이렇게 표현되는 주소는 상하 관계가 명확하여 직관적으로 위치를 유추할 수 있다.
비구조적 표현은 주소 만 해석해서는 컴퓨터의 논리적 위치를 파악하기 어렵다. 주소는 중요 정보를 포함하도록 설계되기에 비구조적 표현은 많지 않다.

211.223.201.30 과 같은 IP주소는 네트워크와 호스트의 계층적 특성은 있지만, 위치 정보와 관련해서는 비구조적이다.
www.korea.co.kr과 같은 도메인 주소는 구조적인 위치 정보를 제공한다.

멀티 플렉싱

전송 계층 연결에서 전송 데이터 단위인 TPDU(Transport Protocol Data Unit)의 목적지가 동일한 호스트면 이들을 하나의 가상 회선에 실어 전송하는 것이다.

멀티플렉싱(Multiplexing)의 종류는 상방향, 하방향 두 가지다.
멀티플렉싱

  • 상방향 멀티플렉싱
    여러 전송 계층 연결의 송수신 호스트의 경로가 같으면, 하나의 네트워크 연결에 묶어 전송할 수 있다. 네트워크 계층의 가상 회선 연결의 개수를 줄일 수 있으므로 시간이 단축된다.
  • 하방향 멀티플렉싱
    하나의 연결 설정 포트에 다수의 가상 회선을 할당한다. 데이터의 특성에 따라 가상회선을 할당해서 효과적인(시간 포함) 통신이 가능하다. 예를 들어 영화 파일을 보낼때 영상,음성,자막등으로 구분해 성격에 맞는 가상회선을 할당할 수 있다.

연결 설정

전송 계층의 연결 설정은 최소 단계로 연결을 요청하는 Conn_Req와 연결 수락을 의미하는 Conn_Ack의 회신으로 완료된다.
TCP의 경우 3단계 설정(Three-Way Handshake)를 사용한다.
A 프로세스가 연결 설정 요청,B 프로세스는 자신의 초기 송신 번호를 포함한 응답, A프로세스는 B의 응답에 대한 응답과 데이터를 보내는 방식이다.

연결 해제

  • 일방적 연결 해제 절차 방식
    한 쪽 프로세스가 일방적으로 Disc_Req를 전송해 연결 종료를 선언한다. 현재 진행중이던 전송도 종료된다.
  • 점진적 연결 해제 절차 방식
    한 쪽 프로세스가 Disc_Req를 보내도 다른 프로세스는 종료되지 않는다. 연결을 완전히 종료하려면, 양쪽에서 Disc_Req를 전송해야한다.

TCP

TCP(Transport Control Protocol)은 IP프로토콜의 전송 계층 프로토콜이다. TCP의 주요 기능은 다음과 같다.

  • 연결형 서비스 제공
  • 전이중(Full Duplex)방식의 양방향 가상 회선 제공
  • 신뢰성있는 데이터 전송 보장
    TCP

TCP에서는 데이터를 세그먼트(Segment)라는 가변 크기 블록 단위로 분할해 전송한다. 블록 크기는 네트워크 부하 정도, 윈도우 크기 등의 영향을 받는다. TCP에서는 데이터의 바이트 개수를 순서 번호에 반영한다.

TCP 헤더

TCP 세그먼트는 헤더 구조로 시작하고 전송 데이터가 뒤따른다.
TCP Headers

  • Source Port / Destination Port (송신 포트 / 수신 포트)
    호스트 주소는 IP프로토콜에서 정의된 IP주소를 사용해 구분할 수 있고, 호스트의 프로세스는 포트 번호를 사용해 구분할 수 있다. TCP로 연결되는 가상 회선 양단의 네트워크 포트 주소다.

  • Sequence Number (순서 번호)
    송신자가 지정하는 순서 번호다. 세그먼트 바이트 수를 기준으로 증가한다. 즉, 전송 데이터의 각 바이트 마다 순서 번호가 존재한다. 32비트 필드로 표시해 2322^{32}개 를 표현할 수 있어서 쉽게 중복되지 않는다.
    최초 전송시는 임의의 순서번호를 선택하는데, 전송 연결에 끊어졌을때 순서 번호 혼선을 방지하기 위함이다.

  • Acknowledgement Number (응답 번호)
    수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용한다. ACK 플래그 비트가 지정된 경우에만 유효하며, 다음에 수신을 기대하는 데이터의 순서 번호를 표시해야한다.
    ACK응답을 받은 송신 프로세스는 응답 번호-1까지의 모든 데이터가 올바르게 전송되었음을 확인할 수 있다.
    연결 설정이나 해제처럼 데이터 세그먼트가 없는 경우에도 순서 번호가 1씩 증가한다.

  • Data Offset
    TCP 세그먼트가 시작되는 위치를 기준으로 데이터의 시작 위치를 나타낸다. 32비트 워드 단위로 표시되며, TCP 헤더의 크기가 된다.

  • Reserved
    예약 필드

  • Window
    슬라이딩 윈도우 프로토콜에서 수신 윈도우의 버퍼 크기를 지정하며, 수신할 수 있는 바이트 수를 표시한다. 버퍼가 넘쳐 수신할 수 없으면 이 필드 값을 0으로 지정한다.

  • Checksum
    헤더와 데이터의 변형 오류를 검출하려고 사용한다.
    IP 프로토콜의 오류 검출 알고리즘을 사용한다.

  • Urgent Pointer (긴급 포인터)
    긴급 데이터를 처리한다. URG 플래그 비트가 지정된 경우에만 유효하다.
    예를 들어 순서 번호가 2,000 긴급 포인터가 100 이면, 순서 번호 2,000 ~ 2,100번 데이터는 긴급 데이터로 전송 된다.

  • 플래그 비트
    필드 값이 1이면 의미를 갖는다.

    • URG
      Urgent Pointer 필드의 유효성을 나타낸다.
    • ACK
      Acknowledgment Number 필드의 유효성을 나타낸다.
      정상적인 피기배킹 방식의 양방향 통신 환경에서, 쉬지않고 데이터를 송수신 할 때, 첫 세그먼트를 제외한 모든 세그먼트의 ACK 비트가 1로 지정된다.
    • PSH
      현재 세그먼트의 데이터를 즉시 상위 계층에 전달하도록 지시한다.
      수신자에게서 PSH 응답 프레임이 도착하면,
      Acknowledgement Number 필드까지의 데이터가 수신자의 상위 계층에 전달 되었음을 알 수 있다.
    • RST
      연결의 리셋이나 유효하지 않은 세그먼트의 응답용으로 사용한다.
      도착하지 못한 세그먼트, 긍정 응답하지 않은 세그먼트는 연결이 재설정 되었을때 재전송되어야 한다.
    • SYN
      가상 회선 연결 과정에서 연결 설정 요구를 의미한다.
    • FIN
      연결을 종료하고 싶다는 의사 표시를 한다. 양쪽 프로세스 모두가 FIN 플래그를 전송해야 완료된다.

캡슐화

캡슐화

포트 번호

포트 번호는 TCP와 UDP가 상위 계층에 제공하는 주소 표현 방식이다. UNIX 환경에서는 소켓(Socket)으로 포트를 구현하므로 소켓 시스템 콜을 알아야한다.

인터넷 환경에서 많이 사용하는 네트워크 응용 서비스의 서버 프로세스에 할당된 포트 번호를 Well-knownn 포트라고 한다.

TCP와 UDP는 별도의 포트 주소 공간을 관리하므로 같은 포트 번호를 사용할 수 있다.

TCP의 데이터 전송

TCP는 전이중 방식의 양방향 통신을 지원하므로 두 프로세스가 동시에 데이터를 전송할 수 있다. 그리고 전송 데이터와 응답 데이터를 함께 전송하는 피기배킹 기능을 사용한다.

연결 설정

Three-Way Handshake 방식을 사용한다. (요청-응답-응답확인)

먼저 A프로세스가 SYN 플래그를 지정한 세그먼트를 전송해서 연결 설정을 요청한다.
B프로세스는 응답을 위해 SYN과 ACK 플래그를 지정한다. 응답 번호는 수신한 순서 번호+1 이다.
A프로세스는 응답을 받고 ACK 플래그를 지정한 세그먼트를 보내 연결을 확정한다. 이때부터 데이터도 같이 보낼 수 있다.

데이터 전송

데이터 전송 정상

순서 번호와 응답 번호의 조합은 전송되는 데이터의 양에 따라 조정된다.
예를 들어,
A프로세스가 순서 번호 11번부터 5바이트의 데이터를 전송하면,
(Seq=11,Ack=51,ACK,Data=5)
B프로세스는 순서 번호 51번 부터 10 바이트의 데이터를 전송한다.
(Seq=51,Ack=16,ACK,Data=10)
A프로세스는 데이터를 다 보내서 응답만 할 수도 있다.
(Seq=16,Ack=61,ACK)

흐름 제어는 Window필드를 사용할 수 있다. 예를 들어 송신자가 데이터를 1,000번 부터 보내고, 수신자로 부터 Window=300인 세그먼트를 받으면, 1,299번 까지 데이터를 연속으로 전송할 수 있고 그 다음 데이터는 응답이 도착했을때만 전송할 수 있다.

데이터 전송 오류

순서 번호가 같은 세그먼트가 도착하면 중복으로 간주해 데이터를 버리고,
중간의 순서 번호가 빠지면, 데이터 분실로 간주할 수 있다.
TCP는 부정 응답 기능인 NAK를 사용하지 않는다. 대신, 수신 응답 세그먼트가 기대와 가르면 부정응답으로 간주한다.

예를 들어, A프로세스가
(Seq=11,Data=10) (Seq=21,Data=10) (Seq=31,Data=10)
이렇게 세그먼트 세 개를 전송했지만, 마지막 세그먼트가 수신되지 않았다면, B프로세스는 응답 세그먼트를 (ACK=31,ACK) 로 보낼 것이다.
ACK=41을 받아야 정상이었다. A프로세스는 31~40번 데이터에 대한 긍정 응답을 받지 못한 것이기에 Timeout기능을 사용하여 데이터를 재전송한다.

연결 해제

연결 해제를 원하는 쪽에서 FIN 플래그를 지정한 세그먼트를 보낸다.
이 세그먼트를 받은 쪽은 본인이 원하는 만큼 송신(수신자는 FIN을 보냈지만 송신에 대한 응답을 계속 한다)을 마무리 한 후 FIN 플래그가 지정된 세그먼트를 보내 연결 종료에 동의한다.

UDP

UDP(User Dataagram Protocol)는 간단하고 빠른 전송이 가능하며 다음과 같은 특징이 있다.

  • 비연결형 서비스를 제공
  • 레더와 전송 데이터에 대한 체크서 기능 제공
  • Best Effort 전달 방식 지원
    UDP는 전송한 데이터 그램의 신뢰성을 보장하지 않는다. 하지만 처리 속도가 빨라 전송 시간에 민감한 응용 환경에서는 UDP를 사용하는 것이 유리하다.

UDP 헤더

UDP 헤더는 TCP 헤더보다 단순하여 프로토콜 오버헤드가 작다.
UDP Header

  • Source Port / Destination Port (송신 포트 / 수신 포트)
    IP 프로토콜의 IP 주소로 호스트를 구분하고, 포트 번호로 프로세스를 구분할 수 있다. UDP 포트 번호는 TCP 포트 번호와 독립적으로 관리되고 할당된다.
  • Length (길이)
    헤더를 포함한 데이터그램의 전체 크기다. 헤더의 크기가 8바이트 이므로 최솟값은 8이다.
  • Checksum
    헤더와 데이터에 대한 체크섬 값을 제공하여 수신자가 데이터그램 변형 오류를 감지할 수 있게 한다. TCP와 달리 UDP는 데이터 까지 체크섬을 계산한다. 하지만 체크섬 기능은 옵션이므로 필드 값이 0이면 송신자가 체크섬 계산을 하지 않았다는 의미가 되어, 수신 프로세스에서는 체크섬으로 오류 검출 기능을 수행하지 않는다.

데이터 전송

UDP는 비연결형 서비스를 이용하여 데이터그램을 전송한다. 데이터그램이 목적지 까지 도착하는 것을 보장하지 않으며 순서 변경이 일어나기도 한다. 또, 슬라이딩 윈도우 프로토콜과 같은 흐름제어 기능도 제공하지 않아 버퍼 오버플로우에 의한 데이터 분실 오류가 생길 수 있다.

UDP에서 데이터그램 분실 오류는 상위 계층 스스로 확인하는 기능을 수행하여 복구해야한다. UDP헤더에서 볼 수 있듯이 데이터 순서 번호 기능을 제공하지 않으므로 분실여부와 순서 변경 여부를 알 수 없다. 따라서, 응용프로그램에서 데이터 분실을 감지하려면 순서번호와 유사한 기능을 프로그램 내부에 구현해야한다.

0개의 댓글