1. UDP
1.1. UDP 패킷 포맷
1.2. 포트 번호
1.3. 방화벽의 동작(UDP편)
2. TCP
2.1. TCP 패킷 포맷
2.2. TCP에서의 상태 전이
2.3. 다양한 옵션 기능
2.4. 방화벽의 동작(TCP편)
1. UDP
UDP(User Datagram Protocol)는 VoIP(Voice over IP)나 DHCP 등 즉시성을 요하는 애플리케이션에 사용한다.
Connectionless Type(커넥션리스 타입) 프로토콜로 UDP Connection이라는 통신로를 만들어 데이터를 송신한다.
1.1. UDP 패킷 포맷
RFC768에서 'User Dategram Protocol'로 표준화했다. IP 헤더의 프로토콜 번호는 17로 정의한다.
수신지에 신경쓰지 않고 송신만 하고, 실시간을 중시하기에 헤더 필드는 4개 뿐이다.
송수신지 포트번호
애플리케이션(프로세스) 식별에 사용하는 2Byte 필드이다.
송신지 단말이 통신로를 만들 때 OS가 정한 범위에서 무작위로 할당한 값을 송신지 포트 번호로 설정한다.
애플리케이션별로 정의한 값을 수신지 포트 번호로 설정하고 수신지 단말에 전송한다.
UDP 데이터그램 길이
UDP 헤더(8Byte)와 UDP 페이로드(애플리케이션 데이터)를 합친 전체 길이를 나타내는 2Byte 필드이다.
최솟값은 UDP 헤더만으로 구성한 경우로 8이고, 최댓값은 MTU에서 IP 헤더의 길이를 뺀 값(20Byte)이다.
체크섬
UDP 데이터그램의 손상 여부를 판단하는데 사용하는 2Byte 필드이다.
IP 헤더 체크섬처럼 1의 보수 연산을 사용한다. 데이터그램을 받은 단말이 검증에 성공하면 데이터그램을 받는다.
1.2. 포트 번호
포트 번호가 있다면 어떤 애플리케이션에 데이터를 전달하는지 알 수 있다.
포트 번호는 0부터 65535까지 있으며 3가지로 구분한다.
System Ports와 User Ports는 수신지 포트 번호로, Dynamic and/or Private Ports는 송신지 포트 번호로 사용한다.
System Ports
포트 번호는 0부터 1023까지로 Well-Known Ports라고도 부른다.
ICANN이 관리하며 일반 서버 애플리케이션에 유일하게 묶여있다(Ex. HTTP는 80, HTTPS는 4443 등)..
User Ports
포트 번호는 1024부터 49151까지로 사용할 수 있는 포트이다. System Ports와 마찬가지로 관리된다.
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml에서 확인할 수 있다.
Dynamic and/or Private Ports
포트 번호는 49151부터 65535까지로 사용하는 포트 번호이다.
클라이언트 애플리케이션이 통신로를 만들 때 송신지 포트 번호를 무작위로 할당한다.
이렇게 송신지 포트 번호를 할당함으로써 어떤 클라이언트 애플리케이션에 응답을 전달할지 알 수 있다.
1.3. 방화벽의 동작(UDP편)
방화벽은 송수신지 IP 주소와 포트 번호로 커넥션을 식별하고, 송신을 제어하는 기기이다.
미리 설정한 규칙에 따라 통신을 허가, 거부하며 통신을 식별해 위협해서 시스템을 보호한다.
이런 통신 제어 기능을 스테이트풀 인스펙션(Stateful Inspection)이라고 한다.
Stateful Inspection에는 2가지 규칙으로 나뉜다.
└ 필터링 규칙(Filtering Rule) : 통신 허가와 거부를 정의하는 규칙
└ 커넥션 규칙(Connection Rule) : 통신을 관리하는 규칙
Filtering Rule
송신지 IP 주소, 수신지 IP 주소, 프로토콜, 송신지 포트 번호, 수신지 포트 번호, 통신 제어가 미리 표로 작성되어 있다.
예를 들어 송신지 IP 주소가 192.168.1.0./24라는 단말에서 인터넷 접근을 허가하고 싶은 경우 위와 같은 표로 설정한다.
HTTP에 접속하기 위해선 HTTP(80), HTTPS(443), DNS(53)을 설정해야 하고, 특정할 수 없는 요소는 ANY로 표시한다.
Connection Rule
커넥션 정보를 기반으로 위의 필터링 규칙을 동적으로 바꾸어 보안 강도를 높인다.
이런 커넥션 정보를 'Connection Table(커넥션 테이블)'이라는 메모리 상의 테이블로 관리한다.
2. TCP
TCP(Transmission Control Protocol)는 메일, 웹브라우저 등 데이터 전송의 신뢰를 요구하는 애플리케이션에서 사용한다.
TCP Connection을 송신용 수신용 2개를 사용하여 전이중화 통신을 사용해 신뢰성이 높다.
2.1. TCP 패킷 포맷
RFC793에서 'Transmission Control Protocol'로 표준화했다. IP 헤더의 프로토콜 번호는 6으로 정의한다.
송수신지 포트 번호
애플리케이션(프로세스)의 식별에 사용하는 2Byte 필드
OS가 결정한 무작위 송신지 포트 번호와 애플리케이션별 정의된 수신지 포트 번호를 설정하고 통신한다.
세그먼트를 받은 서버를 수신지 포트 번호를 보고 어떤 데이터인지 판단한다.
시퀸스 번호
TCP 세그먼트를 올바른 순서로 정렬하기 위해 사용하는 4Byte 필드
데이터의 각 바이트는 초기 시퀀스 번호(ISN; Initial Sequence Number)를 부여받는다.
확인 응답 번호
ACK(Acknoewledge) 번호는 '다음은 여기부터 데이터를 주십시오'라고 상대에게 전달하는 4Byte 필드
시퀀스 번호와 ACK 번호를 사용해 데이터 신뢰성을 확보한다.
데이터 오프셋
TCP 헤더의 길이를 4Byte 단위로 환산한 값을 나타내는 4bit 필드
가장 짧은 TCP 헤더의 길이는 20Byte이므로 5 값이 들어있다.
컨트롤 비트
커넥션 상태를 제어하는 8bit 필드, 각각의 비트를 '플'래그'라고 부르며 위의 표를 따른다.
윈도우 크기
받은 데이터 크기를 알리는 2Byte 필드, 최대 65535Byte까지 알릴 수 있다.
확인 응답을 기다리지 않고 받을 수 있는 데이터의 크기를 윈도우 크기로 나타낸다.
0은 더 이상 받을 수 없음을 나타내 송신 측 단말이 윈도우 크기가 0인 패킷을 받으면 송신을 멈춘다.
체크섬
1의 보수 연산을 사용하여 TCP 세그먼트가 손상되었는지 확인하는 2Byte 필드
긴급 포인터
컨트롤 비트의 URG 플래그가 1로 설정되었을 때만 유효한 2Byte 필드
옵션
TCP에 확장 기능을 알리기 위해 사용하는 4Byte 단위로 변화하는 필드
이 기능들 중 MSS와 SACK 기능이 중요하다.
MSS(Maximum Segment Size)
TCP 페이로드의 최대 크기이다(IP 패킷의 최대 크기인 MTU와는 다르다).
MSS는 명시적으로 설정하거나 VPN 환경이 아닌 이상 IPv4에서는 'MTU - 40B', IPv6에서는 'MTU - 60B'이다.
└ IPv4에서 40Byte를 빼는 이유는 IP 헤더와 TCP 헤더 길이의 합이 40Byte이기 때문이다.
SACK(Slective ACK)
사라진 TCP 세그먼트만을 재전송하는 기능이다.
ACK는 어디까지 받았다라는 의미이지만, SACK는 어디부터 어디까지 받았다라는 의미로 더 효율적이다.
└ 1~6까지 있는 패킷에서 3이 손실되었다면 SACK는 3만 재전송하지만 ACK는 3부터 6까지 전부 재전송한다.
2.2. TCP에서의 상태 전이
데이터링크 계층에서 '무선 LAN 단말이 접속되기까지' 부분과 유사한 느낌이다.
TCP라는 프로토콜이 어떻게 신뢰성을 확보하는지 3단계로 나누어서 설명한다.
3단계는 각각 접속 시작 단계, 접속 확립 단계, 접속 종료 단계를 따른다.
접속 시작 단계
TCP Connection은 3WHS(3 Way HandShake; 3웨이 핸드셰이크)로 Connection을 여는 것부터 시작한다.
3WHS는 Connection을 확립하기 전 인사를 수행하는 절차이다.
클라이언트와 서버는 3WHS에서 서로 지원하는 기능과 시퀀스 번호를 결정하고 OPEN이라는 준비 작업을 수행한다.
└ OPEN에서는 Active OPEN과 Passive OPEN 2가지로 나눈다.
└ Active OPEN : Connection을 만드는 클라이언트의 처리
└ Passive OPEN : Connection을 받는 서버의 처리
3WHS 작동 순서
1. 초기 상태는 클라이언트는 CLOSED(커넥션이 완전히 닫힌 상태), 서버는 LISTEN(커넥션을 기다리는 상태)이다.
2. 클라이언트는 컨트롤 비트의 SYN 플래그 값이 1이고, 시퀀스 번호를 무작위(x)로 설정한 패킷을 송신한다.
3. 클라이언트는 Active OPEN 처리로 SYS-SENT 상태가 되고 SYN/ACK 패킷을 기다린다.
4. 서버는 패킷을 받고 Passive OPEN 처리 후 패킷을 반환하고 SYN-RECEIVED 상태가 된다.
└ 이때 패킷은 SYN과 ACK 플래그 값이 1, 시퀀스는 무작위 값(y), 확인 응답 번호는 위의 패킷에 1을 더한 값(x+1)이다.
5. 클라이언트는 패킷을 받고 ACK 플래그 값이 1, 시퀀스는 x+1, 확인 응답 번호는 y+1 값인 패킷을 반환한다.
6. 클라이언트는 ESTABLISHED 상태(커넥션이 완료되어 실제 데이터를 송수신 할 수 있는 상태)가 된다.
7. 서버는 패킷을 받고 ESTABLISHED 상태가 된다.
8. 주고 받은 패킷의 시퀀스 번호와 확인 응답 번호에 따라 데이터들의 시퀀스 번호 값이 결정된다.
접속 확립 단계
이 단계는 연결이 되고 나서부터 연결을 종료하기 전까지의 전반적인 단계를 의미한다.
3WHS를 완료하면 데이터의 교환을 시작하는데 TCP는 신뢰성 확보를 위해 3가지 제어 방법을 사용한다.
흐름 제어(Flow Control)
윈도우 크기 필드를 사용해 수신 측 단말이 흐름양을 조절하는 방법이다.
수신 측에서 윈도우 크기 필드를 사용해 한계를 알리면, 송신 측에서 ACK를 기다리지 않고 정해진 만큼 데이터를 보낸다.
수신측에서 받지 못 하는 일이 없이, 가능한 많은 데이터를 송신하는 방법이다.
혼잡 제어(Congestion Control)
패킷 송신 수 제어를 통해 수신 측 단말이 흐름양을 조절하는 방법이다.
대량의 송신 패킷에 의해 네트워크가 혼잡하지 않도록 '혼잡 제어 알고리즘(Congestion Control Algorithm)'을 사용한다.
이때 제어하는 패킷의 수를 '혼잡 윈도우(cwnd; Congestion Window)'라고 한다.
// RTO(Retransmission Time Out) : 재전송 타임아웃 / RTT(Round Trip Time) : 패킷 왕복 시간
// Fast Retransmit : 빠른 재전송
혼잡 제어 알고리즘은 어떤 정보에 기반해 혼잡을 판단하는지에 따라 3가지로 나눈다.
└ 로그 기반(Loss Base) : 패킷 유실이 발생하면 혼잡이라고 판단
└ 지연 기반(Latency Base) : 지연이 발생하면 혼잡이라고 판단
└ 하이브리드 기반(Hybrid Base) : 패킷 유실과 지연을 종합적으로 고려해 혼잡이라고 판단
재전송 제어
패킷 유실이 발생했을 때 수행하는 패킷 재전송 기능이다. ACK 패킷을 통해 패킷 유실을 감지한다.
재전송 제어가 발동하는 시점은 2가지로 나눈다.
└ 중복 ACK(Duplicate ACK) : 수신 측 단말의 계기
└ 재전송 타임아웃(RTO; Retransmission Time Out) : 송신 측 단말의 계기
중복 ACK
TCP 세그먼트의 시퀀스 번호가 듬성하면 수신 측 단말이 패킷 유실이 발생했다고 판단한다.
확인 응답이 같은 ACK 패킷을 다시 보내는데 이를 중복 ACK라고 한다.
송신 측 단말은 중복 ACK가 일정 수 이상이 되면 TCP 세그먼트를 재전송한다. 이를 Fast Retransmit이라고 한다.
└ Fast Retransmit을 보내는 기준은 OS와 TCP 버전에 따라 다르다.
RTO
송신 측에서 TCP 세그먼트를 보낸 후 ACK 패킷을 받기까지 '재전송 타이머(Retransmission Timer)'로 시간을 잰다.
Fast Retransmit을 받고 일정 시간이 지나면 TCP 세그먼트를 재전송하고, ACK 패킷을 받으면 초기화한다.
이 시간을 너무 짧지도 길지도 않게 설정하기 위해 RTT를 기반으로 적당한 시간을 설정한다.
접속 종료 단계
데이터 교환이 끝나면 커넥션 종료 처리를 한다. 커넥션 종료 처리 실패하면 단말에 남아 자원이 부족해진다.
그래서 접속 확립 단계보다 한 단계 더 많은 4WHS(4 Way HandShake)를 진행한다.
└ 4WHS는 정확하게는 커넥션을 종료하기 위한 처리 순서를 뜻한다.
접속 확립 단계에서는 반드시 클라이언트부터 시작하지만 접속 종료 단계는 어느 쪽이든 상관이 없다.
컨트롤 비트의 FIN 플래그를 보내 접속을 종료하는데 어디서 처리하느냐에 따라 2가지로 나눈다.
└ Active CLOSE : 커넥션을 종료하려는 측의 처리
└ Passive CLOSE : 커넥션 종료를 받는 측의 처리
2.3. 다양한 옵션 기능
TFO(TCP Fast Open)
일반적인 3WHS에서는 RTT와 처리 지연 시간동안 데이터를 송수신할 수 없다.
그래서 SYN, SYN/ACK 패킷에 데이터를 같이 보내 효율을 높인다.
TFO는 3WHS 처음부터 일어나는 것이 아니라 2번째부터 일어난다.
Nagle Algorithm
데이터 크기가 작은 TCP 세그먼트를 모아서 한 번에 송신하는 기능이다.
MSS보다 작은 TCP 세그먼트를 모아서 송신하여 세그먼트 수도 줄이고, 패킷의 왕복도 줄인다.
Delayed ACK
데이터 크기가 작은 TCP 세그먼트에 대한 확인 응답을 조금씩 늦추는 기능이다.
Nagle 알고리즘은 TCP 세그먼트를 모아서 보내는 것이라면 이것은 ACK를 모아서 보내는 기능이다.
Nagle Algorithm은 송신을 늦춰 통신 효율을 높이고, Delayed ACK는 응답을 늦춰 통신 효율을 높인다.
때문에 두 기능을 동시에 사용하게 되면 미묘한 대기 상태가 발생해 실시간 통신이 불가능해진다.
둘의 호환성을 잘 확인하고, 때에 따라서 사용해야 한다.
Early Retransmit
Fast Retansmit이 발동하지 않는 특정 TCP 환경에서 중복 ACK의 임계값을 낮춰 발동하게 하는 기능이다.
TLP(Tail Loss Probe)
송신한 TCP 세그먼트 중 가장 마지막 부분이 유실되었을 때 RTT보다 빠르게 재전송하는 기능이다.
TLP는 RTT와는 별개로 PTO(Probe Time Out)를 정의하여 시간을 기록한다.
Early Retransmit과 연계하여 Fast Retransmit을 촉발하기도 한다.
2.4. 방화벽의 동작(TCP편)
'학교 공부 > 데이터 통신론' 카테고리의 다른 글
데이터통신론 06 애플리케이션 계층(Application Layer) (0) | 2022.05.20 |
---|---|
데이터통신론 04 네트워크 계층(Network Layer) (0) | 2022.04.08 |
데이터통신론 03 데이터링크 계층(Data Link Layer) (0) | 2022.03.25 |
데이터통신론 02 물리 계층(Physical Layer) (0) | 2022.03.21 |
데이터통신론 01 네트워크 기초 (0) | 2022.03.18 |