전송 계층은 사용자가 실행하는 프로그램을 포트를 통해 식별하며

IP 프로토콜의 한계(신뢰성 통신) 를 보완해준다.

 

* 포트 : 네트워크에서의 애플리케이션 식별 정보

 

IP프로토콜은 신뢰할 수 없는 통신과 비연결형 통신 이라는 두 가지 한계점이 존재한다.

패킷이 수신지까지 제대로 전달되었는지 보장을 하지 않으며, 재전송도 하지 않는다 즉 보내기만 할뿐이다.

또한 호스트 간에 사전 연결 수립을 하지않고 보내기만 한다.

 

IP가 이러한 특성을 가지는 이유는 성능 때문이다. 신뢰성을 띄우며 연결을 수립하는 통신은 속도가 느릴수 밖에 없다.

모든 통신에 신뢰성과 연결수립이 필요한게 아니기 때문에 일단 가장 중요한 목적인 속도를 쟁취하는 것이다.

 

전송계층에서 이러한 한계를 극복하기 위하여 TCP, UDP 프로토콜 등이 있다.

 

TCP

여러 조각으로 나뉜 데이터를 원래 순서로 재조립해준다.

또한 손상되거나 누락된 데이터를 자동으로 재전송 해준다.

연결을 수립하며 신뢰성 있는 통신을 만들어준다. (성능은 udp 보다 좋지 않다.)

- 통신 전에 연결을 수립하고 통신이 끝나면 종료한다.

 

* mss (Maximum Segment Size) 단위 : TCP로 전송 가능한 최대 페이로드 크기

 

주요 TCP 세크먼트 구조

- 송수신지 포트  : 송수신 하고자 하는 포트 

 

- 순서 번호 : 세그먼트의 올바른 송수신을 위해 송수신되는 세그먼트 데이터의 첫 바이트에 부여되는 번호 (몇번째 데이터인지) 만약 mss가 500이고 전체 데이터 크기가 1500이라하면 3개의 세크먼트 묶음이 이루어지고 각각 500 1000 1500 이 첫 바이트에 명시된다.

세그먼트의 올바른 송수신 순서를 보장하기 위한 번

 

- 순서번호 = 초기 순서 번호(초기순서번호는 무작위 값) + 송신한 바이트 수

 


- 확인 응답 번호
 : 다음으로 수신해야 할 순서 번호 

확인 응답 번호를 보내기 위해서는 제어 비트에서 승인을 나타내는 ACK 플래그를 1(ACK 세그먼)로 설정해야 한다.

일반적으로 수신한 순서 번호 + 1로 된다.

 

즉 TCP 세그먼트를 주고받으며 순서번호를 보내고 확인응답번호를 받고 확인응답번호에 해당하는 순서번호를 보내고 이렇게 반복된다.

 

* 제어 비트 : 여러가지 비트가 존재하며 ack, syn, fin 등의 비트가 있다.

ack : 세그먼트의 승인을 나타내기 위한 비트 

syn : 연결을 수립하기 위한 비트

fin : 연결을 종료하기 위한 비트

 

 

TCP 연결 수립& 종료 과정

 

1. 연결 수립 (3 Way HandShake)

세 개의 단계로 이루어진 TCP 연결 과정

 

 

 

 

  • 클라이언트 → 서버: SYN
    • 클라이언트는 서버에 연결을 요청하며 SYN 패킷을 보낸다.
    • SYN은 "Synchronize"의 약자로, 시퀀스 번호를 초기화하고 연결을 시작하겠다는 의미
    • 클라이언트의 초기 순서 번호와 1로 설정된 syn 비트가 포함되어 있다. (연결 시작합니다.)
  • 서버 → 클라이언트: SYN-ACK
    • 서버는 요청을 수락하며 SYN과 ACK 플래그가 모두 설정된 패킷을 보낸다.
    • 클라이언트의 SYN에 대한 확인(ACK)과 동시에 서버도 연결을 시작하겠다는 SYN을 보냄
    • 1로 설정된 syn, ack 비트와 서버의 초기 순서 번호가 포함된다. 또한 클라이언트의 세그먼트에 대한 응답 번호 포함
  • 클라이언트 → 서버: ACK
    • 클라이언트는 서버의 SYN에 대한 응답으로 ACK 패킷을 보냅니다.
    • 이로써 양쪽 모두 연결이 성립되었음을 확인합니다.
    • 확인했다고 최종적으로 승인 했다는 의미가 있다.
    • 클라이언트의 다음 순서 번호가 있고 1로 설정된 ack 비트와 서버가 보낸 세그먼트에 대한 확인 응답 번호 포함

 1단계: Client → Server (SYN)

 
