저번에 학습한 네트워크 계층의 IP는 한계점이 있다.
그것은 바로 신뢰할 수 없는 통신 과 비연결형 통신을 한다는 점이다.
신뢰할 수 없는 통신 은 IP 프로토콜이 패킷이 수신지까지 제대로 전송되었다는 보장을 하지않는 특징이다.
패킷의 데이터가 손상되거나 중복된 패킷이 전송되어도 확인하지 않고, 재전송하지 않으며, 순서대로 패킷이 도착할 것이라는 보장도 해주지 않는다.
이러한 전송 특성을 다른 말로 최선형 전달 이라고도 한다.
이는 최선을 다해 보겠지만, 전송 결과에 대해서는 어떠한 보장도 하지 않습니다 를 의미한다.
비연결형 통신은 송수신 호스트 간에 사전 연결 수립 작업을 거치지 않는 특징을 의미한다.
그저 수신지를 향해 패킷을 내보내기만 할 뿐이다.
그렇지만 이런 특징은 모든 패킷이 제대로 전송되었는지 일일이 확인하고, 호스트 간의 연결을 수립하는 작업이 없기 때문에 패킷의 빠른 송수신이 가능하다.
금융 서비스처럼 반드시 신뢰성 있는 전송을 보장해야 하는 경우가 있는 반면, 동영상 스트리밍 서비스나 실시간 영상 통화처럼 빠른 전송이 우선시 되는 경우도 있다.
이처럼 신뢰성 있는 전송이 모든 경우에 필요하지는 않다.
아무튼, 이러한 두 특징을 보완할 수 있는 연결형 통신을 지원하는 대표적인 프로토콜로 TCP가 있는데, 아래서 차차 살펴볼 것이다.
IP의 신뢰할 수 없는 전송 특성과 비연결형 전송 특성을 보완하기 위한 네트워크 계층의 프로토콜로 ICMP가 있다.
ICMP는 IP 패킷의 전송 과정에 대한 피드백 메시지를 얻기 위해 사용하는 프로토콜이다.
유의해야할 점은, ICMP가 IP의 신뢰성을 보장하지 않는다는 것이다.
데이터 전송을 보장해주는게 아닌, 네트워크 문제 진단 및 오류 보고를 위한 프로토콜인 것이다.
ICMP 메시지 종류로는 크게 두 가지가 있다.
만약, 네트워크 외부에서 내가 전송받으려는 사진 파일을 구성하는 패킷들이 라우팅되어 컴퓨터로 도착했다고 가정해보자.
그리고 나는 컴퓨터로 웹 브라우저, 게임, 메신저 프로그램을 실행하고 있다.
패킷이 컴퓨터에 도달했으니까, 전송이 끝난 것일까?
아니다. 이 패킷들은 실행 중인 특정 애플리케이션 프로세스까지 전달되어야 한다.
즉, 패킷의 최종 수신 대상은 특정 애플리케이션 프로세스라는 것이다.
패킷이 실행 중인 특정 애플리케이션 까지 전달되려면, 패킷에 특정 애플리케이션을 식별할 수 있는 정보 가 포함되어야 한다. 이러한 정보를 포트 라고 한다.
전송 계층에서는 포트 번호 를 통해 특정 애플리케이션을 식별한다.
정확히는 수신지 포트와 송신지 포트를 통해 송수신지 호스트의 애플리케이션을 식별한다.
포트 번호는 16비트로 표현 가능하고, 번호의 범위에 따라 세 종류로 나뉜다.
각각 잘 알려진 포트, 등록된 포트, 동적 포트 이다.

0번 ~ 1023 번 포트
시스템 포트라고도 불림
범용적으로 사용되는 애플리케이션 프르토콜이 일반적으로 사용하는 포트 번호를 의미

