'IP 헤더'에 해당되는 글 2건

  1. 2009.09.16 바이트별로 노가다 작업을 통한 패킷 분석-ㅅ-; 1
  2. 2009.09.15 패킷 캡쳐로 살펴본 이더넷 프레임
2009. 9. 16. 10:32

바이트별로 노가다 작업을 통한 패킷 분석-ㅅ-;

말그대로 제목과 같음

400바이트 이상의 패킷을 캡쳐했을때만 정보 표시 하도록 구현


실행화면


2009. 9. 15. 21:13

패킷 캡쳐로 살펴본 이더넷 프레임

이번 포스팅에서는 실제 패킷을 캡쳐하여 바이트 별로 분석을 해보자한다.

소스는 아래를 펼쳐보면 알 수 있다.

이전 포스팅에서 얘기했듯이 이더넷 프로토콜 타입에 대한 정보가 패킷내에 존재한다. 이것은 아래의 그림과 같은 모습의 구조를 띄고 있다.


위의 소스를 실제로 돌려봤을 때 다음과 같은 화면을 볼 수 있다. (리눅스에서 구동한 것이다.)


위의 프레임 구조에서 봤듯이 붉은 색으로 표시된 부분은 도착지의 MAC address이며, 파란색으로 표시된 부분은 출발지의 MAC address이다. 이를 ifconfig 명령어로 확인해보면 출발지의 값이 다음과 같이 동일하다는 것을 알 수 있다.


도착지 다음의 2바이트는 이더넷 타입을 나타내는 0x0800은 IP를 뜻한다.
(2009/09/15 - [소켓프로그래밍] - 이더넷 프레임의 구조 를 참조하자.)

그럼 IP 헤더에 대해 다시 알아보자.


< IP 헤더 >

1. IP 헤더 사이즈

- 헤더 사이즈는 만일 옵션 미지정시 20바이트이다.
- 즉, 최소 20 바이트란 말이며, 최대는 24바이트이다.
- IPv6의 경우는 40바이트가 최소이다.


2. IP 헤더 구성



이를 캡쳐한 화면과 비교해보자.



1. Version (4 bits)
- 0x0800 다음에 오는 4비트는 IP 버전을 뜻한다. 4 이므로 IPv4임을 알 수 있다.

2. Header Length (4 bits)
- 다음 4비트는 헤더의 길이를 뜻한다. 최소 5부터 15까지의 값을 가진다.
- 이 값을 왼쪽으로 비트 쉬프트를 2번 해준 값이 헤더의 길이가 된다.
- 위의 경우에는 5이므로 5<<2 의 값은 20 이므로 20이 된다.
- 헤더의 최대 값은 15<<2 즉, 60이 된다. 따라서 헤더의 크기 범위는 20~60.

3. Type of Service (ToS) Flag (8 bits)
- 요구되는 서비스 품질을 나타내나, 현재 대부분의 시스템에서는 이 필드를 무시한다.

4. Total Packet Length (16 bits)
- IP 패킷 전체의 길이를 바이트의 수로 나타낸다. 최대 값은 0xFFFF = 65535.
- 위의 그림에서는 0x004C = 76 bytes.

5. Fragment Identifier (16 bits)
- 각 조각이 동일한 데이터그램에 속하면 같은 일련번호를 공유한다.

6. Fragmentation Flag (3 bits) : 분열의 특성을 나타내는 플래그
- 첫번 째 bit : 미사용 (항상 0)
- 두번 째 bit : DF bit, Don't Fragment
                    분열(조각) 0, 미분열 1
                    1로 셋팅되면 목적지 컴퓨터가 조각들을 다시 모을 능력이 없기 때문에
                    라우터로 하여금 데이터그램을 단편화하지 말라는 뜻이다.
                    0으로 셋팅되면 라우터에서 분열(조각, 단편)이 가능함을 뜻한다.
- 세번 째 bit : MF bit, More Fragment
                    현재의 조각이 마지막이면 0, 더 많은 조각이 뒤에 계속 있으면 1
- 위의 그림에서는 0x4 = 0100(2) 에서 상위 3비트 이므로 010이다.
- 첫번 째 비트는 위에서 설명한바와 같이 0이고, 두번째는 1이므로 미분열이란 뜻이고,
   세번 째는 0이므로 뒤에는 더이상의 조각이 없다는 뜻이다..

7. Fragmentation offset (13 bits)
- 조각나기 전 원래의 데이터그램의 8 바이트 단위의 위치
- 위의 경우에서는 0x40 = 0100 0000(2) 에서 6번에 얘기한 상위 3비트 뒤에 오는 5비트와 그 이후의 8비트 0x00 이므로, 0 이다. (조각나지 않은 데이터 이므로 0)
※ 위 3개의 필드 (Fragment Identifier,Fragmentation Flag,Fragmentation Offset)(5, 6, 7)는 조각(분열)과 
재배열과 관련된 필드이다. 각 조각들은 최종 목적지 시스템에 전달되기 전에는 재배열되지 않고, 최종 목적지에
전달되면  목적지 시스템의 IP 소프트웨어가 원래의 데이터그램으로 재배열한다.

8. TTL, Time To Live (8 bits) - IP 패킷의 수명 - 즉, 네트워크 상에서 패킷이 남아있을 시간이다. 점점 감소하게 된다. - 위의 그림에서는 0x40 이므로 64이다.
9. Protocol Identifier (8 bits) - 어느 상위 계층 프로토콜이 데이터 내에 포함되었는가를 나타낸다. - 프로토콜의 번호들은 다음의 사이트에서 확인할 수 있다. http://www.iana.org/assignments/protocol-numbers/ - 위의 경우는 0x06 이므로,
TCP 프로토콜이란 것을 알 수 있다.

10. 헤더 검사합 checksum (16 bits) - 헤더에 대한 오류 검사를 위한 비트이다. - 위의 그림에서는 0x4540 이다.

11. source IP Address (32 bits) - 송신처 주소

12. Destination IP Address (32 bits) - 수신처 주소

13. IP 헤더 옵션 (선택옵션, 가변 길이 bits)

14. Padding (필요한 경우에만 사용, 가변 길이 bits)