[TCP/IP Protocol #14] Part 3 | Chapter 14. UDP
[TCP/IP Protocol #15] Part 3 | Chapter 15. TCP
UDP
비연결형, 신뢰성 없는 전송 프로토콜
호스트 대 호스트 통신 대신에 프로세스 대 프로세스 통신을 제공하는 것 이외에는 IP 서비스에 추가하는 기능이 아무것도 없다.
Q. UDP가 아무런 기능이 없다면 왜 프로세스는 이것을 사용하는가?
A. 단점이 때론 장점이 되기도 한다. UDP는 최소한의 오버헤드만 사용하는 매우 간단한 프로토콜이다. 작은 메시지를 보내고자 하고 또한 신뢰성에 대해서 걱정하지 않는 프로세스는 UDP를 사용할 수 있다.
비연결형 서비스
UDP에 의해 전송되는 각각의 사용자 데이터그램은 서로 독립적이라는 것을 의미한다.
* 데이터그램: 패킷 교환 네트워크와 관련된 기본 전송 단위
흐름 제어 기능 없음 → 수신 측에서는 들어오는 메시지로 인해 오버플로우가 발생할 수 있다
오류 제어 메커니즘이 없음 → 메시지가 손실되거나 중복되었는지 송신자가 알 수 없다는 것이다
혼잡 제어 제공하지 않음 → UDP에서 패킷은 작고 산발적으로 전송된다
검사합
UDP 검사합의 계산은 IP의 경우와도 다르다
의사 헤더(pseudoheader), UDP 헤더, 응용 계층으로부터 온 데이터의 세 부분을 포함한다.
패킷이 TCP에 속하지 않고 UDP에 속한다는 것을 확인하기 위해 프로토콜 필드가 추가되었다.(프로토콜 필드 값은 17)
만약 이 값이 전송 도중 변하면 수신 측에서의 검사합 계산은 이것을 발견할 것이고 UDP는 이 패킷을 폐기할 것이다.
캡슐화
UDP를 통해 보낼 메시지가 있는 프로세스는 UDP로 메시지와 한 쌍의 소켓 주소 그리고 데이터의 길이를 보낸다.
그 이후 UDP 헤더를 추가하여, 소켓 주소들과 함께 사용자 데이터그램을 IP로 보낸다.
큐잉
큐가 없다면 UDP는 사용자 데이터그램을 폐기하고 ICMP 프로토콜에게 'port unreachable' 메시지를 서버로 보낼 것을 요청한다.
다중화와 역다중화
TCP/IP 프로토콜을 수행하고 있는 호스트에서는 UDP는 하나지만 UDP 서비스를 사용하기를 원하는 프로세스는 여러 개 있을 수 있기에 다중화/역다중화를 사용한다.
송신자 측에서는 사용자 데이터그램을 보내고자 하는 프로세스가 여러 개 있을 수 있다. 그러나 UDP는 하나이므로 이것은 다-대-일 관계이고 다중화를 요구한다.
다중화: UDP는 프로세스마다 할당된 포트 번호에 의해서 구분되는 서로 다른 프로세스로부터 메시지를 수신한다. UDP는 헤더를 추가한 후 IP로 사용자 데이터그램을 보낸다.
역다중화: UDP는 사용자 데이터그램을 IP로부터 받는다. 오류를 점검하고 헤더를 없앤 후 UDP는 포트 번호에 의거하여 각 메시지를 적절한 프로세스로 보낸다.
대표적인 응용(TCP와의 차이)
UDP는 단순한 요청-응답 통신을 필요로 하고 흐름 제어와 오류 제어에는 큰 관심이 없는 프로세스에 적절하다.
FTP와 같이 대량의 데이터를 보내야 하는 프로세스에서는 보통 사용되지 않는다.
TFTP(Trivial File Transfer Protocol) 프로세스는 흐름 제어와 오류 제어 메커니즘을 내부에 가지고 있으므로 쉽게 UDP를 사용할 수 있다.
- TFTP: 사용자 인증 없이 기본 파일 전송 기능을 제공하는 단순 프로토콜
UDP는 멀티캐스팅에 적합한 전송 프로토콜이다.(멀티캐스팅 기능은 UDP 소프트웨어에 내장되어 있지만 TCP 소프트웨어는 그렇지 못하다.)
UDP는 SNMP와 같은 관리 프로세스에 사용된다.
- SNMP에 UDP 쓰는 이유: SNMP 메시지는 실시간으로 빠르게 처리되어야 하며, UDP는 세션 설정 지연 없이 즉시 데이터를 전송할 수 있다.
UDP는 수신된 메시지의 조각들 간의 지연이 동일하지 않으면 안되는 실-시간 응용들에 의해서 일반적으로 사용된다.
TCP
다중화와 역다중화 수행
연결 지향 서비스
A 노드에 있는 프로세스가 B 노드에 있는 프로세스와 데이터를 주고받고자 하는 경우에는 다음 세 단계가 발생한다.
두 TCP 간에 가상 연결이 설정된다 → 양방향으로 데이터가 교환된다 → 연결이 종료된다
TCP 세그먼트는 IP 데이터그램으로 캡슐화되어 순서에 어긋나게 전송되거나 손실되거나 훼손되고 재전송 될 수 있다.(물리적인 연결이 아니므로)
그렇지만, TCP는 스트림 기반의 환경을 제공하여 상대방에게 순서에 맞게 바이트를 전달할 책임이 있다.
신뢰성 서비스
TCP는 신뢰성 있는 전송 프로토콜이다. 데이터가 안전하고 오류 없이 잘 도착했는지를 확인하기 위하여 확인응답 메커니즘을 이용한다.
연결 설정
TCP는 전 이중(full-duplex) 방식으로 데이터를 전송한다. 두 기기에 있는 두 개의 TCP가 연결되면, 그들은 동시에 세그먼트를 주고받을 수 있다.
- 세그먼트: TCP에서의 패킷
즉, 데이터의 교환이 이루어지기 전에 한 편에서는 통신을 개시하고 다른 편에서는 통신 개시의 요구에 대한 승인이 먼저 이루어져야 한다.
3단계 핸드셰이크
클라이언트라고 하는 응용 프로그램은 서버라고 하는 또 다른 응용 프로그램과 전송 계층 프로토콜인 TCP를 이용해 연결을 설정하고자 한다. 3단계 핸드셰이크 절차는 서버에서부터 시작한다.
서버: 자신의 TCP에게 연결을 수락할 준비가 되어 있다는 것을 알린다.(이러한 요청: 수동 개방(passive open))
클라이언트: 능동 개방(active open)을 위한 요청을 실행한다. 자신의 TCP에게 특정한 서버와 연결을 설정할 것이라는 것을 알린다.
1) 클라이언트는 첫 번째 세그먼트로서 SYN 플래그가 1로 설정된 SYN 세그먼트를 전송한다. 이 세그먼트는 순서 번호의 동기화가 목적이다. 클라이언트는 임의의 값을 첫 번째 순서 번호로 선택한 후 이 번호를 서버로 전송하는데, 이 순서 번호를 초기 순서 번호(ISN: initial sequence number)라고 한다. (이 세그먼트에는 확인응답 번호나 윈도우 크기가 포함되지 않는다.)
SYN 세그먼트는 단지 하나의 제어 세그먼트이며 어떠한 데이터도 전달하지 않지만, 하나의 순서 번호를 소비한다.
데이터 전송이 시작되면 순서 번호는 1만큼 증가한다. 즉, SYN 세그먼트는 실제의 데이터를 전달하지 않지만 하나의 가상 바이트를 포함하고 있기에 하나의 순서 번호를 소비하는 것이다.
2) 서버는 두 번째 세그먼트로서 SYN과 ACK 플래그 비트가 각각 1로 설정된 SYN+ACK 세그먼트를 전송한다.
이 세그먼트는 두 가지 목적을 가지고 있다.
첫 번째, 반대 방향으로의 통신을 위한 SYN 세그먼트이다. - 서버는 서버로부터 클라이언트로 전송되는 바이트의 순서화를 위한 순서 번호를 초기화하기 위해 이 세그먼트를 사용한다.
두 번째, 서버는 ACK 플래그를 1로 설정하고 클라이언트로부터 수신하기를 기대하는 다음 순서 번호를 표시함으로써 클라이언트로부터의 SYN 세그먼트 수신을 확인 응답한다. - 이 세그먼트는 확인 응답 번호를 포함하고 있다.
3) 클라이언트가 단순히 ACK 세그먼트를 전송한다.
ACK 플래그와 확인응답 번호 필드를 이용해서 두 번째 세그먼트의 수신을 확인한다.
이 세그먼트에 있는 순서 번호는 SYN 세그먼트에 있는 것과 동일한 값으로 설정된다. (∵ ACK 세그먼트는 어떤 순서 번호도 소비하지 않기 때문)
데이터의 첫 번째 바이트의 바이트 번호를 나타내는 새로운 순서 번호를 가지고 있어야 한다.
데이터를 전달하지 않고 어떠한 순서 번호도 소비하지 않는다.
동시 개방
두 프로세스가 동시에 서로에게 능동 개방을 요구하는 상황이 발생한다면, 양쪽 TCP는 서로에게 SYN + ACK 세그먼트를 전송하게 되고 하나의 단일 연결이 두 TCP 사이에 설정된다.
SYN 플러딩 공격
TCP의 연결 설정 과정은 SYN 플러딩 공격이라는 중요한 보안 문제에 노출되어 있다.
악의에 찬 공격자가 데이터그램의 발신지 IP 주소를 위조함으로써 서로 다른 클라이언트로 가장한 후에 많은 수의 SYN 세그먼트를 하나의 서버에 전송하는 경우에 발생한다.
TCP 서버가 핸드셰이크의 세 번째 단계를 기다리는 동안에 자원들은 사용되지 않는 상태로 할당되어 있을 것이다.
이 짧은 시간 동안 전송되는 SYN 세그먼트의 수가 많으면, 서버는 궁극적으로 자원을 다 소비하게 되어 유효한 클라이언트로부터 들어오는 연결 요청을 받아들이지 못하게 될 것 - 서비스 거부 공격(denial of service attack)
TCP에서는 SYN 공격의 영향을 경감하기 위해 몇 가지 방법을 사용한다.
1) 미리 정해진 시간동안 들어오는 연결 요구의 수를 제한하는 방법
2) 원하지 않는 발신지 주소로부터 들어오는 데이터그램을 여과해서 제거하는 방법
- 쿠키(cookie)라고 하는 것을 이용해서 전체 연결이 설정되기 전까지 자원의 할당을 연기하는 것이다. - SCTP가 사용하는 전략
- SCTP: 스트림 제어 전송 프로토콜, 멀티호밍(하나의 연결이 여러 IP 주소를 사용할 수 있어, 네트워크 경로 문제 발생 시 연결의 안정성 높임
연결 종료
일반적으로 클라이언트에서 종료를 시작한다.
3단계 핸드셰이크와 반-닫기(half-close) 옵션을 가진 4단계 핸드셰이크 등 2가지 옵션이 사용된다.
3단계 핸드셰이크
1) 클라이언트 프로세스로부터 close 명령을 수신한 클라이언트 TCP는 첫 번째 세그먼트로서 FIN 플래그를 1로 설정한 FIN 세그먼트를 전송한다. 이 FIN 세그먼트는 클라이언트로부터 전송되는 데이터를 포함할 수도 있으며, 단지 제어 세그먼트일 수도 있다.(제어로 동작하는 경우는 하나의 순서 번호를 소비한다.)
2) FIN 세그먼트를 수신한 서버 TCP는 서버 프로세스에게 연결 종료 상황을 알려준다. 그리고 서버 TCP는 클라이언트 TCP로부터의 수신을 확인하고 동시에 다른 방향으로의 연결 종료를 알려주기 위해 두 번째 세그먼트 FIN + ACK를 전송한다. 이 세그먼트가 서버로부터 수신한 데이터를 포함하지 않는 경우는 하나의 순서 번호를 소비한다.
3) 클라이언트 TCP는 서버 TCP로부터의 FIN 세그먼트 수신을 확인하기 위해 마지막 세그먼트인 ACK 세그먼트를 전송한다. 이 세그먼트는 서버로부터 수신한 FIN 세그먼트에 있는 순서 번호에 1을 더한 값으로 설정되는 확인응답 번호가 포함된다. 이 세그먼트는 데이터를 전달하지 않으며 순서 번호를 소비하지도 않는다.
반-닫기(4-way handshake)
TCP에서는 한 쪽에서 데이터를 수신하면서 데이터 전송을 종료할 수 있다. 이것을 반-닫기라고 한다.
서버나 클라이언트 어느 쪽에서도 반-닫기(half-close) 요청을 시작할 수 있다.(서버에서 모든 데이터를 수신한 후 처리가 시작되는 경우에 발생)
1) 클라이언트는 FIN 세그먼트를 전송함으로써 연결을 반-닫기 한다.
2) 서버는 ACK 세그먼트를 전송함으로써 반-닫기를 수락한다. 그렇지만, 서버는 여전히 데이터를 전송할 수 있다.
3) 서버가 처리된 모든 데이터를 전송한 후에는 FIN 세그먼트를 전송한다.
4) 클라이언트로부터 ACK를 전송하여 확인응답한다.
반-닫기 이후 데이터는 서버로부터 클라이언트로 전달, 확인응답은 클라이언트로부터 서버로 전달된다.
두 번째 세그먼트(ACK)는 어떠한 순서 번호도 소비하지 않는다.
연결이 최종적으로 종료되는 경우에 마지막 ACK 세그먼트의 순서 번호도 증가하지 않는다.(∵ 클라이언트로부터 서버 방향으로 순서 번호가 하나도 소비되지 않았기 때문)
연결 리셋
RST 비트를 1로 설정함으로써 연결 요청을 거절하거나 중단하거나, 휴지 상태에 있는 연결을 종료한다.
Reference
Behrouz A. Forouzan (2009), TCP/IP 프로토콜(Protoccol Suite), 4th Edition
'Networking > Network' 카테고리의 다른 글
VPN - Site-to-Site, Client VPN (0) | 2024.02.13 |
---|---|
보안 그룹과 네트워크 ACL(Stateful vs Stateless) (0) | 2024.02.12 |
유니캐스트 라우팅 프로토콜2 - BGP (경로 벡터 BGP) (1) | 2024.02.10 |
유니캐스트 라우팅 프로토콜1 - IGP (거리 벡터 RIP, 링크 상태 OSPF) (1) | 2024.02.10 |
로드 밸런싱(ELB 부하 분산) - 배경, 정의, 종류, 통신 방식, 특징 (1) | 2024.02.10 |