트랜스포트 계층의 대표적인 프로토콜은 TCP, UDP가 있습니다. 이 두 프로토콜은 헤더에 오류 검출 필드가 존재해서 무결성 검사를 제공합니다.
먼저 TCP는, 신뢰적 데이터 전달을 제공하고, 혼잡제어를 제공하며, 데이터가 순서에 맞게 전달됩니다.
반대로, UDP는 비신뢰적 데이터 전달로, 손상되지 않거나 목적지에 도달하는 것을 보장하지 않습니다.
트랜스포트 계층은 다중화와 역다중화 작업을 거칩니다. 다중화는 소켓들로부터 데이터를 모아서, 헤더를 부착하여 세그먼트로 만든 후 네트워크 계층으로 전달하는 작업이고, 역다중화는 세그먼트 내 데이터를 목적지 호스트의 여러 소켓 중 올바른 소켓으로 전달하는 작업을 의미합니다.
이 과정에서 UDP 소켓의 경우는 목적지 IP와 목적지 포트번호로만 식별하고, TCP 소켓은 목적지 IP, 포트번호와 출발지 IP, 포트번호 총 4가지로 식별합니다.
포트번호는 특정 프로토콜이나 이에 해당하는 서비스를 식별하기 위해 사용하는 번호로 크게 세가지 범위로 나누어서 부릅니다.
- Well - Known Port
- Registered Port
- Dynamic Port, Ephemeral Port
Well - Known Port는 이미 표준화가 된 서비스가 예약된 포트 구간으로, 0 ~ 1023의 포트번호가 여기에 속합니다.
Registered Port는 표준은 아닌 사업자들이 등록한 포트 구간으로, 1024 ~ 49151의 포트번호가 여기에 속합니다.
Dynamic Port는 조금 더 자유로운 임의용 포트 구간으로, 49152 ~ 65535의 포트번호가 여기에 속합니다.
Well - Known Port중 자주 쓰이는 포트번호로는 SSH의 22, DNS의 53, DHCP Server의 67, DHCP Client의 68, HTTP의 80, HTTPS의 443 등이 있습니다.
UDP 프로토콜은 다중화, 역다중화 기능과 간단한 오류검사 기능을 제공하고, TCP와 다르게 연결설정이 없고 연결상태 또한 없습니다. 그리고 헤더가 8바이트 고정으로, TCP에 비해 오버헤드가 적습니다.
UDP 세그먼트는 16비트의 출발지 포트번호, 목적지 포트번호, 길이, 체크섬이 헤더 8바이트에 들어갑니다.
체크섬의 경우, 체크섬 계산 대상 데이터의 1의 보수합의 1의 보수를 통해 계산하며, 16비트 단위가 되지 않는 경우 0 패딩을 추가합니다. 수신측에서 16비트 1의 보수 합이 FFFF라면, 오류가 없음을 나타냅니다. 송신측에서 계산한 체크섬 값이 0인 경우에는 체크섬 미적용과 동일한 값이므로, 모든 비트가 1인 체크섬을 설정하여 전송합니다. (모든 비트가 1인 내용을 1의 보수 취하면 -0)
TCP 프로토콜은 두 종단 시스템에서만 동작하는 프로토콜로, 전이중 시스템을 제공하고, 점대점 연결로 작동하며 3-Way Handshaking, 4-Way Handshaking으로 연결 및 종료합니다. TCP 세그먼트의 크기는 MSS에 의해 제한됩니다.
TCP 세그먼트는 16비트의 출발지 포트번호, 목적지 포트번호, 수신 윈도우, 긴급 데이터 포인터, 체크섬, 32비트의 순서번호와 확인응답번호, 4비트의 헤더길이와 예약필드, 각각 1비트의 플래그 들이 헤더에 포함됩니다. 헤더는 최소 20바이트고 최대 60바이트 까지 가능합니다. 헤더의 길이는 헤더길이 필드에서 결정되고, 4바이트 단위의 값으로 설정합니다.
EX) 헤더길이 필드에 15가 있으면, 15*4 = 60, 즉, 해당 세그먼트는 헤더가 60바이트
TCP는 헤더에 옵션 및 패딩이 있는데, 이 중 옵션은 크게 다음 4가지가 있습니다.
- MSS 옵션
- Window Scale
- Timestamp
- SACK - permitted
MSS 옵션은 수신 가능한 MSS값이 실리는 옵션입니다. 여기서 MSS는 MTU 값에 기인되는 값으로 MTU란, IP 패킷의 가장 큰 데이터 블록을 의미합니다. EX) MTU = 1500, IP Header = 20byte, TCP Header = 20byte, MSS = 1460byte.
Window Scale 옵션은 Window Scale 옵션의 값만큼 수신윈도우를 왼쪽으로 시프트 연산 수행합니다. EX) rwnd = 10, Window Scale = 7, rwnd = 10 * 2^7
Timestamp 옵션은 송신측이 세그먼트를 보낸 시간 값 TSval과 가장 최근 수신한 세그먼트 내에 존재하는 TSval값으로 이루어지는데, 이를 통해 RTU 계산을 할 수 있습니다.
SACK - permitted 옵션은 세그먼트가 재전송 혹은 손실 등의 이유로 순서대로 도착하지 않을 경우, 기존에는 해당 세그먼트를 폐기했지만 해당 옵션을 사용하게 되면 받아서 저장해둡니다. 그리고 못받았던 세그먼트가 도착하여 순서대로 받아졌을 때, 다음 계층으로 전송합니다.
순서번호는 세그먼트 내 데이터의 첫 바이트의 바이트 스트림 번호이고, 확인응답번호는 상대방 TCP로부터 받아야 할 다음 바이트의 순서번호를 저장합니다.
3-Way Handshake는 TCP의 연결설정으로, SYN 세그먼트 전송, SYN+ACK 세그먼트 전송, ACK 세그먼트 전송의 3단계로 이루어집니다. 마지막의 ACK 세그먼트를 제외한 세그먼트는 데이터를 전달하지 않지만, 순서번호는 하나 소비합니다. 반대로 마지막의 ACK 세그먼트는 데이터를 전달 할 수도있고 안할 수도 있습니다. 데이터를 전달 안하는 경우에는 순서번호를 소비하지 않습니다.
4-Way Handshake는 TCP의 연결종료로, FIN 세그먼트 전송, ACK 세그먼트 전송, FIN 세그먼트 전송, ACK 세그먼트 전송의 4단계로 이루어집니다.
RTT(Round Trip Time)과 RTO(Retransmission Timeout)은 다음 방식으로 계산 가능합니다.
먼저 RTT의 예측은 (1 - a) * SRTT + a * RTT 로 정의되고, 이를 SRTT라고 부릅니다. 최초의 SRTT 값은 RTT값과 동일합니다. SRTT는 RTT 측정값들의 평균입니다. 여기서 a는 0.125입니다.
RTT의 변화율은 (1 - b) * RTTVAR + b * |SRTT - RTT| 로 정의되고, 이를 RTTVAR이라고 부릅니다. 최초의 RTTVAR값은 RTT / 2로 구합니다. 여기서 b는 0.25입니다.
RTO는 SRTT + 4 * RTTVAR 로 정의되고, RTO 값은 불필요한 재전송을 막기 위해 SRTT보다는 큰 값을 가지게 됩니다. 하지만 너무 크게되면 전송지연이 길어지므로, RTT 샘플들의 변동에 따라 여유값이 달라집니다. RTO는 기본적으로 1초로 설정하고 지수 백오프 전략을 사용하여 타임아웃주기를 2배로 설정합니다.
TCP의 흐름제어는 수신 윈도우를 이용하여 수신측 수신 속도에 맞게 송신측의 송신 속도를 제어합니다.
TCP의 혼잡제어는 통신 네트워크가 일시적 혹은 상시로 혼잡할 때, 송신 속도를 조절하는 기능으로, 송신 억제 매커니즘으로 크게 두가지를 사용합니다.
- 슬로우 스타트
- 혼잡회피
슬로우 스타트는 1 MSS부터 시작하여 송신량을 지수적 증가합니다. 이때, 송신 임계량에 도달하게되면 혼잡회피 모드로 이동합니다. 혹은 타임아웃이 발생했거나 3개의 중복 ACK이 수신된 경우 송신 임계량을 절반으로 설정하여 1 MSS부터 다시 재시작합니다.
혼잡회피는 송신량을 선형적 증가시키며 타임아웃시 송신 임계량은 송신 윈도우 크기의 절반으로 설정하고 송신 윈도우는 1로 설정한 후 슬로우 스타트 모드로 이동합니다. 3개의 중복 ACK을 수신시 TCP Tahoe 버전과 Reno 버전 중 하나로 수행합니다. Tahoe 버전은 타임아웃과 동일하고, Reno 버전은 타임아웃보다는 덜 심각한 혼잡으로 해석하고 대응합니다.
TCP의 신뢰성 있는 데이터 전송은 ARQ라고 불리는 프로토콜로 수행합니다. ARQ 프로토콜에는 크게 3가지가 있습니다.
- Stop-and-Wait 프로토콜
- Go-back-N 프로토콜
- Selective Repeat 프로토콜
Stop-and-Wait 프로토콜은 수신측 슬라이드 윈도우 크기와 송신측 슬라이드 윈도우 크기가 모두 1이고, 하나의 패킷을 전송하고, 하나씩 응답을 받는 구조이며, 응답에 손실이 발생하면 제대로 받을 때 까지 재전송을 시도합니다. 하지만 이 방식은 하나의 패킷만을 보내고 응답을 받지못하면 재전송을 하기 때문에 RTT가 너무 잦게 존재하여 효율적이지 못합니다. 따라서, Pipelined 방식은 Go-back-N 프로토콜이나 Selective Repeat 프로토콜을 주로 사용합니다.
Go-back-N 프로토콜은 수신측 슬라이드 윈도우가 1개, 송신측 슬라이드 윈도우가 N이고, N개의 패킷을 전송하고, 응답을 받지 못하더라도, 재전송을 보내며 정상적으로 응답이 온 패킷의 확인응답번호를 통해 이 전의 패킷은 정상적으로 받은걸로 간주합니다. (확인응답번호의 특징을 활용) 이 프로토콜에서 송신 윈도우 크기는 순서번호 m bit일 때, 2^m 보다는 작아야합니다. 이를 준수하지 않으면, 기수신 패킷을 새로운 패킷으로 수신하는 문제가 발생합니다.
Selective Repeat 프로토콜은 수신측 슬라이드 윈도우와 송신측 슬라이드 윈도우가 모두 N이고, N개의 패킷을 전송하고, 받은 패킷을 플래그로 알려줍니다. 이를 통해, 순서대로 패킷이 수신될때마다 윈도우를 슬라이드하며, 패킷 송수신을 진행합니다. 이 프로토콜에서 윈도우 크기는 m bit 순서번호일 때, 2^m의 절반이 최대크기입니다.
'Computer Science > 네트워크' 카테고리의 다른 글
데이터링크 계층 (DataLink Layer) (0) | 2024.07.09 |
---|---|
네트워크 계층 (Network Layer) (0) | 2024.07.02 |
애플리케이션 계층 (Application Layer) (0) | 2024.06.27 |
네트워크 개요 (0) | 2024.06.26 |