사설 포트, 임시 포트 라고도 불림보통, 서버 는 잘 알려진 포트 혹은 등록된 포트 로 동작하는 경우가 많고,
클라이언트 는 동적 포트 번호 중 임의의 번호가 할당되는 경우가 많다.
IP 주소와 포트 번호에 대한 정보가 함께 주어지면, 특정 호스트에서 실행 중인 특정 애플리케이션 프로세스 를 식별할 수 있는데, 그래서 포트 번호는 IP 주소:포트 번호 형식으로 IP와 함께 표기되는 경우가 많다.
192.168.0.15:8000 처럼 말이다.
전송 계층은 신뢰할 수 있는 연결형 통신이 가능한 프로토콜을 제공하기에, 네트워크 계층의 한계를 보완할 수 있고, 포트를 통해 응용 계층의 애플리케이션을 식별함으로써 응용 계층과의 연결 다리 역할을 수행한다.
NAT이란 IP 주소를 변호나하는 기술이며 사설 IP 주소와 공인 IP 주소를 변환하는데 사용된다고 했다. 이러한 변환을 위해 주로 사용되는 것이 NAT 변환 테이블 이다.
NAT 변환 테이블은 다음 그림처럼 변환의 대상이 되는 IP 주소 쌍이 명시되어 있다.

그런데, 이런 방식에는 한 가지 문제점이 있다.
테이블을 자세히 살펴보면 사설 IP 주소 하나 당 공인 IP 주소가 대응되는데, 이는 결국 사설 IP 주소의 수만큼 공인 IP 주소가 필요하다는 말이다.
이런 이유로 오늘날 대중적으로 활용되는 NAT은 다수의 사설 IP 주소를 그보다 적은 공인 IP 주소로 변환하는 방식을 채택한다.
여기서 바로 포트가 활용된다.
NAPT는 포트를 활용해 하나의 공인 IP 주소를 여러 사설 IP 주소가 공유할 수 있도록 하는 NAT의 일종이다.
NAPT는 다음 그림처럼, NAT 테이블에 변환할 IP 주소 쌍과 더불어 포트 번호도 함께 기록하고 변환한다.