Client: SYN, seq = 100
  • 클라이언트가 서버에게 “연결 요청”을 보냄.
  • seq = 100 은 클라이언트가 이번 통신에서 사용할 초기 순서번호(ISN, Initial Sequence Number) 입니다.
  • 이 번호는 임의로 정해지며, 보내는 쪽에서 ‘내가 보낼 데이터의 시작 번호’ 를 의미합니다.

 2단계: Server → Client (SYN + ACK)

 
Server: SYN+ACK, seq = 200, ack = 101
  • 서버는 “좋아, 연결할게” 라는 응답을 보냄.
  • SYN: 서버도 자신의 초기 순서번호를 보냄 (seq = 200).
  • ACK: 클라이언트가 보낸 SYN을 잘 받았다는 의미 (ack = 101).
    • ack = 101 은 클라이언트의 seq(100)에 +1 한 값이에요.
    • 즉, “너의 100번까지 받았고, 다음엔 101부터 보내줘” 라는 뜻입니다.

 3단계: Client → Server (ACK)

 
Client: ACK, seq = 101, ack = 201
  • 클라이언트는 서버의 SYN+ACK를 받았다는 응답을 보냄.
  • seq = 101: 자신의 다음 보낼 데이터 순서번호.
  • ack = 201: 서버의 seq(200)에 +1 한 값.
    → “너의 200번까지 잘 받았고, 다음엔 201부터 보내줘” 의 의미.

 

 

 

2. 연결 종료 4-Way Handshake

 

송수신 호스트가 각자 한번씩 FIN과 ACK를 주고받으며 TCP가 연결을 종료한다.

 

 

  • 클라이언트 → 서버: FIN
    • 클라이언트는 더 이상 데이터를 보내지 않겠다는 FIN 패킷(1로설정)을 보냅니다.
    • "연결 끊을게요."
  • 서버 → 클라이언트: ACK
    • 서버는 FIN을 수신하고, 이를 확인하는 ACK(확인응답번호)를 보냅니다. 이때 서버는 아직 데이터를 보낼 수 있다.
    • "확인했습니다."
  • 서버 → 클라이언트: FIN
    • 서버도 더 이상 보낼 데이터가 없으면 FIN(1로 설정) 패킷을 보냄
    • "이제 연결 끊습니다."
  • 클라이언트 → 서버: ACK
    • 클라이언트가 서버의 FIN에 대해 ACK를 보내면 연결 종료가 완료

 

이렇게 tcp와 같이 상태를 유지하며 통신하는 것을 stateful 이라고 한다.

 

 

* TCP의 오류 검출과 재전송

 

TCP의 처크섬 필드가 있긴 하지만 데이터의 손상만 확인하기 때문에 체크섬만으로는 충분하지 않다.

tcp는 (중복된 ACK 세그먼트를 수신했을때) , (타임아웃이 발생했을 때) 에 재전송을 하게 된다.

 

중복된 ACK 세그먼트를 수신하거나 타임아웃이 발생할때 오류라고 검출된다.

이 순간들에서의 세그먼트를 재전송 한다.

재전송 기법에는 ARQ 기법이 사용된다.

 

ARQ( 데이터 전송 중 오류가 발생하면 자동으로 재전송을 요청하는 프로토콜, Automatic Repeat Request )의 대표적 세 가지 방식

 

