UDP (User Datagram Protocol)
Layer 4 protocol 입니다.
stateless protocol 입니다. (TCP는 stateful protocol)
UDP의 구조
IPv4의 경우 UDP의 Header는 8 bytes 입니다.
포트는 16bit ( 0 ~ 65535)
UDP datagram header + data 구조를 가집니다.
UDP datagram은 아래와 같이 아주 심플하게 생겼습니다.
IP가 안보이는 이유는 Layer가 다르기 때문에 헤더에서는 Port만 취급합니다.
Source Port와 Destination Port (각 4bytes), Length와 Checksum (각 4bytes) = 총 8bytes
로 UDP Header 가 이루어 져 있고 나머지는 Data로 이루어 져 있습니다.
DNS - UDP의 예시
DNS는 UDP protocol을 쓰는 대표적인 예시입니다.
DNS 관련 서버들
DNS는 아래와 같은 구조를 가집니다.
1. Resolver
2. Root Name Server
3. Top-Level Domain Name Server (TLD)
4. Authoritative Name Server (ANS)
DNS 질의 순서
DNS의 질의 순서는 아래와 같습니다.
1. 질의 요청 (Query)
클라이언트(예: 웹 브라우저)가 특정 도메인 이름을 IP 주소로 변환하기 위해 DNS 서버에 질의 요청을 보냅니다.
2. 재귀 질의 (Recursive Query)
사용자의 컴퓨터나 라우터에 설정된 로컬 DNS 리졸버가 재귀 질의를 통해 도메인의 IP 주소를 찾아옵니다. 이 과정에서 로컬 DNS 리졸버는 요청된 정보가 캐시에 있는지 확인합니다.
3. 루트 네임서버에 질의
만약 로컬 DNS 리졸버에 캐시가 없다면, 루트 네임서버에 질의합니다. 루트 네임서버는 .com, .net, .kr 등 상위 도메인(TLD, Top-Level Domain) 정보를 가지고 있습니다.
4. TLD 네임서버에 질의
루트 네임서버는 해당 도메인의 TLD 네임서버 정보(예: .com 네임서버)를 로컬 DNS 리졸버에 반환합니다. 로컬 DNS 리졸버는 다시 해당 TLD 네임서버에 질의를 보냅니다.
5. 권한 네임서버(Authoritative Name Server)에 질의
TLD 네임서버는 해당 도메인의 권한 네임서버 정보를 제공합니다. 권한 네임서버는 해당 도메인에 대한 최종 IP 주소 정보를 가지고 있습니다. 로컬 DNS 리졸버는 이 정보를 사용하여 도메인의 IP 주소를 얻습니다.
6. 응답
로컬 DNS 리졸버는 얻은 IP 주소를 클라이언트에게 응답으로 전달합니다. 이후 클라이언트는 이 IP 주소를 사용하여 웹 서버에 접속할 수 있게 됩니다.
7. 캐싱
응답된 IP 주소는 로컬 DNS 리졸버의 캐시에 일정 시간 동안 저장되어 동일한 요청에 대해 빠르게 응답할 수 있도록 합니다.
DNS 흐름 그림
아래는 위의 흐름을 그림으로 표현했습니다.
위의 순서와 번호는 동일하지 않습니다.
1~6번까지를 나타낸다고 보면 됩니다.
DNS Packet
DNS Packet 뜯어보기
필드 이름 | 길이 | 설명 |
---|---|---|
ID | 16 bit | 이 필드는 쿼리를 생성하는 프로그램에 의해 할당된 16비트 식별자입니다. 쿼리의 응답에서도 복사되며, 요청자는 이를 사용하여 응답을 보류 중인 쿼리와 매칭할 수 있습니다. |
QR | 1 bit | 쿼리(0)인지 응답(1)인지를 지정하는 1비트 필드입니다. |
OPCODE | 4 bit | 이 필드는 쿼리의 유형을 지정합니다. 4비트로 이루어져 있으며, 쿼리 작성자가 설정하고 응답에서 복사됩니다. 값은 다음과 같습니다: - 0: 표준 쿼리 (QUERY) - 1: 역방향 쿼리 (IQUERY) - 2: 서버 상태 요청 (STATUS) - 3-15: 미래 사용을 위해 예약됨 |
AA | 1 bit | 권위 있는 응답 여부를 나타내는 1비트 필드입니다. 이 비트는 응답에서만 유효하며, 응답하는 이름 서버가 해당 도메인 이름에 대해 권위를 갖고 있음을 나타냅니다. 응답 섹션에 여러 소유자 이름이 포함될 수 있지만, AA 비트는 쿼리 이름과 일치하는 이름 또는 응답 섹션의 첫 번째 소유자 이름에 해당됩니다. |
TC | 1 bit | 메시지가 허용된 전송 채널 길이를 초과하여 잘린 경우를 나타내는 1비트 필드입니다. |
RD | 1 bit | 이 필드는 쿼리에서 설정될 수 있으며, 응답에서도 복사됩니다. 이 비트가 설정되면 이름 서버가 쿼리를 재귀적으로 처리하도록 지시합니다. 재귀적 쿼리 지원은 선택 사항입니다. |
RA | 1 bit | 이 필드는 응답에서 설정되거나 해제되며, 이름 서버가 재귀적 쿼리 지원을 제공하는지 여부를 나타냅니다. |
Z | 3 bit | 미래 사용을 위해 예약된 필드입니다. 쿼리와 응답 모두에서 이 필드는 항상 0으로 설정되어야 합니다. |
RCODE | 4 bit | 응답 코드로, 응답의 일부로 설정됩니다. 4비트 필드이며 다음과 같은 값을 가집니다: - 0: 오류 없음 - 1: 형식 오류 (이름 서버가 쿼리를 해석할 수 없음) - 2: 서버 실패 (이름 서버 문제로 쿼리 처리 실패) - 3: 이름 오류 (해당 도메인 이름이 존재하지 않음, 권위 있는 이름 서버만 응답) - 4: 구현되지 않음 (요청된 쿼리 유형을 지원하지 않음) - 5: 거부됨 (정책적 이유로 이름 서버가 요청된 작업을 수행하지 않음) - 6-15: 미래 사용을 위해 예약됨 |
QDCOUNT | 16 bit | 질문 섹션의 항목 수를 지정하는 16비트 부호 없는 정수입니다. |
ANCOUNT | 16 bit | 응답 섹션의 자원 레코드 수를 지정하는 16비트 부호 없는 정수입니다. |
NSCOUNT | 16 bit | 권위 레코드 섹션의 이름 서버 자원 레코드 수를 지정하는 16비트 부호 없는 정수입니다. |
ARCOUNT | 16 bit | 추가 레코드 섹션의 자원 레코드 수를 지정하는 16비트 부호 없는 정수입니다. |
Question 종류 (질문 섹션)
Question Type | 설명 |
---|---|
A | IPv4 주소를 요청합니다. 예: www.example.com 의 IPv4 주소를 반환합니다. |
AAAA | IPv6 주소를 요청합니다. 예: www.example.com 의 IPv6 주소를 반환합니다. |
CNAME | 도메인의 별칭을 실제 이름으로 반환합니다. 예: alias.example.com 의 실제 도메인 이름을 반환합니다. |
MX | 이메일 전송을 위한 메일 서버의 주소를 요청합니다. 예: example.com 의 메일 서버 주소를 반환합니다. |
NS | 도메인에 대한 권한이 있는 네임 서버의 주소를 요청합니다. 예: example.com 의 네임 서버를 반환합니다. |
PTR | IP 주소에 대한 역방향 DNS 조회로 도메인 이름을 요청합니다. 예: 192.0.2.1 의 도메인 이름을 반환합니다. |
SOA | 도메인의 시작 권한 정보를 요청합니다. 예: example.com 의 SOA 레코드를 반환합니다. |
SRV | 특정 서비스에 대한 서버 위치를 요청합니다. 예: _sip._tcp.example.com 서비스의 서버 위치를 반환합니다. |
TXT | 도메인에 대한 텍스트 정보를 반환합니다. 예: example.com 의 SPF 설정 정보를 반환합니다. |
ANY | 해당 도메인에 대한 모든 리소스 레코드를 요청합니다. 예: example.com 과 관련된 모든 리소스 레코드를 반환합니다. |
NAPTR | URI 또는 특정 서비스와 관련된 정보를 반환하는 레코드입니다. 예: E.164 번호를 도메인 이름으로 변환하는 데 사용됩니다. |
DNS 특징
DNS는 기본적으로 Encrypted 되어 있지 않습니다.
DNS hijacking/cache poisoning 과 같은 공격이 많습니다.
위와 같은 이유로 DNS over TLS, DNS over HTTPS 도입이 되고 있습니다. (UDP긴 하지만 암호화된 포트)
아래 글을 참고하시면 좋을것 같습니다.
DNS 암호화 DoH DoT 관련 쉬운 설명 글 (netxhack.com)
실제 DNS 를 확인할 수 있는 명령어
실제 커맨드를 통해서 DNS 주소를 확인할 수 있습니다.
리눅스에서는 주로 아래 커맨드들을 사용합니다.
기본 DNS 확인 명령어
nslookup 도메인이름
어느 DNS 서버에서 요청이 온지 알 수 있음.
nslookup -type=ns 도메인이름
nslookup 도메인이름 DNS서버 도메인
'CS 지식 > 네트워크 기본 다지기' 카테고리의 다른 글
SNI (Server Name Indication) (0) | 2024.10.01 |
---|---|
TLS 1.2, 1.3 (4) | 2024.09.30 |
Layer 4 vs Layer 7 Load balancing (0) | 2024.09.29 |
TCP Flow Control & Congestion Control (4) | 2024.09.23 |
TCP Segment 구조 (0) | 2024.09.23 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.