본문 바로가기
CS/컴퓨터 네트워크

Chapter 3 전송계층 (Transport Layer)

by J-rain 2023. 4. 18.

3.1 transport-layer services

네트워크 계층이 호스트들 간의 논리적 통신이라면 전송계층은 프로세스 간의 논리적 통신이다.

 

3.2 multiplexing and demultiplexing

 

Multiplexing (다중화)

다중화는 여러개의 데이터 스트림을 하나의 물리적인 통신 매체로 전송하기 위해 사용되는 기술이다.

이를 통해 대역폭을 효과적으로 활용할 수 있다. 다중화 기술에는 앞서 설명했던 시분할 다중화(TDM), 주파수 분할 다중화(FDM) 등이 있다.

 

Demultiplexing (역다중화)

반면, 역다중화는 다중화된 데이터를 각각의 연결로 분리하여 처리 하는 기술이다. 역다중화를 통해 수신 측에서는 하나의 물리적인 통신 매체로부터 여러 개의 데이터 스트림을 받을 수 있고 각각의 연결에 대한 처리 및 분석이 용이해진다.

 

이러한 다중화, 역다중화를 통해 전송계층은 효율적인 데이터 전송을 가능하게 한다.


3.3 connectionless transport: UDP

 

UDP 특징

- 비연결형

- 비신뢰성

- 비상태정보

- 비정규적인 송신률: 일부 패킷 손실이 발생하더라도 지속적인 전송률을 요구하는 실시간 영상서비스에 적합

- 최선형 서비스: 수신확인 및 재전송 기능 無

 

UDP: segment header

  1. 송신 포트번호(Source Port Number): 송신 측에서 사용하는 포트 번호로, 16비트로 구성된다.
  2. 수신 포트번호(Destination Port Number): 수신 측에서 사용하는 포트 번호로, 16비트로 구성된다.
  3. UDP 길이(Length): UDP 세그먼트 전체의 길이(헤더와 데이터를 합친 길이)를 바이트 단위로 나타낸다. 16비트로 구성된다.
  4. 체크섬(Checksum): UDP 세그먼트의 오류를 검출하기 위한 값으로, 16비트로 구성된다. 송신 측에서는 UDP 세그먼트 전체를 대상으로 체크섬 값을 계산하고, 수신 측에서는 이 값을 이용하여 오류 검출을 수행한다.
UDP checksum

체크섬은 데이터 전송 중 오류 검출을 위한 값이다.

 

체크섬 값은 송신 측에서 UDP 세그먼트의 데이터와 헤더를 모두 더한 후, 1의 보수 연산을 수행하여 계산된다. 이때 1의 보수 연산은 각 비트를 반전시키는 것을 의미한다. 그 후, 계산된 체크섬 값을 UDP 세그먼트의 체크섬 필드에 저장한다.

UDP는 연결 지향적이지 않으며, 데이터 전송의 신뢰성을 보장하지 않는다. UDP는 데이터를 보내기만 하고 수신 여부를 확인하지 않는다. 데이터를 전송할 때 별다른 설정 과정 없이 데이터를 그대로 보내는 것이 가능하다. UDP는 빠른 데이터 전송과 대량 전송이 필요한 애플리케이션에 사용된다. 예를 들어, 실시간 동영상 전송, 게임, DNS 등이 있다.


3.4 principles of reliable data transfer (신뢰성 전송 원리) => TCP

 

전송 중 오류가 발생할 수 있을 때:

  • acknowledgements (ACK 응답): 수신자가 보낸 사람에게 패킷이 정상적으로 수신되었다고 알린다.
  • negative acknowledgements (NAK 부정응답): 수신자가 보낸 사람에게 패킷에 오류가 있음을 알린다.

중복처리:

  • ACK/NAK가 손상된 경우 보낸 사람이 현재 패킷을 재전송한다.
  • sender는 각 패킷에 sequence number(시퀀스 번호)를 추가한다.

 

Packet 재전송

1. Stop-and-wait: 데이터 통신에서 패킷을 보내고 송신자가 수신자로부터 ACK를 받아야만 다음 패킷을 전송하는 방식이다. 간단하지만 효율적이지 않다.

 

-Pipelining method- (요청을 연속적으로 보내거나 다수의 요청과 응답을 처리할 수 있는 기능)

2. Go-back-N (GBN): 일정 범위 내의 패킷들을 송신자가 한 번에 전송하고, 수신자는 해당 범위 내의 패킷을 정상적으로 받을 경우 cumulative ACK를 송신자에게 보내는 방식이다. 송신자는 일정 시간(타이머) 내에 ACK를 받지 못하면, 해당 범위 내의 모든 패킷을 다시 전송해야 한다.

pkt2를 보내는도중 loss가 생겨 receiver는 가장 마지막에 정상적으로 받은 ack1을 (re)send 하고있다. 또한 일정시간 내에 ACK를 받지 못해서 pk2~pk5를 재전송 하고있다.

GBN방식에서 cumulative ACK는 수신자가 받은 패킷 중 가장 마지막에 정상적으로 받은 패킷의 번호를 나타내는 ACK이다. 즉, 이전에 받은 모든 패킷들도 모두 정상적으로 받았다는 의미를 포함하고 있다.

 

