서로 다른 호스트 사이에서 동작하는 애플리케이션 프로세스에게 직접 통신 서비스를 제공하는 역할을 담당한다. 네트워크 계층이 호스트와 호스트 사이 간의 데이터를 전송을 담당한다면, 전송 계층은 호스트 내부의 애플리케이션까지의 데이터 전송을 담당한다.
위 그림과 같이, 전송 계층은 종단 시스템에서 구현된다. 송신 측은 애플리케이션 프로세스로부터, 즉 상위 계층으로 부터 받은 데이터를 작은 조각으로 분할하여 각각의 조각에 전송 계층 헤더(ex TCP 헤더)를 추가하여 네트워크 계층으로 보낸다. 네트워크 계층 패킷 안에서 캡슐화 되어 전달된다. (패킷 안에 세그먼트 필드를 라우터는 검사하지 않음)
대표적으로 TCP와 UDP가 존재한다. 해당 포스팅에서는 TCP에 대해 서술한다.
- 데이터의 목적지가 어떤 애플리케이션인지 식별
- IP에 의해 전달되는 패킷의 오류 검사 및 재전송 요구하여 신뢰성 있는 데이터 전달
연결 지향적인 프로토콜로, 데이터의 신뢰성을 보장하고 흐름제어를 관리한다. 데이터 세그먼트를 안정적으로 전송하고, 손실된 데이터의 복구, 순서, 보장, 중복 데이터 제거 등의 기능을 제공한다.
3-way Handshake(연결 설정) : 데이터를 전송하기 전, 상대방 호스트와 데이터를 전송하기 전, 연결을 수립하는 과정
4-way Handshake(연결 해제) : 연결을 해제(종료)하는 과정
연결 설정과 연결 종료 과정이 차이나는 이유
클라이언트가 데이터 전송을 마쳤더라도, 서버 측에서 아직 보낼 데이터가 남을 수 있기 때문에, FIN에 대한 ACK 플래그가 설정된 TCP 세그먼트만 보냄. 서버는 모든 데이터를 보낸 이후 FIN 플래그 세그먼트를 클라이언트에게 보낸 후 , ACK 플래그가 설정된 TCP 세그먼트를 서버에게 보내 연결을 종료함
TCP 연결이 순서대로 올바르게 수신할 때, TCP는 데이터를 수신 버퍼에 저장한다. 송신 측의 속도가 너무 빠르면, 버퍼가 가득차 오버 플로우가 발생하게 되고, 손실되는 패킷들이 발생하게 된다. 흐름 제어는 송신자가 수신자의 버퍼를 오버 플로우 시키는 것을 방지하기 위해 애플리케이션이 읽는 속도와 송신자가 전송하는 속도를 동일하게 하는 흐름 제어 서비스를 제공한다.
매번 전송한 패킷에 대해 확인 응답을 받아야만, 그 다음 패킷을 전송하는 방법
- 패킷을 하나씩 보내기 때문에, 비효율적임
수신 측에서 설정한 윈도우 크기만큼, 송신 측에서 확인 응답 없이 세그먼트를 전송할 수 있게 하여, 데이터의 흐름을 동적으로 조절하는 기법
원리
수신자가 처리할 수 있는 데이터의 양을 넘어서지 않도록 데이터의 양을 제한하여, 통신의 효율성을 높이고 신뢰성을 보장할 수 있음.
- 윈도우 : 송신, 수신 양쪽에서 만들어진 버퍼의 일부
- 윈도우 크기: 송신자가 동시에 전송할 수 있는 패킷의 개수, 수신자에 의해 동적으로 (수신 버퍼의 크기와 처리능력, 네트워크 대역폭, 지연시간, 패킷 손실률 등)결정되며 수신자는 송신자에게 전송할 수 있는 윈도우 크기를 알리고, 송신자는 이 정보를 이용하여 데이터를 전송.
- 최초 윈도우 크기(Window size)=7, 수신자는 ACK를 받기 전까지 데이터를 보냄
- 수신자는 받은 패킷의 수만큼 윈도우 사이즈를 갱신함 (ACK 번호는 다음으로 수신받을 패킷의 번호)
- 송신자는 확인 응답을 받고, 윈도우 사이즈를 갱신함
- 해당 과정을 반복
TCP에서 오류라고 판단되는 경우는 크게 2가지로 구분할 수 있다.
1. 수신 측에서 송신 측으로 NAK 응답
데이터가 손실되거나 오류가 발생했을 때, 수신측에서 감지하고, 송신측으로 NAK을 전송하여 직접 알리는 방법. NAK을 전송하여 송신 측에 데이터의 재전송을 요청
2. ACK가 송신자에게 도달하지 않거나(TimeOut), 중복된 ACK가 도착하는 경우
대부분의 TCP 구현에서는 ACKdhk TimeOut을 이용하여 오류를 감지한다. 수신자는 수신한 데이터 패킷에 대한 ACK를 송신자에게 전송하는데, 만약 송신자에게 도달하지 않거나 중복된 ACK가 도착하는 경우 송신자는 손실 또는 오류를 감지하고 데이터의 재전송을 진행한다. 중복된 ACK는 보통 3개 이상 도달할 때 오류 발생으로 간주한다.일반적으로 2번 방법을 주로 사용한다. NAK에 대한 추가적인 로직이 필요하기 때문,
ARQ(Automatic Repeat Request) 기법을 사용하여 프레임이 손상되었거나 손실되엇을 경우 재전송을 통해 오류를 복구한다. 흐름제어 기법과 연관되어 있다.
ARQ : 재전송 기반 오류 제어
흐름 제어 때 보았던 것처럼,데이터를 하나씩 보내고 대기하는 방식이다. 송신자는 데이터를 전송하고 해당 데이터에 대한 응답(ACK or NAK)를 기다린다. 수신자는 받은 데이터를 확인하여 ACK나 NAK를 송신자에게 전송하는 방식
흐름 제어에서 본 것 처럼, 데이터를 하나씩 보내고 대기하기 때문에, 효율성이 낮고 전송 속도가 느리다.
송신 측에서 오류가 발생한 패킷부터 전부 재전송 하는 방식이다. 손실 패킷 이후의 모든 패킷들이 모두 재전송하는 방식. 수신측에서는 소실 패킷 이후의 패킷들은 전부 폐기해야 하며, 송신측에서는 손실 이후의 모든 패킷들을 재전송해야 하기 때문에 대역폭이 효율적이지 못함. N번 부터 돌아가서 재전송 해야 하기 때문에 GO BACK N ARQ라고 불림
손상되거나 손실된 패킷만 재전송하는 방식, 수신자의 버퍼에서 데이터 재정렬을 수행해야함
데이터 재정렬을 해야하기 때문에, 별도의 버퍼가 필요함
트래픽 증가로 인해 라우터 및 스위치에 과도한 데이터가 들어오게 된다면 정해진 시간 내에 데이터를 모두 처리할 수 없게 되거나 오버 플로우가 발생할 수 있다. 정해진 시간 내에 패킷이 처리되지 않았기 때문에 호스트는 데이터를 재전송하게 되는데, 이것은 혼잡을 가중시키게 된다.이를 방지하기 위해 혼잡 상태에 따라 데이터의 전송 속도를 조절(제어)하여 관리 및 예방하는 기술을 혼잡 제어라고 한다.
TCP는 네트워크 혼잡을 감지하기 위해 다양한 지표를 사용하는데, 대표적인 지표는 아래와 같다.
- 심각한 혼잡: Time Out 발생
- 경미한 혼잡: 중복 ACK 발생 (3회 이상)
TCP에서 슬라이딩 윈도우를 설명할 때, 윈도우의 크기는 수신자의 버퍼만 고려하는 것이 아닌 네트워크 상황도 고려하여 결정된다고 하였다. 정확히는 수신자가 정한 윈도우(RWND)와, 송신자가 네트워크 상황을 고려하여 정한 윈도우(CWND) 두 크기 중 더 작은 값을 사용하여 결정한다.
RWND: 수신자가 정한 윈도우
CWND: 송신자가 정한 윈도우
통신 시작 전에는 네트워크에 대한 혼잡 상황을 유추할 수 없기 때문에, 초기에는
MSS (Maximum Segment Size) 값을 윈도우 크기로 정의한다.
MSS = MTU - (IP 헤더 길이 + TCP 헤더 길이)
MTU(Maximum Transmission Unit): 네트워크 매체에서 전송할 수 있는 최대 패킷 크기, 일반적으로 Ethernet 네트워크에서 1500으로 설정
TCP는 AIMD 원칙을 기반으로 혼잡 제어를 구현한다.
패킷을 하나씩 보내고, 문제없이 도착하면 윈도우 사이즈를 1씩 증가시키면서 전송한다. 만약 패킷 전송을 실패하거나 Time Out이 발생하면 cwnd를 절반으로 줄이는 방식이다. 문서마다
혼잡 제어 알고리즘은 주로 Slow start(느린 시작), Congestion Avoidance(혼잡 회피),빠른 재전송, 빠른 회복 등으로 구성되어 있다.
연결 초기에 한꺼번에 보내지 않고 처음에는 cwnd를 작게 시작하나, 데이터가 성공적으로 전달될 때마다 점차 빠르게 Window Size를 지수적으로 증가시키는 방식이다.(1,2,4,8....으로 2배 증가)
임계점(임계값)에 도달하면 혼잡 회피(Congestion Avoidnace)로 전환한다.임계점(Threshold): 네트워크 혼잡을 감지하고 그에 따라 전송 속도를 제어하기 위한 임계값
임계값은 패킷 손실이 발생했을 때 cwnd 크기의 절반으로 줄어듬
마지막으로 혼잡이 감지되었을 때의 윈도우 크기 시점부터 가산 증가 방식으로 cwnd 증가(보통 1씩 증가)
중복 ACK 감지 : 3개 이상의 중복 ACK를 감지하면 빠른 재전송 으로 전환된다.
Time Out: Time Out이 발생한다면 Slow Start 단계(cwnd 크기: 1)로 전환된다.
빠른 재전송: 패킷 손실을 감지하고 복구하기 위한 메커니즘, 중복된 ACK가 감지되면 해당 패킷을 빠르게 재전송한다. cwnd 크키가 절반으로 줄어든다.
빠른 재전송으로 패킷 손실을 복구한 후 돌입하는 상태, 재전송한 패킷에 대해 정상 ACK를 수신하면 혼잡 회피 단계로 다시 진입
Tahoe
임계치를 현재 혼잡 윈도우의 1/2로 설정
슬로우 스타트 개시
임계치에 도달하거나 넘어가면 혼잡 회피 수행Reno
Tahow 버전과 동일하게 동작하나 3개 중복 ACK 발생 시 빠른 회복 알고리즘 사용
- https://steady-coding.tistory.com/507
- https://goodgid.github.io/Error-Flow-Control/
- https://velog.io/@nnnyeong/Network-TCP-%EC%98%A4%EB%A5%98%EC%A0%9C%EC%96%B4
- https://velog.io/@jsj3282/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4-%EC%98%A4%EB%A5%98%EC%A0%9C%EC%96%B4
- https://evan-moon.github.io/2019/11/22/tcp-flow-control-error-control/#%EC%98%A4%EB%A5%98%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%96%88%EB%8B%A4%EB%8A%94-%EA%B2%83%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%95%8C-%EC%88%98-%EC%9E%88%EB%82%98%EC%9A%94
- https://www.scaler.com/topics/computer-network/
- https://velog.io/@mu1616/TCPIP-%ED%98%BC%EC%9E%A1-%EC%A0%9C%EC%96%B4#tcp-%ED%98%BC%EC%9E%A1-%EC%A0%9C%EC%96%B4-%EC%A0%95%EC%B1%85
- https://evan-moon.github.io/2019/11/26/tcp-congestion-control/