같은 공인 IP 주소로 변환되더라도 포트 번호가 다르기 때문에 내부 IP 주소를 구분할 수 있게 되는 것이다.
이 방식 덕분에, 사설 IP 주소와 공인 IP 주소를 N : 1로 관리할 수 있다.
NAT 변환 테이블이 백지 상태일 때, 외부에서 내부 네트워크로의 연결을 시도한다고 가정하자.
하지만 NAT은 외부에서 오는 "새로운 연결"을 기본적으로 차단하기 때문에, 그냥은 통신이 불가능하다.
그러나 포트 포워딩(port forwarding)을 사용하면 가능하다!
포트 포워딩이란, 네트워크 내 특정 장치(호스트)에 미리 IP 주소와 포트 번호를 할당하고,
외부에서 해당 "IP주소:포트번호"로 들어오는 트래픽을 해당 장치로 전달하는 기능이다.
쉽게 말해, 외부에서 오는 트래픽을 내가 원하는 내부 장치로 안내하는 길잡이 역할을 한다.
즉, 특정 외부 포트로 들어오는 요청이 있으면, 미리 지정한 내부 IP와 내부 포트로 트래픽을 유도하는 방식이다.
이를 통해 내부 네트워크 정보(IP 주소 등)는 외부에 노출되지 않은 채로 통신이 가능해진다.
네트워크 계층에서 가장 중요한 프로토콜이 IP라면, 전송 계층에서 가장 중요한 프로토콜은 TCP와 UDP 이다.
TCP(Transmission Control Protocol 는 신뢰할 수 있는 통신을 위한 연결형 프로토콜이고,
UDP(User Datagram Protocol) 는 TCP보다 신뢰성은 떨어지지만 비교적 빠른 통신이 가능한 비연결형 프로토콜이다.
TCP 통신을 세 단계로 나누면 다음과 같다.
MTU는 헤더의 크기까지 포함했던 반면, MSS는 TCP 헤더 크기는 제외한다.

이 중에서, TCP의 기본 동작을 이해하기 위한 기본적인 필드를 살펴보자.
순서 번호 란 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호다음으로 수신하기를 기대하는 순서 번호가 명시됨플래그 비트 라고도 부름수신 윈도우 란 한 번에 수신하고자 하는 데이터의 양을 나타냄제어 비트는 기본적으로 8비트로 구성된다. TCP의 기본 동작을 논할 때 가장 자주 언급되는 세 개의 제어비트는 아래와 같다.
해당 비트가 1로 설정되어 있다는걸 편의상 SYN 세그먼트 와 같이 지칭하겠다
TCP의 신뢰성을 보장하기 위한 필드로, 한 쌍으로 묶어서 기억하는게 편하다.
순서 번호 가 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호로, 세그먼트 데이터의 첫 바이트에 부여되는 번호라고 했는데 이것이 무슨 의미인지 알아보자.
만약, 내가 응용 계층을 전송해야 하는 데이터가 1900바이트 크기의 데이터고, 이는 MSS 단위로 전송될 수 있다. MSS가 500 바이트라고 가정했을 때, 다음 그림처럼 네 개의 세그먼트로 쪼갤 수 있을 것이다.

위 사진과 같이, SYN 플래그가 1로 설정된 첫 번째 세그먼트의 경우, 무작위의 순서 번호 가 지정이 되는데, 이를 초기 순서 번호(ISN; Initial Sequence Number) 라고 한다.
그 이후의 순서 번호는 초기 순서 번호 + 송신한 바이트 수 (떨어진 바이트 수) 가 된다.
SYN 플래그가 1이라는 것은 해당 패킷이 연결 수립용 이라는 것을 의미한다.
예를 들어, 세그먼트 B는 500바이트 이므로 순서번호가 100 + 500 = 600 이 되고,
세그먼트 C는 600 + 500 = 1100 이 된다.
확인 응답 번호 는 순서 번호에 대한 응답이다.
다음으로 제가 받을 순서 번호는 이것입니다 를 의미하고,수신한 순서 번호 + 1(ACK + 1) 로 설정된다.
다음 그림처럼 호스트 순서 번호가 8000인 세그먼트를 잘 수신한 뒤, 8001 번 세그먼트를 받기를 원한다면, 확인 응답 번호로 8001를 명시한 세그먼트를 전송한다.

쓰리 웨이 핸드 셰이크 란 세 단계로 이루어진 TCP의 연결 수립 과정을 의미한다.
아래 사진처럼 세 단계를 거친 후, 본격적인 송수신이 시작된다.
사진에 보이는 액티브 오픈 이란, 처음 연결을 시작하는 호스트의 연결 수립 과정을 말하며 여기서는 클라이언트가 TCP 연결을 시작하는 과정 이다.
패시브 오픈 이란 서버가 연결 요청을 기다리는 과정 이다.
서로의 초기 시퀀스 번호를 알아야 이후 데이터 전송 시 순서와 무결성을 보장할 수 있기 때문에, 서로를 소개하는 과정이라고 생각하면 되겠다.
사진처럼 송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 이루어진다.
액티브 클로즈 는 먼저 연결을 종료하려는 호스트에 의해 수행되는 과정 (주로 클라이언트) 이고,
패시브 클로즈 는 연결 종료 요청을 받아들이는 호스트에 의해 수행 (주로 서버) 되는 과정이다.
TCP는 연결형 통신과 신뢰할 수 있는 통신을 위해 다양한 상태 를 유지한다.
상태 란 현재 어떤 통신 과정에 있는지를 나타내는 정보이다.
이러한 이유 때문에스테이트풀(stateful) 프로토콜의 일종이라고도 한다.
주요 상태는 아래와 같다.
1번 : 연결이 수립되지 않은 상태
2번 : 연결 수립 과정에서 주로 볼 수 있는 상태
3번 : 연결 종료 과정에서 주로 볼 수 있는 상태
로 생각하면 쉽다.
CLOSED : 아무런 연결이 없는 상태LISTEN : 일종의 연결 대기 상태.
SYN-SENT : 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤, SYN + ACK 세그먼트를 기다리는 상태SYN-RECEIVED : 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태ESTABLISHED : 연결이 확립되었음을 나타내는 상태 -> 데이터 송수신 가능 상태
FIN-WAIT-1 : 액티브 클로즈 호스트가 FIN 세그먼트를 보낸 직후의 상태CLOSED-WAIT : FIN 세그먼트를 받은 패시브 클로즈 호스트가 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태FIN-WAIT-2 : FIN-WAIT-1 상태에서 ACK 세그먼트를 받은 뒤, 상대 호스트의 FIN 세그먼트를 기다리는 상태LAST-ACK : CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태TIME-WAIT : 액티브 클로즈 호스트가 FIN 세그먼트를 수신한 뒤, 이에 대한 ACK 세그먼트를 전송한 뒤의 상태.CLOSING : 동시에 연결을 종료하려 할 때 전이되는 상태.
UDP 는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜이다.
따라서 연결 수립 및 해제 재전송을 통한 오류제어 혼잡 제어 흐름 제어 를 수행하지 않는다.
TCP처럼 상태를 유지하지도 않기 때문에 스테이트리스(stateless) 프로토콜의 일종이라고도 한다.
적은 오버헤드로 패킷을 빠르게 처리 가능하기 때문에, 실시간성이 강조되는 상황에서 TCP 보다 많이 쓰인다.
수신지까지 잘 도착했는지 를 나타내는 신뢰성/비신뢰성과 관련이 없음
TCP가 하나씩 확실히 전달한다면, UDP는 사진처럼 빠르게 마구 던지는 것과 같다.
그 과정에서 패킷이 손실되거나 순서가 바뀔 수 있다.
오류 제어, 흐름 제어, 혼잡 제어 는 모두 TCP의 신뢰성을 보장하기 위한 기능이다.
TCP는 재전송을 기반으로 다양한 오류를 제어하고, 흐름 제어를 통해 처리할 수 있을 만큼의 데이터만을 주고받으며, 혼잡 제어를 통해 네트워크가 혼잡한 정도에 따라 전송량을 조절한다.
오류를 제어하기 위해 TCP는 잘못된 세그먼트를 재전송하는 방법을 사용한다.
그렇다면, 송신 호스트가 세그먼트 전송 과정에 문제가 있음을 인지해야 할텐데, 체크섬 은 세그먼트의 훼손 여부만 나타낼 뿐이다.
이 체크섬 값이 잘못되었다면 수신 호스트는 해당 패킷을 폐기할 뿐, 송신 호스트가 이를 알아차릴 수 없다.
따라서, TCP가 신뢰성을 보장하려면
1. 송신 호스트가 송신한 세그먼트에 문제가 있음 을 인지해야 하고,
2. 오류를 감지하면, 해당 세그먼트를 재전송 할 수 있어야 한다.
그렇다면, TCP가 어떤 상황에서 송신한 세그먼트에 문제가 있음을 감지하는가를 알아야 한다.
이 상황에는 크게 두 가지가 있다.
하나는 중복된 ACK 세그먼트를 수신했을 때이고, 하나는 타임아웃이 발생했을 때이다.
수신 호스트 측이 받은 세그먼트의 순서 번호 중에서 일부가 누락되었다면, 특정 세그먼트를 보내달라는 요청을 반복해서 전송할 것이다. 이 상황이 이에 해당한다.
이 때 빠른 재전송이 발생한다.
빠른 재전송 은 재전송 타이머가 만료되기 전이라도 세 번의 중복 ACK 세그먼트가 수신되었다면 해당 세그먼트를 곧바로 재전송하는 기능이다.
세그먼트의 일부가 유실되어, 수신 호스트가 동일한 ACK 세그먼트를 전송해 송신 호스트가 세 번의 동일한 ACK 세그먼트를 수신하면, 곧바로 재전송을 하기에 타이머가 끝날 때까지 기다리는 시간을 줄일 수 있다.
TCP는 타임아웃이 발생하면 문제가 생겼음을 인지한다.
TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머 라는 값을 유지한다.
호스트가 세그먼트를 전송할 때마다 재전송 타이머를 시작하게 되는데, 이 타이머의 카운트다운이 끝난 상황을 타임 아웃 이라고 한다.
타임아웃이 발생할 까지 ACK 세그먼트를 받지 못하면, 세그먼트가 상대 호스트에게 정상적으로 도착하지 않았다고 간주 하여 세그먼트를 재전송한다.
수신 호스트의 답변(ACK)과 타임아웃 발생을 토대로 문제를 진단하고, 문제가 생긴 메시지를 재전송함으로써 신뢰성을 확보하는 방식을 ARQ (Automatic Repeat Request)라고 한다.
ARQ의 종류는 다양한데, 가장 대표적인 세 가지 방식인 Stop-and-Wait ARQ와 GO-Back-N ARQ 그리고 Selective Repeat ARQ 에 대해 알아보겠다.
참고로, 전송 계층의 TCP는 ARQ를 사용하는 대표적인 프로토콜이지만, ARQ 자체는 전송 계층만의 기술은 아니다.
Stop-and-Wait ARQ 는 제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않는 방식이다.
단순하지만 높은 신뢰성을 자랑한다.
하지만, 송신 호스트 입장에서 확인 응답을 받기 전까지는 다음 전송을 할 수 있어도 하지 못하기 때문에 네트워크 이용 효율이 낮다 는 단점이 있다. 이는 결국 성능의 저하로 이어진다.
따라서 오늘날의 인터넷 환경의 TCP에서는 특별한 경우가 아닌 이상 이 방식을 사용하지 않는다.
위 방식을 해결하려면, 아래 그림처럼 각 세그먼트에 대한 ACK 세그먼트가 도착하기 전이더라도 여러 세그먼트를 보낼 수 있어야 한다.
이렇게 연속해서 메시지를 전송할 수 있는 기술을 파이프라이닝(pipelining) 이라고 한다.
오늘날의 TCP는 파이프라이닝 기술이 사용되는 나머지 두 방식을 기반으로 동작한다.
Go-Back-N ARQ 는 여러 세그먼트를 전송하고, 도중에 잘못 전송된 세그먼트가 발생할 경우 해당 세그먼트부터 전부 다시 전송하는 방식이다.
위 사진처럼, n+2번 세그먼트를 전송했지만 손실이 났을 경우, 이에 대한 ACK 세그먼트를 받지 못지 못했기에 타임아웃이 발생한다.
이 때, 송신 호스트는 잘못된 송신이 있음을 인지하고, ACK 세그먼트를 수신받지 못한 n+2 번 세그먼트부터 다시 전송하게 된다.
여기서 순서 번호 n번에 대한 ACK 세그먼트는 'n번까지의' 확인 응답이라고 할 수 있으므로, Go-Back-N ARQ의 ACK 세그먼트를 누적 확인 응답 이라고 한다.
Selective Repeat ARQ는 이름 그대로 선택적으로 재전송하는 방법이다.
Go-Back-N ARQ 송신 과정은 모든 세그먼트를 다시 재전송해야한다는 단점이 있지만, 이 방식은 수신 호스트 측에서 제대로 전송받은 각각의 패킷들에 대해 ACK 세그먼트를 전송하는 방식이다.
이 때문에 해당 방식의 ACK 세그먼트를 개별 확인 응답 이라고 부른다.
호스특 한 번에 받아서 처리할 수 있는 세그먼트의 양에는 한계가 있기 때문에, 파이프라이닝 기반의 ARQ 재전송 기법이 동작하려면 반드시 흐름 제어를 고려해야 한다.
만약 수신 호스트가 한 번에 n개의 바이트를 받아서 처리할 수 있다면, 송신 호스트는 이 점을 인지하여 n개 바이트를 넘지 않는 선에서 송신해야한다.
더 많은 양을 전송할 경우 일부 세그먼트가 처리되지 못할 수도 있기 때문이다.
TCP의 흐름제어란 이런 문제 상황을 방지하고자 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 유지하는 것을 의미한다.
참고로, Stop-and-Wait ARQ를 사용하면 확인 응답이 오기 전까지는 추가적인 세그먼트를 전송하지 않기에 별도의 흐름 제어가 필요하지 않다.
파이프라이닝이 연속해서 세그먼트를 전송할 수 있는 기술이긴 하지만, 무작정 무한한 데이터를 연속해서 보낼 수는 없기에 슬라이딩 윈도우 라는 방식이 필요하다.
슬라이딩 윈도우를 이해하기 전, 먼저 윈도우(window) 에 대한 이해가 필요하다.
윈도우 란 송신 호스트가 파이프라이닝할 수 있는 최대량을 의미한다.
윈도우의 크기만큼 확인 응답을 받지 않고도 한 번에 전송가능하다는 의미이다.
윈도우의 크기가 크면 한 번에 전송할 수 있는 데이터가 많을 것이고,
윈도우의 크기가 작으면 한 번에 전송할 수 있는 데이터가 적을 것이다.
윈도우 크기에서 벗어난 숫자에 해당하는 세그먼트는 전송할 수 없다.
첫 번째, 두 번째, 세 번째, 네 번째 세그먼트를 전송했고, 수신 호스트로부터 첫 번째 세그먼트에 대한 ACK를 받았다고 가정해보자. 그렇다면 윈도우는 아래처럼 오른쪽으로 한 칸 이동하게 된다.
윈도우가 점차 오른쪽으로 미끄러지듯 움직이는데, 이러한 흐름 제어를 슬라이딩 윈도우 라고 부른다.
송신 호스트만 윈도우를 고려하는 것은 아니고, 수신 호스트도 윈도우를 고려한다.
사실, 송신측 윈도우(송신 윈도우) 는 수신 호스트가 알려주는 수신 측 윈도우(수신 윈도우)를 토대로 알 수 있는 정보이다.
TCP 세그먼트 구조에서, 윈도우 필드에 명시되는 값이 바로 이 수신 윈도우 의 크기다.
혼잡 이란 많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황을 의미한다.
혼잡 제어 란 이와 같은 혼잡을 제어하기 위한 기능이다.
혼잡 제어를 수행하는 송신 호스트는 네트워크 혼잡도를 판단하고 혼잡한 정도에 맞춰 유동적으로 전송량을 조절하며 전송한다.
혼잡 윈도우 는 혼잡 없이 전송할 수 있을 법한 데이터 양을 의미하는데, 혼잡 윈도우가 작다면 네트워크가 혼잡한 상황이기에 한 번에 전송할 수 있는 세그먼트 수가 작음을 의미한다.
이 혼잡 윈도우 크기가 어느 정도가 적당한지는 혼잡 제어 알고리즘을 통해 결정할 수 있다.
의미를 직역하면 합으로 증가, 곱으로 감소 라는 의미이다.
혼잡이 감지되지 않는다면 혼잡 윈도우를 RTT마다 1씩 선형적으로 증가시키고,
혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복하는 알고리즘이다.
AIMD 알고리즘은 혼잡을 제어할 수 있는 가장 기본적인 아이디어이지만, 이것만으로 혼잡 제어가 가능하지는 않다. 이를 조금 더 정교하게 만들 혼잡 제어 알고리즘은 다음과 같다.
1. 느린 시작(slow start)
2. 혼잡 회피(congestion avoidance)
3. 빠른 회복(fast recovery)
혼잡 윈도우를 1부터 시작해 수신된 ACK 세그먼트 하나당 1씩 증가시키는 방버이다.
결과적으로 다음 그림처럼 2배씩 지수적으로 증가하게 된다.
AIMD 방식은 처음 연결이 수립된 뒤, 혼잡 윈도우 크기가 증가되는 속도가 느리기 때문에, 이 알고리즘을 활용하면 초기 전송 속도를 어느 정도 빠르게 확보할 수 있다는 장점이 있다.
하지만, 혼잡 윈도우를 언제까지나 지수적으로 증가시킬 수는 없다. 그렇게되면 언젠가 혼잡 상황을 마주할 확률이 높아지기 때문이다.
그렇다면 언제까지 증가해야 할까?
느린 시작 알고리즘을 사용할 때 함께 사용하는 값으로 느린 시작 임계치(slow start threshold) 라는 값이 정해져 있다.
혼잡 윈도우 값이 계속 증가하다가 느린 임계치 이상 이 되거나 타임 아웃이 발생 하거나, 세 번의 중복된 ACK 세그먼트가 발생 하여 혼잡이 감지되면 다음 세 가지 방법 중 하나를 선택하게 된다.
혼잡 회피 알고리즘은 RTT 마다 혼잡 윈도우를 1MSS(Maximum Segment Size)씩 증가시키는 알고리즘이다.
혼잡 윈도우를 지수적으로 증가시키는 느린 시작과는 달리, 혼잡 윈도우 크기를 선형적으로 증가시키는 것을 볼 수 있다.
느린 시작 임계치를 넘어선 시점부터는 혼잡이 발생할 우려가 있으니, 조심해서 혼잡 윈도우를 증가시키는 방식이다.
혼잡 회피 도중에도 혼잡이 발생하면 위 세 가지 상황을 나타낸 표의 절차대로 수행한다.
세 번의 중복된 ACK 세그먼트를 수신하면 빠른 재전송과 더불어 빠른 회복 알고리즘이 수행된다.
빠른 회복 알고리즘은 세 번의 중복 ACK 세그먼트를 수신했을 때, 느린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘으로, 빠르게 전송률을 회복하기 위한 알고리즘이다.
다만, 빠른 회복 도중이라도 타임아웃이 발생하면 혼잡 윈도우 크기는 1로, 느린 시작 임계치는 혼잡이 감지된 시점의 절반으로 떨어뜨린 후 다시 느린 시작을 수행한다.
지금까지 학습한 혼잡 제어 알고리즘을 그림으로 정리하면 다음과 같다.
TCP에 대해 설명해주세요.
TCP는 신뢰성이 보장되는 연결형 프로토콜입니다.
3-way handshake로 연결을 설정하고, 4-way handshake로 해제합니다.
시퀀스 넘버와 ACK 넘버를 활용해 패킷이 순서대로 도착하도록 보장하며, 오류 제어와 흐름 제어를 통해 패킷 손실 시 재전송하여 신뢰성을 유지합니다.
또한, 혼잡 제어를 통해 네트워크 상태에 따라 전송 속도를 조절하여 효율적인 데이터 전송을 보장합니다.
3 way handshake에 대해 설명해주세요.
3 way handshake는 세 단계로 이루어진 TCP의 연결 수립 과정을 의미합니다.
먼저, 클라이언트가 서버에게 연결 요청을 보내면서 SYN(Synchronizaion) 패킷을 전송합니다.
그러면 서버는 이 요청을 받고, 응답으로 SYN 패킷과 ACK(Acknowledgement) 패킷을 전송합니다.
마지막으로, 클라이언트가 이를 확인했다는 의미로 ACK 패킷을 보내면 연결이 완료됩니다.
4 way handshake에 대해 설명해주세요.
4 way handshake는 네 단계로 이루어진 TCP의 연결 해제 과정을 의미합니다.
먼저, 클라이언트가 서버에게 연결을 해제하겠다는 의미의 FIN(Finish) 패킷을 전송합니다.
그러면 서버는 이 요청을 받고, 응답으로 ACK 패킷을 전송합니다.
그리고 서버도 연결을 종료하기 위해 클라이언트에게 FIN 패킷을 전송합니다.
마지막으로, 클라이언트가 이를 확인했다는 의미로 ACK 패킷을 보내면 연결이 완전히 종료됩니다.
TCP 빠른 재전송에 대해서 설명해주세요.
빠른 재전송이란 패킷 손실을 감지하고 재전송 타이머 만료를 기다리지 않고 즉시 재전송하는 TCP 메커니즘입니다.
만약, 세 번의 중복 ACK 세그먼트가 수신되었다면 패킷이 손실되었다고 간주하고 해당 세그먼트를 곧바로 재전송합니다.
Flow control에 대해 설명해주세요.
흐름 제어(Flow Control)는 송신자가 수신자의 처리 속도를 초과하지 않도록 데이터 전송을 조절하는 메커니즘입니다.
TCP에서 대표적인 흐름 제어 방식으로는 슬라이딩 윈도우(Sliding Window) 가 있으며, 수신자는 자신의 버퍼 상태에 따라 윈도우 크기를 송신자에게 알려줍니다.
송신자는 이 정보를 기반으로 데이터 전송 속도를 조절하여 수신 버퍼 오버플로우를 방지하고, 안정적인 데이터 흐름을 유지합니다.
Congestion control에 대해 설명해주세요.
혼잡 제어(Congestion Control)는 네트워크에서 트래픽이 과도하게 증가하여 패킷 손실이나 지연이 발생하는 것을 방지하는 메커니즘입니다.
TCP에서는 AIMD(Additive Increase, Multiplicative Decrease), 느린 시작, 혼잡 회피, 빠른 회복 알고리즘 등의 기법을 활용하여 네트워크 상태에 따라 전송 속도를 동적으로 조절합니다.
이를 통해 네트워크 자원을 효율적으로 사용하고, 패킷 손실을 최소화하며 안정적인 데이터 전송을 보장합니다.
전송후 대기 프로토콜이 뭘까요?
전송후 대기(Stop-and-Wait) 프로토콜은 송신자가 하나의 패킷을 전송한 후, 수신자로부터 응답(ACK)을 받을 때까지 대기하는 방식의 흐름 제어 프로토콜입니다.
단순하고 높은 신뢰성을 보장하지만, 응답이 오기 전까지는 전송이 중단되므로 네트워크 이용 효율이 낮다는 단점이 있습니다.
파이프라이닝 프로토콜이 뭘까요?
파이프라이닝(Pipelining) 프로토콜은 여러 개의 패킷을 연속으로 전송하여 전송 효율을 높이는 프로토콜입니다.
이는 전송후 대기(Stop-and-Wait) 프로토콜의 비효율성을 보완하기 위해 사용되며, 송신자는 수신자의 응답(ACK)을 기다리지 않고 일정한 윈도우 크기만큼 연속적으로 패킷을 전송할 수 있습니다.
대표적인 파이프라이닝 프로토콜로는 오류가 발생하면 해당 오류 패킷 이후의 모든 패킷을 다시 전송하는 Go-Back-N 과 오류가 발생한 패킷만 재전송하는 Selective Repeat이 있습니다.
UDP에 대해 설명해주세요.
UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜로, 데이터를 빠르게 전송하는 데 초점을 맞춘 프로토콜입니다.
실시간 스트리밍과 온라인 게임같은 데이터의 정확성보다 빠른 전송이 중요한 경우 사용됩니다.
UDP의 장단점을 설명해 주세요.
UDP는 비연결형 프로토콜로, 빠른 전송이 가능하다는 장점이 있습니다.
또한, 헤더 크기가 작아 오버헤드가 적고, 연결 설정 과정 없이 바로 데이터를 전송할 수 있어 지연 시간이 짧다는 장점도 있습니다.
하지만, 흐름 제어 및 혼잡 제어가 없어서 패킷 손실 및 순서 오류가 발생하더라도 재전송하지 않기에, 신뢰할 수 없다는 단점이 있습니다.
UDP 체크섬에 대해 설명해주세요.
UDP 체크섬은 데이터그램이 전송 중 오류가 발생했는지 검사하기 위한 필드입니다.
송신자가 데이터의 체크섬 값을 계산하여 UDP 헤더에 포함하면, 수신자는 이를 다시 계산하여 일치 여부를 확인합니다.
만약 값이 다르면 데이터가 손상된 것으로 판단하고 폐기합니다.
다만, 체크섬은 오류 감지만 할 뿐, 재전송을 수행하지 않기 때문에 UDP의 신뢰성과는 무관합니다.
ICMP가 뭘까요?
ICMP는 IP 패킷의 전송 과정에 대한 피드백 메시지를 얻기 위해 사용하는 프로토콜이다.
IP 프로토콜과 함께 동작하며, 데이터 전송 중 발생하는 문제를 감지하고 알리는 역할을 합니다.
대표적인 ICMP 메시지로는 ping 요청 및 응답(Echo Request/Reply), TTL 초과(Time Exceeded) 메시지가 있습니다.
ping 명령어를 통해 ICMP 패킷을 송신하여 네트워크를 진단할 수 있습니다.
네트워크 연결 상태를 확인하는 데 활용되지만, 신뢰성 있는 전송을 보장하지는 않음에 유의해야 합니다.