Stop and Wait ARP : 제대로 전달했음을 확인될때 까지 새로운 메시지를 보내지 않는다. ( 한 번에 하나의 프레임만 전송 )

Go-Back-N ARQ : 여러 개의 프레임을 연속 전송 가능하지만  오류 발생 시 오류 난 프레임부터 그 이후 모든 프레임을 다시 전송

Selective Repeat ARQ : 여러 프레임을 연속 전송 → 오류 난 프레임만 선택적으로 재전송

 

[빠른 재전송]

재전송 타이머가 만료되기 전이라도 세번의 동읾한 ACK 세그먼트를 받았다면 곧바로 재전송 작업을 하게 된다. 

 

 

파이프라이닝(한번에 많은 데이터를 보내는것) 기반 Go-Back-N ARQ / Selective Repeat ARQ 

는 한번에 무한히 많은 데이터를 보내고 받을 수 있을까?

-> 불가능 , 한번에 송수신 양은 호스트마다 다르다. (호스트의 사양이나 네트워크 환경에 따라 달라진다.)

 

stop-and-wait arq 는 흐름제어가 필요하지 않지만 Go-Back-N ARQ / Selective Repeat ARQ 는 흐름제어가 필

 

TCP의 흐름 제어(Flow Control)

수신자의 처리 능력을 초과하지 않도록 전송 속도를 조절하는 메커니즘

 

  • 수신자가 받을 수 있는 데이터의 최대 크기(= 윈도우 크기)를 송신자에게 알려줍니다.
  • 송신자는 이 윈도우 크기만큼만 데이터를 전송하고, ACK를 받기 전까지 초과 전송하지 않습니다.

수신자는 윈도우 크기를 ACK 패킷의 window 필드를 통해 계속 조정합니다.

 

 

< TCP 슬라이딩 윈도우 > 대표적인 흐름 제어 기법이다.  (자세한 공부는 따로 찾아봐야겠다.)

 

  • 슬라이딩 윈도우는 데이터를 연속적으로 보내되, 수신자의 윈도우 크기 범위 안에서만 보냄.
  • ACK가 오면 그만큼 "슬라이드"되어 새 데이터를 보낼 수 있음.
  • 효율적으로 데이터를 많이 보내면서도 수신자가 감당할 수 있는 만큼만 보내는 구조.

 

 

TCP의 혼잡제어 

 

많은 트래픽으로 패킷의 처리 속도가 늦어지거나 소실될 가능성이 있는 상황에서 제어한다.

송신 호스트가 유동적으로 전송량을 조절하는 기능이다. (주체는 송신 호스틍이다.)

 

혼잡 없이 전송가능한 데이터양인 '혼잡 윈도우'를 척도로 조절한다.

 

송신 호스트는 혼잡 제어 알고리즘을 통해 수신지의 혼잡 윈도우 값을 구한다.

혼잡의 기준은 타임아웃과 중복된 ack 세그먼트이다.

 

* AIMD 알고리즘 : 혼잡하다면 혼잡 윈도우를 절반으로 떨어뜨리고 혼잡하지 않다면

Round Trip Time(메세지 전송뒤 답변을 받는데 걸리는 시간) 마다 1씩 차례로 증가시킨다.

'합으로 증가, 곱으로 감소'

 

*  느린 시작 알고리즘

 

 

cwnd (Congestion Window) : 송신 측이 한 번에 보낼 수 있는 데이터의 양

ssthresh (Slow Start Threshold) : 느린 시작 단계에서 혼잡 회피로 전환되는 기준점

 

 

혼잡 윈도를 1부터 출발해 정상 수신된 ACK 세그먼트 당 1씩 증가시키는 방식. (RTT마다 2배씩 증가)

고유하고 특정한 '느린 시작 임계치' 까지만 증가한다. or 타임아웃 발생 or 중복된 ACK 세그먼트 수신되면 증가멈춤

 

