2019-04-08 17:00 작성된 포스트
데이터 통신 수업에서 UDP 패킷 분석에 관한 과제를 받았다. 과제 내용은 pingplotter 혹은 traceroute로 UDP 패킷을 요청한 내용을 Wireshark로 캡쳐한 후 질문에 답해야 하는 것이다.
풀어야할 문제는 다음과 같다.
현재 테스트 환경은 윈도우가 아닌 리눅스이므로, pingplotter가 아닌 traceroute로 실습을 진행하였다. 아래 그림과 같이 와이어샤크 캡처를 시작한 상태에서, traceroute 명령어를 수행하였다.
-> 와이어샤크 캡쳐화면
-> traceroute 실행 캡쳐화면
pingplotter로 테스트를 했었다면 ICMP 패킷이 제일 먼저 찍혔을 테지만, 필자는 traceroute를 사용했기 때문에 ICMP 패킷이 아닌 UDP 패킷이 찍혔다. 이 패킷의 IP 헤더 안의 source 필드가 출발지 주소, 즉 현재 내 자신의 IP를 알려주고 있다.
먼저, IP 패킷 헤더의 구조를 보자
위 그림에 따르면, upper layer protocol, 즉 상위 계층 프로토콜 필드 값은 IP 데이터그램 시작 지점에서 10바이트 지점에서 위치하고 있으며, TTL 필드와 header checksum 필드 사이에서 찾을 수 있다.
위 그림에서 파란 색으로 표시된 TTL 필드와 header checksum 필드 사이에서 상위 계층 프로토콜 필드 값이 UDP 임을 확인할 수 있다.
질문 참 많다..
와이어샤크에서 IP 헤더를 선택했을 때, 위 그림처럼 하단에 바이너리 데이터 역시 선택 되는 것을 볼 수가 있다. 이 바이너리 데이터는 16진수로 표현됬기 때문에, 띄어쓰기 단위로 1바이트씩 나누어져 있다. 선택된 범위가 IP 헤더니까, 이 범위 안의 바이트 수를 세면 IP 헤더의 바이트 수는 20바이트라는 것을 알 수 있다.
IP 데이터그램에서, 32비트 목적지 주소 아래로는 모두 payload로 되어있다(payload라 함은 직역하면 화물, 즉 운송하는 data이다). 다시 말해, IP 헤더 아래의 바이트는 모두 payload의 바이트임을 의미한다. 내용을 좀 더 자세히 보면, UDP 헤더와 Data로 나뉘어져 있는데, 이걸로 payload는 UDP datagram임을 알 수 있다. 위와 같이 바이트 수를 세면 payload의 바이트 수를 구할 수도 있지만, 친절하게도 Data는 32바이트라고 알려주고 있고, 그림에서 선택된 UDP 프로토콜 헤더의 바이트는 3바이트이므로 payload의 바이트 수는 35바이트임을 알 수 있다.
위 그림의 Flags값이 0인 것을 보아, 단편화가 발생하지 않았음을 짐작할 수 있다. Flags필드를 자세히 보았을 때, More fragments flag가 세팅되지 않았음을 보아 이 데이터는 단편화가 발생하지 않았다.
연속된 두 패킷을 순서대로 캡쳐해 보았다.
두 패킷들의 차이를 보면 Identification 필드와 Header checksum 필드 값의 차이가 있는 것을 확인할 수 있다. Identification 값은 그 패킷의 인식 값이며, 1씩 증가하는 것으로 보인다. Header checksum은 헤더의 모든 데이터를 검증하는 값이기에, 그 값 자체가 변하는게 아니라 헤더의 값, 즉 Identification이 변경되면서 같이 변경되는 것으로 보인다.
캡처된 여러 패킷을 돌아보면서, 헤더의 필드 각각을 표로 정리하였다.
필드명 | 역할 | 변경 / 고정 | 이유 |
---|---|---|---|
Version | IP의 버전을 나타낸다 | 고정 | IP 버전은 4로 고정 (IPv4) |
Header Length | 헤더의 크기를 나타낸다 | 변경 가능 | timestamp 등 추가적인 IP헤더의 정보가 들어갈 수 있음 |
Type of Service | 데이터의 타입을 나타낸다 | 변경 가능 | 어떤 종류의 데이터인지 나타내는 필드 |
Total Length | payload의 크기를 나타낸다 | 변경 가능 | payload 크기에 따라 변경됨 |
Identification | 헤더의 식별 번호를 나타낸다 | 변경 | 헤더를 구분할 식별자 |
Flags | 단편화 여부를 나타내는 flags | 변경 가능 | 단편화 발생 시 flag로 표시 |
Time to live | TTL값을 나타낸다 (TTL : 패킷이 네트워크 안에서 생존할 수 있는 시간) | 변경 가능 | 요청에 따라 상이 (traceroute의 경우 호스트에 도달할 때 까지 1씩 증가) |
Upper layer protocol | 상위 계층의 프로토콜을 나타낸다 | 변경 가능 | 패킷마다 프로토콜이 상이 |
Header checksum | 헤더가 올바른지 확인한다 | 변경 | 헤더 각각의 checksum 값이 다르기 때문 |
Source | IP 출발 주소를 나타낸다 | 변경 가능 | 패킷마다 주소가 상이 |
Destination | IP 도착 주소를 나타낸다 | 변경 가능 | 패킷마다 주소가 상이 |
5번 문항에서 1씩 증가함을 확인할 수 있었다.
(주: 이 문제는 ICMP TTL-exceeded 응답 패킷에 대한 문제이다)
위의 표에서 찾을 수 있듯이, Identification 필드는 헤더의 식별 번호를 나타내며, TTL 필드는 패킷이 네트워크 안에서 생존할 수 있는 시간을 나타낸다. 이때 시간이라는 표현을 쓰긴 했지만 사실 라우터간 경유 횟수, 즉 홉(Hop)당 TTL이 1씩 감소한다. TTL 값이 0이 된다면 라우터에서 TTL-exceeded 응답을 돌려준다.
패킷 그림을 자세히 보면, checksum 필드 아래로는 기존 IP 헤더와 동일한 것을 확인할 수 있다. 열어서 Identification, TTL 필드를 확인해보면, ICMP 패킷 안에 기존 요청의 IP헤더의 정보가 담겨있다는 것을 알 수 있다.
ICMP 헤더안의 IP 헤더 Identification 필드는 기존 요청 IP 헤더의 Identification필드 값을 그대로 가지고 있다. 헤더의 식별 번호이기 때문에, 이 값은 계속 변한다. 가장 가까운 라우터에서 TTL이 0이 되어 ICMP TTL-exceeded 응답이 온 것이므로, ICMP 헤더의 IP 헤더의 TTL 값은 1로 고정되어 있음을 알 수 있다.
필자는 traceroute로 실습을 진행했기 때문에, traceroute 명령어에서 다음과 같이 패킷의 크기를 2000바이트로 정해준 후 실행하였다.
traceroute gaia.cs.umass.edu 2000
패킷 확인 결과 More framents flag가 셋팅되었고, 단편화가 발생한 것을 확인할 수 있다.
11, 12번 답에 출력 결과가 나와있다.
More framents flag가 셋팅되어 단편화 되었음을 알려준다. 또한, Fragment offset 값이 0이므로 이 단편이 첫 번째 단편임을 알려주고 있다. IP 헤더의 Total Length 필드의 값을 보아 이 데이터그램의 길이는 1500바이트이다. (헤더 20바이트 + payload 1480바이트)
드럽게 많이 물어보네..
Fragment offset 값이 185인 것이 이 데이터그램이 두 번째임을 알려준다(offset은 바이트/8 값으로, 바이트로 환산하면 185 x 8 = 1480바이트다). More fragments flag가 세팅되지 않은걸로 보아 추가적인 단편이 발생하지 않았다.
More fragments 필드와 Fragment offset 필드가 변경되었다. 그러나 이 단편들은 기본적으로 같은 패킷이기에, Identification 필드 값은 변경되지 않았다.
패킷 사이즈를 3500으로 변경 후 다시 캡쳐하였다.
패킷 당 3개의 단편이 발생하였음을 확인할 수 있었다.
13번 답과 마찬가지로, More fragments 필드와 Fragment offset 필드가 변경되었다.
이번 실습을 통해 UDP 패킷의 구조에 대한 이해도를 높일 수 있어서 좋다고 생각했다. 또한, 단편화의 개념을 잡는데 많은 도움이 되었다. 처음 생각에는 패킷 전송 시 무조건 하나로 묶어서 보낸다고 생각했다. 그러나 만약 큰 payload를 단편화 시키지 않고 무조건 묶어서 보낸다면, 매우 큰 파일을 전송 시 성능 상에서 많은 문제가 발생할 것이다. 단편화에 대해 실습하면서, 평소에도 어떠한 방식 혹은 알고리즘에 대해 어떤 문제가 발생할 수 있는지 생각하는 습관을 갖는게 좋겠다는 생각이 들었다. 그렇게 함으로서 그 방식 혹은 알고리즘에 대해 셀프 피드백이 가능해지고, 그걸 한층 더 향상하는데 도움이 될 것이다.
주관적인 생각이 많이 들어간 포스트입니다. 지적은 언제나 환영입니다!
출처 : http://www-net.cs.umass.edu/wireshark-labs/Wireshark_UDP_v7.0.pdf