DevOps/Network

[네트워크]Transport Layer(전송계층)

박한결 2021. 4. 28. 11:43

Transport Layer(전송 계층)

  • 서로 다른 호스트에서 실행되는 애플리케이션 프로세스 간의 논리적인 연결을 담당한다.
  • 전송 프로토콜(Transport protocol)은 end system에서 실행된다. 그래서 전송 계층을 논리적인 종단 간 전송 시스템(logical end-end transport system)라고 하기도 한다.
    • 송신 측: 애플리케이션 메시지를 세그먼트 형태로 만들어 네트워크 계층으로 보낸다.
    • 수신 측: 세그먼트를 메시지 형태로 만들어 애플리케이션 계층으로 보낸다.
  • 네트워크 계층과 전송 계층의 차이점
    • 네트워크 계층은 호스트 간의 논리적인 연결을 담당한다.
    • 전송 계층은 프로세스 간의 논리적인 연결을 담당한다.

전송 계층에서 주로 다루는 것

  • TCP(connection oriented transport): reliable, in-order delivery
  • UDP(connectionless transport): unreliable, unordered delivery
  • multiplexing/demultiplexing

2. Multiplexing/Demultiplexing(demux)

  • Multiplexing: 여러 소켓에서 데이터를 처리하고, 나중에 디멀티플렉싱에 사용될 전송 헤더를 추가한다.
  • Demultiplexing: 헤더 정보를 사용하여 수신된 세그먼트를 올바른 소켓으로 전달한다.

TCP 소켓은 src IP addr, src port #, dst IP addr, dst port #의 4-tuple로 식별된다. 그리고 demux는 적절한 소켓으로 보내기위해 이 네개의 값을 모두 사용한다.

3. Socket

<Socket>

소켓은 애플리케이션과 네트워크 사이의 인터페이스다. 애플리케이션이 소켓을 생성하고, 소켓의 타입이 통신 스타일을 결정한다.

일단 구성되면 애플리케이션은 네트워크 전송을 위해 소켓에 데이터를 전달할 수 있고, 다른 호스트가 네트워크를 통해 전송한 데이터를 소켓을 통해 받을 수 있다.

 

<SOCK_STREAM a.k.a. TCP, SOCK_DGRAM a.k.a. UDP>

 

<TCP three-way handshake, four-way handshake>

Three-way handshake는 TCP 프로토콜을 사용해서 통신을 하는 애플리케이션들이 데이터를 주고 받기 전에 서로 연결이 잘 되어있는지 확인을 하는 과정이다.

Four-way handshake는 three-way handshake로 확인한 연결을 끊기위해 필요한 과정이다.

<API>

  • socket: 소켓을 생성한다.
  • bind: 소켓을 로컬 IP 주소와 포트 번호로 바인딩한다.
  • listen: 소켓을 수동 상태로 전환(연결 시작 대신 연결 대기)한다.
  • accept: 연결을 받아들인다.

4. UDP(User Datagram Protocol)

  • Handshaking을 하지 않는다 → unreliable(연결이 잘 되었는지 확인하지 않음)
  • 최선을 다해도 최선의 결과가 나오지 않을 수 있는 전형적인 예시
  • 멀티미디어 스트리밍 애플리케이션, NDS, SNMP 등에 사용한다
  • UDP에서 안정적인(reliable) 전송을 하는 방법? → 애플리케이션 레이어에 reliability를 추가한다

5. TCP(Transmission Control Protocol)

<RDT: Reliable Data Transper>

  • RDA 1.0 → Bit error X, Packet loss X
  • RDT 2.0 →Bit error O, Packet loss X
    • checksum이 bit error를 감지한다. → Error Detection
    • RDT 2.1 → ACKs, NAKs와 같은 feedback message가 손상되면 receiver측에서 어떤 일이 일어났는지 알 수 없으므로 sender는 패킷을 다시 보낸다. Sender는 패킷에 sequence number를 추가하므로, receiver는 중복을 무시할 수 있다(seq# 0: 처음 전송, seq#1: 재전송).
    • RDT 2.2 → NAK 없이 구현하는 대신, receiver가 ACK 응답을 보낼 때 Seq#을 함께 보낸다. 예를들어 PCK 1을 전송하면 ACK 1을 받고록 설계하고, ACK가 1일 경우(제대로 데이터를 받은 경우) 다음 PCK을 전송하고 0이면 현재 PCK을 재전송한다.
  • RDT 3.0 → Bit error O, Packet loss O
    • Bit error는 RDT 2.x 버전에서 모두 해결했다.
    • Packet loss는 time out으로 해결한다.
  • Pipelined protocols: 한번에 여러개의 패킷을 보내는 것을 허용함
    • 대표적인 파이프라인 프로토콜의 형태에는 go-Back-N, selective Repeat이 있음

<TCP>

TCP의 핵심 기능에는 reliable data transfer, flow control, congestion control이 있다.

 

(1) TCP의 특징

  • point-to-point: one sender-one receiver
  • reliable, in-order byte stream
  • pipelined: TCP congestion and flow control set window size
  • full duplex data: 각 소켓은 sender/receiver의 역할을 모두 할 수 있다.
    • MSS: maximum segment size
  • connection-oriented: 데이터 교환 전에 handshaking은 sender, receiver의 상태를 초기화해준다.
  • flow controlled: sender는 애플리케이션에서 내려오는 메시지를 receiver의 속도에 맞춰서 보낸다.

(2) TCP timeout 값 설정

  • timeout은 데이터를 전송할 때 packet loss를 해결하는 용도로 쓰인다.
  • RTT(round trip time)보다는 길게 설정해야 한다
  • timeout 값이 너무 짧으면, packet loss가 아닌데도 과도하게 재전송을 하게 된다. → 불필요한 재전송
  • timeout 값이 너무 길면, loss에 대한 반응이 너무 느려지게 된다.

<Congestion control>

  • congestion: 네트워크가 처리할 수 없는 양의 데이터가 너무 빠르게 전송되는 것
  • TCP congestion control
    • 기본적으로 ACK가 network connection이 어떤지 알 수 있는 이유일한 방법이다.
    • 접근: sender의 전송 속도(창 크기)를 높이고, 손실이 발생할 때까지 사용 가능한 대역폭을 찾는다.
      • additive increase
      • multiplicative decrease