공부용 블로그 | seokmin100
혼공네트 - 4차시_전송 계층 본문
전송 계층 개요: IP의 한계와 포트
신뢰할 수 없는 통신과 비연결형 통신
IP는 신뢰할 수 없는(비신회성) 프로토콜(Unreliable Protocol)이자 비연결형 프로토콜(Connetionless Protocol)이다. 달리 표현하면, IP를 통한 패킷의 전달은 신뢰성이 없는 통신이자 연결을 수립하는 과정이 없는 통신이다.
신뢰할 수 없는 통신은 IP 프로토콜이 패킷이 수신지까지 제대로 전송되었다는 보장을 하지 않는 특징을 일컫는다. 이는 통신 과정에서 패킷의 데이터가 손상되거나 중복된 패킷이 전송되었더라도 이를 확인하지 않고, 재전송도 하지 않으며, 순서대로 패킷이 도착할 것이라는 보장도 하지 않는다는 의미이다. 이러한 전송 특성을 최선형 전달(Best Effort Delivery)라고 부른다. 좋은 뜻으로 들리지만 사실 '최선을 다해 보겠지만, 전송 결과에 대해서는 어떠한 보장도 하지 않겠다.'라는 뜻이다.
비연결형통신은 이름 그대로 송수신 호스트 간에 사전 연결 수립 작업을 거치지 않는 특징을 의미한다. 그저 수신지를 향해 패킷을 보내기만 할 뿐이다.
IP의 한계를 보완하는 전송 계층
1. 전송 계층은 연결형 통신을 가능하게 한다.
전송 계층의 연결형 프로토콜인 TCP는 두 호스트가 정보를 주고받기 전에 마치 가상의 회선을 설정하듯이 연결을 수립한다. 송수신하는 동안에는 연결을 유지하고, 송수신이 끝나면 연결을 종료할 수 있다.
2. 전송 계층은 신뢰성 있는 통신을 가능하게 한다.
신뢰성 있는 통신 또한 TCP를 통해 가능하다. TCP는 패킷이 수신지까지 올바른 순서대로 확실히 전달되는 것을 보장하기 위해 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어, 등 다양한 기능들을 제공한다.
연결형 통신과 신뢰성 통신이 그렇지 않은 통신에 비해 무조건 좋은 것은 아니다. 때로는 비교적 높은 성능을 위해 신뢰할 수 없는 통신, 비연결 통신을 지원하는 프로토콜이 필요할 때가 있다. 그래서 전송 계층에는 UDP라는 프로토콜도 존재한다. UDP는 신뢰한 수 없는 통신, 비연결형 통신을 가능하게 하는 전송 계층의 프로토콜로 TCP보다는 비교적 빠른 전송이 가능하다.
응용 계층과의 연결 다리, 포트
- 포트의 정의
포트(Port) : 패킷이 싱행 중인 특정 애플리케이션까지 전달되려면 패킷에 특정 애플리케이션을 식별할 수 있는 정보
- 포트의 분류
전송 계층에서의 포트 번호를 통해 특정 애플리케이션을 식별한다. 정확히는 패킷 내 수신지 포트와 송신지 포트를 통해 송수신지 호스트의 애플리케이션을 식별한다. 전송 계층의 핵심 프로토콜인 TCP와 UDP는 모두 포트 번호 필드인 송신지 포트 번호와 수신지 포트 번호를 포함한다. 포트 번호는 16비트로 표현 가능하며, 사용 가능한 포트의 수는 2¹⁶개 이다. 할당 가능한 포트 번호는 0번부터 65535번까지, 총 65535개가 존재한다. 이는 범위에 따라 '잘 알려진 포트', '등록된 포트', '동적 포트' 세 종류로 나누어진다.
포트 종류 | 포트 번호 범위 |
잘 알려진 포트 | 0~1023 |
등록된 포트 | 1024~49151 |
동적 포트 | 49152~65536 |
0부터 1023번까지의 포트 번호는 잘 알려진 포트(Well Known Port)이다. 시스템 포트(System Port)라고도 한다. 잘 알려진 포트는 범용적으로 사용되는 애플리케이션 프로토콜이 일반적으로 사용하는 '널리 알려진, 유명한' 포트 번호를 의미한다.
포트번호 1024번부터 49151번까지는 등록된 포트(Registered Port) 번호이다. 잘 알려진 포트에 비해 덜 범용적이지만, 흔히 사용되는 애플리케이션 프로토콜에 할당하기 위해 사용된다.
포트번호 49152번부터 65535번부터까지는 동적 포트(Dynamic Port), 사설 포트(Private Port), 임시 포트(Ephemeral Port)라고 부른다. 인터넷 할당 번호 관리 기관에 의해 할당된 애플리케이션 프로토콜이 없고, 특별히 관리되지 않는 포트 번호인 만큼 자유롭게 사용할 수 있다.
IP 주소와 포트 번호에 대한 정보가 함께 주어지면 특정 호스트에서 실행 중인 특정 애플리케이션 프로세스를 식별할 수 있다. 그래서 포트 번호는 일반적으로 다음과 같이 IP 주소:포트 번호 형식으로 IP 주소와 함께 표기되는 경우가 많다.
포트 기반 NAT
NAT란 IP 주소를 변환하는 기술이며, 주로 네트워크 내부에서 사용되는 사설 IP 주소와 네트워크 외부에서 사용되는 공인 IP 주소를 변환하는 데 사용된다. 이러한 변환을 위해 주로 사용되는 것이 NAT 변환 테이블이다.
- NAT 변환 테이블
NAT 변환 테이블(이하 NAT 테이블)은 변환의 대상이 되는 IP 주소 쌍이 명시되어 있다.
사설 IP 주소 하나당 공인 IP 주소 하나가 대응되기 때문에 변환의 대상이 되는 IP 주소가 일대일로 대응되어 있다. 이처럼 NAT 테이블의 항목을 일대일로 대응해 NAT 활용하는 것이 가능하기는 하지만, 이 방식만으로 많은 사설 IP 주소를 변환하기에는 무리가 있다. 사설 IP 주소와 공인 IP 주소가 일대일로 대응된다면 네트워크 내부에서 사용되는 사설 IP 주소의 수만큼 공인 IP 주소가 필요하기 때문이다.
- NAPT
포트 기반의 NAT를 NAPT(Network Address Port Translation)라 한다. APT(Address Port Translation)라고 부르기도 한다. NAPT는 포트를 활용해 하나의 공인 IP 주소를 여러 사설 IP 주소가 공유할 수 있도록 하는 NAT의 일종이다. NAT 테이블에 변환할 IP 주소 쌍과 더불어 포트 번호도 함께 기록하고, 변환한다.
네트워크 외부애서 사용할 IP 주소가 같더라도 포트 번호가 다르면 네트워크 내부의 호스트를 특정할 수 있기 때문에, 다수의 사설 IP 주소를 이용하면 그보다 적은 수의 공인 IP 주소로 변환할 수 있게 된다. 즉, NAPT를 이용하면 네트워크 내부에서 사용할 IP 주소를 N:1로 관리할 수 있다. 이러한 점에서 NAPT는 공인 IP 주소 수 부족 문제를 개선한 기술로도 간주된다.
포트 포워딩
포트 포워딩(Port Forwarding)이란 네트워크 내 특정 호스트에 IP 주소와 포트 번호를 미리 할당하고, 해당 IP 주소: 포트 번호로써 해단 호스트에게 패킷을 전달하는 기능이다.
ICMP
IP의 신뢰할 수 없는 전송 특성과 비연결형 전송 특성을 보완하기 위한 네트워크 계층의 프로토콜로 ICMP가 있다.
ICMP(Internet Control Message Protocol)는 IP 패킷의 전송 과정에 대한 피드백 메시지를 얻기 위해 사용하는 프로토콜
TCP와 UDP
TCP 통신 단계와 세그먼트 구조
TCP는 통신(데이터 송수신)하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료한다. 그리고 데이터 송수신 과정에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공한다.
TCP의 연결 수립과 종료를 이해하려면 가장 먼저 MSS라는 단위와 TCP의 세그먼트 구조를 이해해야 한다.
MSS는 Maximum Segment Size의 약자로, TCP로 전송할 수 있는 최대 페이로드 크기를 의미한다. MSS의 크기를 고려할 때 TCP 헤더 크기는 제외한다. 헤더의 크기까지 포함 했던 단위인 MTU와는 대조적이다.
TCP 세그먼트 구조를 살펴보자
- 송신지 포트(Source Port)와 수신지 포트(Destination Port) : 필드 이름 그대로 송수신지 또는 수신지 애플리케이션을 식별하는 포트 번호가 명시되는 필드이다.
- 순서 번호(Sequence Number) : 순서 번호가 명시되는 필드이다. 순서 번호란 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호이다.
- 확인 응답 번호(Acknowledgment Number) : 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하기를 기대하는 순서 번호가 명시된다.
- 제어 비트(Control Bits) : 플래그 비트(Flag Bits)라고도 부른다. 현재 세그먼트에 대한 부가 정보를 나타낸다.
- 윈도우(Windows) : 수신 윈도우의 크기가 명시된다. 수신 윈도우란 한 번에 수신하고자 하는 데이터의 양을 나타낸다.
- 제어 비트
순서 번호 필드와 확인 응답 번호 필드를 학습하려면 먼저 제어 비트 필드에 대한 간략한 이해가 필요하다. 제어 비트 필드는 기본적으로 8비트로 구성된다. 각 자리의 비트는 각기 다른 의미를 가지는데, TCP의 기본 동작을 논할 떄 가장 자주 언급되는 세 개의 제어 비트는 다음과 같다.
- ACK : 세그먼트의 승인을 나타내기 위한 비트
- SYN : 연결을 수립하기 위한 비트
- FIN : 연결을 종료하기 위한 비트
- 순서 번호와 확인 응답 번호
순서 번호 필드와 확인 응답 번호 필드는 TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드로, 한 쌍으로 묶어서 기억하는 것이 좋다.
순서 번호 필드에 명시되는 순서 번호는 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호로, 세그먼트 데이터의 첫 바이트에 부여하는 번호이다.
처음 통신을 위해 연겨를 수립한 경우, 즉 제어 비트에서 연결을 수립하기 위한 비트인 SYN 플래그가 1로 설정된 세그먼트의 경우 순서 번호는 무작위 값이 된다. 이를 초기 순서 번호(ISN; Initial Sequence Number)라고 한다.
연결 수립 이후 데이터를 송신하는 동안 순서 번호는 송신한 바이트를 더해 가는 형태로 누적값을 가진다. 즉 순서 번호는 초기 순서 번호 + 송신한 바이트 수가 되는 셈이다.
확인 응답 번호 필드에 명시되는 확인 응답 번호는 순서 번호에 대한 응답이다. 확인 응답 번호 값을 보내기 위해서는 제어 비트에서 승인을 나타내는 비트인 ACK 플래그를 1로 설정해야 한다.
TCP 연결 수립과 종료
- 연결 수립: 쓰리 웨이 핸드셰이크
TCP의 연결 수립은 쓰리 웨이 핸드셰이크를 통해 이루어진다. 쓰리 웨이 핸드셰이크(Three-way Handshake)는 이름처럼 세 개의 단계로 이루어진 TCP의 연결 수립 과정을 의미한다.
송수신 방향 | 세그먼트 | 세그먼트에 포함된 주요 정보 | 비유 |
A -> B | SYN 세그먼트 | - 호스트 A의 초기 순서 번호 - 1로 설정된 SYN 비트 |
'연결 시작합니다.' |
B -> A | SYN + ACK 세그먼트 | - 호스트 B의 초기 순서 번호 - 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 SYN 비트 - 1로 설정된 ACK 비트 |
'네 확인했습니다. 연결 시작해요!' |
A -> B | ACK 세그먼트 | - 호스트 A의 다음 순서 번호 - 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 ACK 비트 |
'네, 확인했습니다.' |
처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈(Active Open)이라 한다. 액티브 오픈은 주로 서버 - 클라이언트 관계에서 클라이언트에 의해 수행된다. 연결 요청을 받고 나서 요청에 따라 연결을 수립해 주는 호스트도 있다. 이 호스트의 연결 수립 과정을 패시브 오픈(Passive Open)이라고 한다. 주로 서버에 의해 수행된다.
- 연결 종료
쓰리 웨이 핸드셰이크를 통해 연결을 수립한 뒤 데이터 송수신이 끝났다면, 이제 연결을 종료해야 한다. TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어진다.
송수신 방향 | 세그먼트 | 세그먼트에 포함된 주요 정보 | 비유 |
A -> B | FIN 세그먼트 | - 1로 설정된 FIN 비트 | '연결 끊을게다.' |
B -> A | ACK 세그먼트 | - 호스트 A가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 ACK 비트 |
'네 확인했습니다.!' |
B -> A | FIN 세그먼트 | - 1로 설정된 FIN 비트 | '이제 연결 끊어요.' |
A -> B | ACK 세그먼트 | - 호스트 B가 전송한 세그먼트에 대한 확인 응답 번호 - 1로 설정된 ACK 비트 |
'네, 확인했습니다.' |
연결을 수립할 때 액티브 오픈, 패시브 오픈이 있는 것처럼, 연결을 종료하는 과정에도 액티브 클로즈, 패시브 클로즈가 있다. 액티브 클로즈(Active Close)는 먼저 연결을 종료하려는 호스트에 의해 수행된다. 패시브 클로즈(Passive Close)는 연결 종료 요청을 받아들이는 호스트에 의해 수행된다.
TCP 상태
TCP는 연결형 통신과 신뢰할 수 있는 통신을 유지하기 위해 다양한 '상태'를 유지한다. 상태(State)는 현재 어떤 통신 과정에 있는지를 나타내는 정보이다. TCP는 상태를 유지하고 활용한다는 점에서 스테이트풀(Stateful) 프로토콜이라고도 부른다.
TCP 상태 : 1.연결이 수립되지 않은 상태, 2.연결 수립 과정에서 주로 볼 수 있는 상태, 3.연결 종료 과정에서 주로 볼 수 있는 상태
상태 분류 | 주요 상태 |
1 | CLOSED, LISTEN |
2 | SYN-SENT, SYN-RECEIVED, ESTABLISHED |
3 | FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING |
- 연결이 수립되지 않은 상태
아직 연결 수립이 이루어지기 전의 호스트는 주로 CLOSED나 LISTEN 상태를 유지하고 있다.
- CLOSED : 아무런 연결이 없는 상태
- LINTEN : 일종의 연결 대기 상태
- 연결 수립 상태
TCP 연결 수립 과정에서는 주로 SYN-SENT, SYN-RECEIVED, ESTABLISHED 상태를 볼 수 있다.
- SYN-SENT : 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태이다.
- SYN-RECEIVED : 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태이다.
- ESTAVLISHED : 연결이 확립되었음을 나타내는 상태이다.
- 연결 종료 상태
TCP 연결을 종료하는 과정에서는 주로 FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSED 상태를 볼 수 있다.
- FIN-WAIT-1 : 일반적인 TCP 연결 종료 과정에 잇어 FIN-WAIT-1은 연결 종료의 첫 단계가 된다. FIN 세그먼트로서 연결 종료 요청을 보낸 액티브 클로즈 호스트는 FIN-WAIT-1상태로 접어들게 된다.
- CLOSE-WAIT : 종료 요청인 FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태이다.
- FIN-WAIT-2 : FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 되면 FIN-WAIT-2 상태가 된다. 상대 호스트의 FIN 세그먼트를 기다리는 상태이다.
- LAST-ACK : CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태이다.
- TIME-WAIT : 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤 접어드는 상태이다.
참고로 CLOSING 상태는 보통 동시에 연결을 종료하려 할 때 전이되는 상태이다. 서로가 FIN 세그먼트 보내고 받은 뒤 각자 그에 대한 ACK 세그먼트를 받지 못했을 때 접어드는 상태이다. 양쪽 모두 연결 종료를 요청하고, 서로의 종료 응답을 기다리는 경우 CLOSING 상태로 접어드는 셈이다.
UDP 데이터그램 구조
UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜이다. 그대서 연결 수립 및 해제, 재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않는다. TCP처럼 상태를 유지하지도 않는다. 상태를 유지하지도, 상태를 유지하지도, 활용하지도 않는다는 점에서 UDP를 스테이트리스(Stateless) 프로토콜의 일종이라고도 한다.
UDP 데이터그램 헤더는 크게 송신지 포트와 수신지 포트, 길이, 체크섬 필드의 네 개 필드로 구성되어 있는다.
- 송신지 포트와 수신지 포트 : 송수신지의 포트 번호가 담긴다.
- 길이 : 헤더를 포함한 UDP 데이터그램의 바이트가 담긴다.
- 체크섬 : 데이터그램 전송 과정에서 오류 발생이 발생했는지 검사하기 위한 필드이다. 신뢰성/비신뢰성과는 관련이 없다.
UDP는 TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있다. 그래서 주로 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰인다.
TCP의 오류·흐름·혼잡 제어
오류 제어: 재전송 기법
- 오류 검출과 재전송
TCP 세그먼트에 오류 검출을 위한 체크섬 필드가 있다고는 하지만, 이것만으로 신뢰성을 보장하기는 부족하다. 체크섬은 세그먼트의 훼손 여부만 나타낼 뿐이고, 체크섬 값이 잘못되었다면 호스트는 해당 패킷을 읽지 않고 폐기하기 때문이다. 결국 체크섬을 이용한다고 해도 송신 호스트가 세그먼트 전송 과정에 문제가 있다는 것을 인지할 수 없다.
TCP가 신뢰성을 제대로 보장하려면 1.우선 송신 호스트가 송신한 세그먼트에 문제가 발생했음을 인지할 수 있어야 한고, 2.오류를 감지하게 되면(세그먼트가 잘못 전송되었음을 알게 되면) 해당 세그먼트를 재전송할 수 있어야 한다.
TCP가 오류를 검출하고 세그먼트를 재전송하는 상황에는 크게 두 가지가 있다. 하나는 중복된 ACK 세그먼트를 수신했을 때이고, 다른 하나는 타임아웃이 발생했을 때이다.
첫째, 중복된 ACK 세그먼트를 수신했을 때
TCP는 중복된 ACK 세그먼트를 수신했을 때 오루가 생겼음을 감지한다. 호스트 A의 n+1번 세그먼트가 잘못 전송되었고, 그에 따라 호스트 B가 n+1번 ACK 세그먼트를 반복해서 전송하는 것을 볼 수 있다.
둘째, 타임아웃이 발생했을 때
TCP는 타임아웃이 발생하면 문제가 생겼음을 인지한다.
TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머(Retransmission Timer)라는 값을 유지한다. 타이머의 카운트다운이 끝난 상황(정해진 시간이 끝난 상황)을 타임아웃(Timeout)이라고 한다. 타임아웃이 발생할 때까지 ACK 세그먼트를 받지 못하면 세그먼트가 상태 호스트에게 정상적으로 도착하지 않았다고 간주하여 세그먼트를 재전송한다.
- ARQ: 재전송 기법
수신 호스트의 답변(ACK)과 타임아웃 발생을 토대로 문제를 진단하고, 문제가 생긴 메시지를 재전송함으로써 신뢰성을 확보하는 방식을 ARQ(Automatic Repeat Request)(자동 재전송 요구)라고 한다. 가장 대표적인 세 가지 방식은 Stop-and-Wait ARQ와 Go-Back-N ARQ 그리고 Selective Repeat ARQ가 있다.
- Stop-and-Wait ARQ
Stop-and-Wait ARQ는 제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않는 방식이다. 즉, 메시지를 송신하고 이에 대한 확인 응답을 받고, 다시 메시지를 송신하고, 이에 대한 확인 응답을 받는 것을 반복한다. 이는 단순하지만, 높은 신뢰성을 보장하는 방식이다.
하지만, 네트워크의 이용 효율이 낮아질 수 있다. 전송되었음을 확인해야만 비로소 다음 전송을 시작하는 Stop-and-Wait ABQ의 특성상, 송신 호스트 입장에서 확인 응답을 받기 전까지는 다음 전송을 할 수 있어도 하지 못한다. 수신 호스트 입장에서도 훨씬 더 많은 데이터를 한번에 전송받을 수 있음에도 불구하고 한 번에 하나씩만 확인 응답을 해야 하므로 성능의 저하로 이어질 수 있다.
- Go-Back-N ARQ
Go-Back-N ARQ는 파이프라이팅 방식을 활용해 여러 세그먼트를 전송하고, 도중에 잘못 전송된 세그먼트가 발샐할 경우 해당 세그먼트부터 전부 다시 전송하는 방식이다. 파이프라이닝(Pipelining)은 연속해서 메시지를 전송할 수 있는 기술이다. 송신 호스트는 여러 세그먼트를 보내고, 수신 호스트는 그에 대한 ACK 세그먼트는 보낸다. 이때 송신 호스트의 순서 번호 n+2번 세그먼트에 대한 ACK 세그먼트를 받지 못했기에 타임아웃이 발생하고, 이를 통해 송신 호스트는 잘못된 송신이 있음을 인지한다.
Go-Back-N ARQ의 ACK 세그먼트를 누적 확인 응답(CACK; Cumulative Acknowledgment)이라고 한다.
- Selective Repeat ARQ
Selective Repeat ARQ는 선택적으로 재전송하는 방법이다. 수신 호스트 측에서 제대로 전송 받은 각각의 패킷들에 대해 ACK 세그먼트를 보낸 방식이다. Selective Repeat ARQ의 ACK 세그먼트는 개별 확인 응답(Selective Acknowledgment)인 셈이다.
흐름 제어: 슬라이딩 윈도우
파이프라이닝 기반의 Go-Back-N ARQ와 Selective Repeat ARQ가 정상적으로 동작하려면 반듷시 흐름 제어(Flow Control)를 고려해야 한다. 호스트가 한 번에 받아서 처리할 수 있는 세그먼트의 양에는 한계가 있기 때문이다.
수신 버퍼는 수신된 세그먼트가 애플리케이션 프로세스에 의해 읽히기 전에 임시로 저장되는 공간이다. 저장 가능한 공간보다 더 많은 데이터를 저장하는 즉, 버퍼(Buffer)가 넘치는(Overflow) 이런 문제 상황을 버퍼 오버플로(Buffer Overflow)라고 한다.
TCP의 흐름 제어란 바로 이러한 문제 상황을 방지하고자 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도록 균이라게 유지하는 것을 의미한다. 송수신 속도를 균일하게 유지할 수 이유는 확인 응답이 오기 전까지는 추가적인 세그먼트를 전송하지 않는 방식이다.
오늘날 TCP에서는 흐름제어로 슬라이딩 윈도우(Sliding Window)를 사용한다. 윈도우(Window)란 송신 호스트가 파이프라이닝할 수 있는 최대량을 의미한다. 윈도우의 크기만큼 확인 응답을 받지 않고도 한 번에 전송 가능하다는 의미이다.
만약 수신 호스트가 첫 번째 세그먼트를 올바르게 수신했다면 수신 윈도우는 오른쪽으로 한칸 이동한다. 또, 두 번째 세그먼트를 올바르게 수신했다면 수신 위도우는 다시 한번 오른쪽으로 한 칸 이동한다. 이렇듯 파이프라이팅 과정에서 송수신 윈도우는 점차 오른쪽으로 미끄러지든 움직인다. 그래서 이러한 TCP 흐름 제어를 슬라이딩 윈도우(Sliding Window)이라고 부르는 것이다.
혼잡 제어
혼잡(Congestion)은 많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 의미한다.
혼잡 제어(Congestion Control)란 혼잡을 제어하기 위한 기능이다. 흐름 제어의 주체가 수신 호스트라면 혼잡 제어의 주체는 송신 호스트이다. 혼잡 제어를 수행하는 송신 호스트는 네트워크 혼잡도를 판단하고 혼잡한 정도에 맞춰 유동적으로 전송량을 조절하며 전송한다.
혼잡 윈도우(Congestion Window)는 혼잡 없이 전송할 수 있을 법한 데이터 양을 의미한다. 혼잡 윈도우가 크면 한 번에 전송할 수 있는 세그먼트 수가 많음을 의미하고, 반대로 혼잡 윈도우가 작다면 네트워크가 혼잡한 상황이기에 한 번에 전송할 수 있는 세그먼트 수가 적음을 의미한다.
혼잡 윈도우 크기는 혼잡 제어 알고리즘을 통해 결정할 수 있다. 혼잡 제어를 수행하는 일련의 방법을 혼잡 제어 알고리즘(Congestion Control Algorithm)이라고 부른다.
AIMD(Additive Increase/Multiplicative Decrease)는 혼잡이 감지 되지 않는 다면 혼잡 윈도우를 RTT(Round Trop Time)마다 1씩 선형적으로 증가시키고, 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복하는 알고리즘이다. 그래서 혼잡 윈도우는 톱니 모양으로 변화한다는 특징이 있다. AIMD 알고리즘을 조금 더 정교하게 만드는 1.느린 시작, 2.혼잡 회피, 3.빠른 회복이라는 세 가이 알고리즘이 있다.
1. 느린 시작 알고리즘
느린 시작(Slow Start) 알고리즘은 혼잡 윈도우를 1부터 시작해 문제 없이 수신된 ACK 세그먼트 하나당 1씩 증가시키는 방식이다. 결과적으로 혼잡 윈도우는 RTT마다 2배씩 지수적으로 증가하게 된다. AIMD 방식은 처음 연결이 수립된 뒤 혼잡 윈도우 크기가 증가되는 속도가 느리다. 선형적으로 혼잡 윈도우를 증가시키므로 초기 전송 속도가 확보되지 않는 것이다.
혼잡 윈도우를 언제까지나 지속적을 증가시킬 수는 없다. 혼잡 윈도우가 계속 지수적으로 증가하다 보면 언젠가는 혼잡 상황을 마주할 확률이 높아지기 때문이다. 느린 시간 알고리즘을 사용할 떄 함꼐 사용하는 값으로 느린 시작 임계치(Slow Start Threshold)라는 값이 정해져 있다. 혼잡 윈도우 값이 계속 증가하다가 느린 시작 임계치 이상이 되거나, 타임아웃이 발생하거나 세 번의 중복된 ACK 세그먼트가 발생하여 혼잡이 감지되면 다음 세 가지 방법 중 하나를 선택하게 된다.
상황 분류 | 방법 |
타임아웃 발생 | 혼잡 윈도우 값을 1로, 느린 시작 임계치를 촌잡이 감지되었을 시점의 혼잡 윈도우 값을 절반으로 초기화한 뒤 느린 시작 재게 |
혼잡 윈도우 >= 느린 시작 임계치 | 느린 시작 종료, 후선 윈도우를 절반으로 초기화한 뒤 혼잡 회피 수행 |
세 번의 중복 ACK 발생 | (빠른 재전송 후) 빠른 회복 수행 |
2. 혼잡 회피 알고리즘
혼잡 회피(Congestion Avoidance) 알고리즘은 RTT마다 혼잡 윈도우를 1MSS(Maximum Segment Size)씩 증가시키는 알고리즘이다. 혼잡 윈도우 크기를 선형적으로 증가시킨다. 느린 시작 임계치를 넘어선 시점부터는 혼잡이 발생할 우려가 있으니 조심해서 혼잡 윈도우 크기를 선형적으로 증가시키는 것을 볼 수 있다. 느린 시작 임걔치를 넘어선 시점부터는 혼잡이 발생할 우려가 있으니 조심해서 혼잡 윈도우를 증가시키는 방식이라고 보면 된다.
혼잡 회피 도중 타임아웃이 발생하면 혼잡 윈도우 값은 1로, 느린 시작 임계치는 혼잡이 감지된 시점의 혼잡 윈도우 값의 절반으로 초기화한 뒤 다시 느린 시작을 수행한다. 그리고 혼잡 회피 도중 세 번의 중복 ACK 세그먼트가 발생되었을 때는 혼잡 윈도우 값과 느린 시작 임계치를 대략 절반으로 떨어뜨린 뒤 빠른 회복 알고리즘을 수행한다. 물론 이때 타임아웃이 발생한 세그먼트나 세 번의 중복 ACK 세그먼트가 발생한 세그먼트는 재전송한다.
3. 빠른 회복 알고리즘
빠른 회복(Gast Recovery) 알고리즘은 세 번의 중복 ACK 세그먼트를 수신했을 떄 누린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘이다. 빠른 회복 도중이라도 타임아웃이 발생하면 혼잡 윈도우 크기는 1로, 느림 임계치는 혼잡이 감지된 시점의 절반으로 떨어뜨린 후 다시 느린 시작을 수행한다.
DCN: 명시적 혼잡 알림
명시적 혼잡 알림(ECN; Explicit Congestion Notification)은 최근 혼잡을 회피하기 위해 네트워크 중간 장치(주로 라우터)의 도움을 받는 방법이다.
'Network > 혼자 공부하는 네트워크' 카테고리의 다른 글
혼공네트 - 5차시_응용 계층 (4) | 2024.09.07 |
---|---|
혼공네트 - 3차시_네트워크 계층 (4) | 2024.08.31 |
혼공네트 - 2차시_물리 계층과 데이터 링크 계층 (1) | 2024.08.27 |
혼공네트 - 1차시_컴퓨터 네트워크 시작하기 (0) | 2024.08.25 |