만약 cwnd가 ssthresh(혼잡 임계값) 에 도달하면 느린시작을 종료하고 혼잡 회피 단계로 전환된다.

 

//시작

ssthresh = 16
cwnd = 1 → 2 → 4 → 8 → 16 → 혼잡 회피 진입

 

//혼잡 발생시

ssthresh = cwnd / 2
cwnd = 1 (초기화)

 

 

* 혼잡회피 알고리즘 : RTT 마다 혼잡 윈도우를 1MSS 씩 증가시킨다.

느린 시작(Slow Start) 다음 단계가 바로 혼잡 회피(Congestion Avoidance) 알고리즘

TCP는 네트워크가 “얼마나 많은 데이터를 감당할 수 있는지”를 추측하면서 보내기 때문에,
느린 시작으로 급격히 증가하던 전송 속도를 혼잡 회피 단계에서 완만하게 조정

 

 

  • 네트워크 혼잡을 피하기 위해 전송 속도를 천천히 늘리는 단계예요.
  • 즉, 네트워크가 허용할 수 있는 최대 속도를 점진적으로 탐색하는 구간입니다.

 

 

 

중복 세크먼트 수신일때에는 빠른 전송을 위해 느린 시작은 건너뛰고 혼잡 회피를 수행하게 된다.

타임 아웃은 느린시작 부터 다시 시작하게 된다.

 

 

 

UDP

신뢰할 수 없는 통신이며, 비연결형 통신이지만 TCP 보다는 일반적으로 빠른 전송이 가능하다.

상태를 유지하지 않고(stateless) 데이터 전송에 중점을 둔 프로토콜이다.  

 

포트의 분류 

포트종류 범위
well-know port 0~1023
registered port 1024~49151
dynamic port 49152 ~ 65535

 

 

well-known port (시스템 포트)

 

범용적으로 사용되는 프로토콜이 사용하는 포트 번호

ex: FTP(20, 21) , SSH(22), TELNET(23), DNS(53) , HTTP(80) 등이 있다.

 

registered port

 

흔히 사용하는 프로토콜에 할당하기 위해 사용된다.

 

ex : mysql(3306) ,  REDIS(6379),  Tomcat(8080, http 대체 포트라고도 함) 등이 있다.

 

dynamic port

사설포트 라고도 부르며 기관에서 관리되지 않고 자유롭게 사용가능한 포트번호이다.

웹 브라우저가 대표적으로 사용한다. 

 

이제는 ip주소 + 포트를 통해 어떤 호스트에서 어떤 어플리케이션이 어디서 실행되는지 알 수 있게 되었다.

 

NAT

ip를 변환하는 기술인 nat는 포트를 활용하는 기술이다.

NAT 변환 테이블 (네트워크의 외부 : 내부 매핑 테이블) 에서 포트기반으로 매핑되는 공인 ip주소를 절약할 수 있다.

ex : 

네트워크 외부 네트워크 내부
2.5.8.9:5500 192.168.192.67:1025
2.5.8.9:5501 192.168.192.68:1026

 

포트포워딩

외부 네트워크에서 들어온 요청을 내부 네트워크의 특정 호스트(IP)와 포트로 전달해주는 기능

사설망(내부망)에 있는 장비들은 공인 IP가 없기 때문에 외부에서 직접 접근할 수 없습니다.
따라서 공인 IP가 부여된 공유기(또는 라우터)가 요청을 내부 장비로 "전달"해주는 역할을 합니다.

 

ICMP 

ip 프로토콜의 신뢰할 수 없는 통신의 한계점을 보완해주는 프로토콜이다.

IP 패킷 전송 과정에서 발생한 문제 혹은 네트워크 진단정보에 대한 피드백 메세지를 제공한다.

 

ICMP 메세지는 타입 + 코드조합이다.

 

* 타입 : 메시지 유형 번호    *  코드 : 구체적인 메세지 내용

 

완전히 보완해주는 용도는 아니다. tcp가 보완 역할이 더 크다.

 

+ Recent posts