3. Selective repeat: 일정 범위 내의 패킷들을 송신자가 한 번에 전송하고, 수신자는 해당 범위 내에서 누락된 패킷만 재전송받는 방식이다.

pk2만 전송도중 오류가나서 receiver 가 누락된 pk2를 재전송 요청한다.


Selective Repeat 방식은 Go-Back-N 방식과는 다르게 누락된 패킷만 재전송하므로, 전송 효율을 높일 수 있다.

3.5 connection-oriented transport: TCP  (1. segment structure)

 

TCP 특징

- 연결형

- 신뢰성

- 흐름제어

- 혼잡제어

- 스트림 통신

 

TCP: segment structure

TCP 헤더크기는 보통 20~60bytes

  1. 발신지, 목적지 포트번호 Source Port(16 bits)와 Destination Port(16 bits) : 출발지와 목적지의 포트 번호이다. 이를 통해 송수신자 간에 어떤 프로그램이 통신 중인지 식별한다.
  2. Sequence Number (32 bits) : TCP 세그먼트의 첫 번째 바이트의 바이트 스트림 번호이다. TCP 연결, 종료 시에는 Sequence Number를 임의의 랜덤 값으로 설정한다.
  3. Acknowledgement Number (32 bits) : 수신측이 성공적으로 수신한 데이터 바이트의 다음 순서의 바이트를 지정한다. 이를 통해 송신 측이 이전에 전송한 데이터가 제대로 수신되었는지 확인할 수 있다.
  4. Data Offset(4 bits) : 세그먼트 헤더의 길이를 바이트 단위로 나타낸다. 최솟값은 5이다.
  5. Reserved(6 bits) : 예약 필드이다. 0으로 초기화된다.
  6. Flags(6 bits) : 세그먼트의 제어 비트이다. URG, ACK, PSH, RST, SYN, FIN 등이 포함된다.
  7. Window Size(16 bits) : 송신 측이 수신 측에게 받을 수 있는 최대 데이터 양을 나타낸다. 이를 통해 송신 측은 수신 측의 처리 속도에 맞추어 데이터를 전송한다.
  8. Checksum(16 bits) : 오류 검출을 위한 체크섬이다. 데이터 비트들의 1의 보수 합을 취한 값이다.
  9. Urgent Pointer(16 bits) : 긴급 데이터가 있는 경우 긴급 데이터의 마지막 바이트를 지정한다.
  10. Options(가변 길이) : 선택적인 정보를 전송할 때 사용한다. 최대 40바이트까지 전송 가능하다.

 

Sequence numbers, Ack numbers

Sequence Number: 보내질 응용계층 데이터의 첫 바이트 주소이다. Sequence Number 필드에서는 전송되는 세그먼트의 가장 앞에 있는 숫자를 표기하고 있다.

Acknowledgements: 다음 받고자 하는 순차 번호이다. (상대방으로부터 받아야 하는 다음 TCP 세그먼트 데이터 번호)

 

 

 

 

1번 과정: Seq=42, ACK=79, data = 'C' 

 

2번 과정:  Seq=79, ACK=43, data = 'C' 

(1번 과정의 ACK가 Seq번호, 2번 과정의 ACK는 data의 크기인 42+1=43 이 되었다.)

 

3번 과정: Seq=43, ACK=80

(역시 이전 과정의 ACK인 43이 Seq번호로 바뀌었고 ACK는 79+1=80 이 되었다.)

 

 

 

 

Flags 제어 필드

  1. URG (Urgent): 긴급한 데이터 전송을 의미한다. 이 비트를 설정하면 전송되는 데이터가 다른 데이터보다 우선적으로 처리된다.
  2. ACK (Acknowledgment): 데이터를 수신한 후에, 수신 측이 보내온 데이터가 올바르게 수신되었음을 확인하기 위해 사용된다. 이 비트가 설정되면, 수신 측은 이전의 패킷들이 올바르게 전송되었음을 알린다.
  3. PSH (Push): 데이터를 전송할 때, 버퍼링 없이 즉시 수신 측으로 전송하도록 요청하는 비트이다.
  4. RST (Reset): 연결 설정 도중 또는 데이터 전송 중에 연결이 초기화되어야 할 경우 사용된다. 이 비트가 설정되면, 모든 연결이 즉시 끊어지고 다시 초기 상태로 돌아간다.(연결 재설정)
  5. SYN (Synchronize): TCP 3-way 핸드셰이크에서 사용된다. 클라이언트가 서버에 연결을 요청할 때 SYN 비트를 설정하여 연결 요청 메시지를 보낸다. (연결을 요청하는 경우에만 SYN=1로 설정, 다른 모든 경우는 0으로 설정)
  6. FIN (Finish): 전송할 데이터가 없음을 나타낸다. 데이터 전송이 완료되면, 이 비트가 설정되어 수신 측에게 데이터 전송이 완료되었음을 알린다. (연결 해제할 경우에는 FIN=1로 설정)

 

 

 


3.5 connection-oriented transport: TCP (2. reliable data transfer)

 

TCP의 신뢰성 있는 전송 방법 (송-수신자)

송신자 A

- 응용층의 데이터를 받으면 세그먼트를 만들어서 시퀀스 번호 부여하고 보낸 후에 타이머 설정 한다.

- 타이머가 종료되면 재전송 및 타이머 설정 한다.

- Ack를 받으면 Sendbase에 ACK 번호 저장

 

수신자 B

- 데이터를 받으면 비트 에러 체크(checksum), 에러이면 NAK 재전송 요청, 시퀀스 번호를 검사하여 문제가 없으면 누적 ACK 보낸다. (만약 패킷 중복 시 버림)

 

- lost Ack

 

Host A는 타이머가 종료되었는데 ACK를 받지 못해 재전송 및 타이머 설정한다.

 

- premature timeout

 

ACK = 120 정보가 이미 Host B에게도 있기 때문에 92+8=100 이아닌 ACK=120으로 돌아왔다.

 

 

- cumulative ACK

 

타이머 시간 설정이 적당한 경우

Host B가 1번째 ACK전송이 실패해도 2번째 ACK를 Host A가 받았기에 A는 1,2번 모두 잘 받은 것으로 판단한다. (누적 ACK의 장점)

 

- fast retransmit

 

만약 세번의 중복 ACK가 도달하면 Timeout이 안되더라도 재전송한다. (빠른 재전송)

 

 

따라서 TCP는 Timeout경우3개이상 중복 ACK를 받았을때 재전송한다.


3.5 connection-oriented transport: TCP (3. flow control)

 

 

TCP flow control (흐름 제어)

TCP flow control: 수신측이 전송되는 데이터의 속도를 제어하여 수신측이 처리할 수 있는 데이터 양을 초과하지 않도록 한다. 이를 통해 네트워크 혼잡을 방지하고 데이터 전송의 효율을 높일 수 있다.

 

1. 수신측은 받을 수 있는 버퍼 사이즈 값을 패킷 헤드에 넣어 송신측에게 보낸다.

  • - RcvBuffer: 버퍼 사이즈는 소켓의 옵션으로 기본은 4096Byte
  • - OS에서 필요시 자동적으로 재조정

2. 송신측은 보내고나서 아직 ACK를 받지 않은 패킷의 수를 수신측의 rwnd값보다 작게한다면 수신자의 버퍼 오버플로우를 방지할 수 있다.

 

 

  • 슬로우 스타트(Slow Start): 송신측에서 네트워크 상태에 따라 흐름을 제어하는 기법

3.5 connection-oriented transport: TCP (4. connection management)

 

TCP connection management (연결 설정)

 

2-way handshake

하나의 SYN 요청, 하나의 ACK 응답만 존재한다.

 

통신이 이루어지기 전에 송신측과 수신측 간에 먼저 2번의 메시지 교환을 통해 서로의 상태를 확인하는 과정을 의미한다.

 

 

 

 

 

 

 

 

 

3-way handshake

Port 상태 정보

LISTEN : 포트가 열린 상태로 연결 요청을 대기하는 상태

SYN-SENT : 연결 요청을 하고 Server의 ACK를 기다리는 상태

SYN_RCVD : 연결 요청에 응답/연결을 요청하고 Client의 응답을 기다리는 상태

ESTABLISHED : 연결된 상태

 

 

  1. 송신측은 SYN 메시지를 수신측에게 전송하여 통신을 요청한다.
  2. 수신측은 SYN 메시지를 받고, 송신측에게 SYN/ACK 메시지를 전송하여 요청을 수락한다는 것을 알린다.
  3. 송신측은 ACK 메시지를 수신측에게 전송하여 연결이 수립되었음을 확인한다.

TCP/IP 프로토콜을 이용해서 통신하는 응용프로그램은 데이터를 주고받기 전에 먼저 연결을 진행한다.

3-way Handshake는 이 연결 과정을 의미한다.


3.6 principles of congestion control

 

 

Congestion control (혼잡 제어)

네트워크에서 발생하는 데이터 전송량이 네트워크 대역폭을 초과하여 네트워크 혼잡을 유발하는 것을 막기 위한 방법이다.

 

  • 예방적(Preventive) 혼잡 제어
  • 혼잡 제어를 수행하는 데 있어서 사전에 제어하는 방식이다. 예방적 혼잡 제어는 네트워크 대역폭과 패킷 손실률 등의 정보를 이용하여 데이터 전송 속도를 조절한다. 대표적인 예로, TCP에서는 Slow Start와 Congestion Avoidance을 통해 예방적 혼잡 제어를 수행한다.
  • 반응적(Reactive) 혼잡 제어
  • 혼잡 제어를 수행하는 데 있어서 발생한 후에 제어하는 방식이다. 반응적 혼잡 제어는 혼잡 상황이 발생했을 때, 빠르게 대응하여 데이터 전송 속도를 조절한다. 대표적인 예로, TCP에서는 Fast Recovery와 Fast Retransmit을 통해 반응적 혼잡 제어를 수행한다.

댓글