-위 그림은 IP header 구조체를 나타낸 그림으로 한줄당 4byte씩 20byte를 나타내고 있다.
일반적으로 20byte이고 가변적으로 20byte~60byte로 20byte 미만 이하는 존재하지 않는다. 그러므로 header length가 5이하이면 헤더를 해석하지 않게 되므로 당연히 4byte 5줄로 구성되어 져야 한다.
-Total Length는 ethernet을 제외한 길이로 IP입장에서 packet(header+Data) 전체 길이를 의미하므로 total-length을 출력하면 packet를 알 수 있다.
-이더넷에서 최대 전송 크기를 나타내는 MTU는 1500이고 Total-Length는 65535이므로 크기 맞지 않다. 그러므로 65535를 1500에 맞춰 주어야 한다. 그러기 위해서는 분할작업이 필요하다.
Fragment Offset
-만약 위의 A.avi동영상 파일을 전송시 분할한다고 하자. 분할하는 각 packet마다 번호를 붙여주게 된다.
-전송하는 입장에서는 파일이름을 알 수 없다.
분할 한뒤 전송시 앞에 Ethernet와 IP가 붙게 되고 목적지에서 조각을 모아서 순서대로 붙이기 위해 0을 기준으로 Fragment offset을 0, 10, 20, 30.......넣어준다. 즉 offset값에 따라 패킷을 뒤에 차곡차곡 붙여주어서 분할한 파일을 다시 모아주게 된다.
ID (identification)
-네트워크는 프로세서대 프로세서의 작업이다. 그러므로 각각의 프로세스가 만든 IP가 다르므로 예를 들어 익스플러어에서 만든 IP,ethernet 과 TCP환경에서 만든 IP,ethernet을 구분해 줄 필요가 있다. 그러므로 프로세서당 1개의 랜덤한 번호를 부여하는데 그것이 ID이다.
IP Flags
-IP Flags는 3비트를 차지하는 요소를 가진다. R,DF,MF
R은 reserved으로 그냥 확보한 것으로 사용되지 않는다. DF는 Don't Fragment의 약어로 여기에 1이 들어가면 분할을 하지 않게 된다. 그런데 분할하지 않은 65535의 파일을 그냥 보내게 되면 packet자체가 파괴되어 더이상 진행이 되지 않는다. MF는 more Fragment의 약어로 분할 된 패킷이 더 있다라는 의미로 여기에 1의 값이 있으면 다른 조각이 더 있다는 의미로 이것을 보고 재조립을 한다.
- 분할 패킷이 합쳐지는 것은 목적지에서 이루어 지는 것이 아니라 네크워크를 움직여 다니면서 합쳐진다.
-L1은 근거리 전송시 관여되고 이 패킷들이 돌아다니다 기준이 되는 공유기를 만나게 된다. 이때 L2를 보고 외부로 보낼지 말지를 정하게 되는데 이같이 L2는 근거리를 떠나 목적이 있을때 L2가 사용 된다.
-예를 들어 우리가 버스를 타고 부산역을 간다고 하자 목적지는 부산역이고 이동수단은 버스가 되게 된다.
그런데 중간에 어느곳을 경유해서 가는 버스가 있고 바로 가는 버스도 있을 수 있고 상황에 따라 다른 버스를 타고 갈 수 있다. 이때 버스가 L1이 되고 상황에 따라 전체적인 것을 조율하는 것을 L2로 비유 할 수 있다.
TTL (time to live)
-만약 목적지를 가지는 간단한 망이 있다고 하자. S에서 시작해 D로 가는데 경로 복잡하거나 막히게 되면 패킷이 발생은 했는데 도착을 안하게 되고 다시 재전송을 하게 되면 기존의 패킷과 겹치게 되서 트래픽이 복잡하게 된다. 이 현상을 방지하기 위해 패킷이 살아있는 시간을 제어해주는 것을 TTL이라 한다.
-TTL은 패킷이 게이트웨이를 지날 때 마다 하나씩 숫자가 감소하다가 0이되면 수명이 다되서 사라지게 된다.
-편지가 반송되는 것처럼 패킷도 폐기된 패킷은 돌아오게 된다.
traceroute
traceroute는 자신의 컴퓨터가 인터넷을 통해 특정 컴퓨터를 찾아가면서 거치는 루트 (각 홉마다 거치게 되는 게이트웨이 컴퓨터)를 기록하는 유틸리티이다. 리눅스에서 한번 사용해 보자.
- traceroute를 리눅스에서 실행 시켜보면 위처럼 1,2,3,.....12...이렇게 지나는 게이트웨이를 직접눈으로 확인할 수 있다. 끝까지 진행 시켜보진 않았지만 보통 20을 넘기 힘들다고 한다.
PING
-ping[핑]은 특정한 인터넷 주소가 있고, 또 그 주소가 요청을 받아들일 수 있는지를 확인해 주는 기본적인 인터넷 프로그램이다. 그러나, ping을 동사형으로 사용하면 ping 유틸리티나 명령어를 사용하는 것을 의미한다. ping은 사용자가 접속하려고 시도하고 있는 호스트가 실제로 운영되고 있는지를 확인하는 진단 목적으로 사용된다. 예를 들어, 만약 한 사용자가 어떤 호스트에 ping을 할 수 없다면 (즉, ping에 관한 응답이 정상이 아니라면), 그 사용자는 그 호스트에 파일을 보내기 위해 FTP 프로토콜을 사용할 수 없게 된다. ping은 운영되고 있는 호스트가 얼마나 응답을 빠르게 하는지를 확인하는 데에도 사용될 수 있으며, 도메인 이름만을 알고 있는 어떤 사이트의 IP 주소를 알아낼 수도 있다.
-만약 구글 사이트에 한번에 많은 PING을 한다면 구글에서는 PING을 요청한 호스트에 IP를 막아버린다.
이것을 PING공격이라고 부른다.
-보낸는 것을 PING 받는 것을 PONG이라 한다.
리눅스에서 PING을 해보자.
-리눅스에서 PING을 하면 무한 반복하고 도스에서는 4번만 반복한다.
위에서는 보면 ICMP_SEQ = 네트워크에 관한 정보 ,ttl등의 정보를 알 수 있다.
Protocol
in.h파일
Header Checksum
-앞에 헤더가 에러가 있는지를 알 수 있다. 에러가 있으면 checksum을 보고 확인하며 에러가 있으면 파기된다.
Source Address : 보내는 주소 Destination Address: 목적지 주소
이제 IP HEADER의 각 값을 확인해보자.
구조체의 define된 이름을 가지고 출력해보자.
파일보기
const void * L2_IP(const void * vpData)
{
const struct ip *stpIP=vpData ;
printf("---------------------------------------------------\n");
printf(" IP Anaylze \n");
printf("IP version:%d\n",stpIP->ip_v); //ip version
printf("header length: %dbyte\n",(stpIP->ip_hl)*4); //header length
printf("%x\n",stpIP->ip_tos);
vpData=(unsigned char *)vpData+(stpIP->ip_hl)*4;
switch(IPTOS_TOS(stpIP->ip_tos ))
{
case IPTOS_LOWDELAY:
printf("loswdelay\n");
break;
case IPTOS_THROUGHPUT:
printf("throughput\n");
break;
case IPTOS_RELIABILITY:
printf("reliability\n");
break;
case IPTOS_LOWCOST:
printf("lowcost\n");
break;
default:
printf("unknown\n");
}
printf("total length : %d\n",ntohs(stpIP -> ip_len));
printf("identification : %d\n",ntohs(stpIP -> ip_id));
printf("Don't fragment flag : %s\n",(ntohs(stpIP -> ip_off)&(IP_DF))? "YES":"NO");
printf("more fragment flag : %s\n",(ntohs(stpIP -> ip_off)&(IP_MF))? "YES":"NO");
printf("Time to live : %d\n",ntohs(stpIP -> ip_ttl));
printf("Protocol : ");
switch(stpIP->ip_p) //프로토콜
{
case IPPROTO_IP:
printf("Dummy protocol for TCP.\n");
break;
/*case IPPROTO_HOPOPTS:
printf("IPv6 Hop-by-Hop option.\n");*/
case IPPROTO_ICMP:
printf("Internet Control Message Protocol.\n");
break;
case IPPROTO_IGMP:
printf("Internet Group Management Protocol.\n");
break;
case IPPROTO_IPIP:
printf("IPIP tunnels (older KA9Q tunnels use 94)\n");
break;
case IPPROTO_TCP:
printf("Transmission Control Protocol.\n");
break;
case IPPROTO_EGP:
printf("Exterior Gateway Protocol\n");
break;
case IPPROTO_PUP:
printf("PUP protocol.\n");
break;
case IPPROTO_UDP:
printf("User Datagram Protocol.\n");
break;
case IPPROTO_IDP:
printf("XNS IDP Protocol.\n");
break;
case IPPROTO_TP:
printf("SO Transport Protocol Class 4.\n");
break;
case IPPROTO_IPV6:
printf("IPV6 header.\n");
break;
case IPPROTO_ROUTING:
printf("IPV6 routing header.\n");
break;
case IPPROTO_FRAGMENT:
printf("IPV6 fragmentation header.\n");
break;
case IPPROTO_RSVP:
printf("Reservation Protocol.\n");
break;
case IPPROTO_GRE:
printf("General Routing Encapsulation.\n");
break;
case IPPROTO_ESP:
printf("encapsulating security payload.\n");
break;
case IPPROTO_AH:
printf("authentication header.\n");
break;
case IPPROTO_ICMPV6:
printf("ICMPv6.\n");
break;
case IPPROTO_NONE:
printf("IPv6 no next header\n");
break;
case IPPROTO_DSTOPTS:
printf("IPv6 destination options.\n");
break;
case IPPROTO_MTP:
printf("Multicast Transport Protocol\n");
break;
case IPPROTO_ENCAP:
printf("Encapsulation Header\n");
break;
case IPPROTO_PIM:
printf("Protocol Independent Multicast.\n");
break;
case IPPROTO_COMP:
printf("Compression Header Protocol.\n");
break;
case IPPROTO_RAW:
printf("Raw IP packets.\n");
break;
default:
printf("unknown\n");
}
return vpData;
}
<실행결과>
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]일일보고서-정선주(2011년10월10일) (7) | 2011.10.10 |
---|---|
[내장형]심재원_2011.10.07일일보고서 (9) | 2011.10.07 |
[내장형]이수란_2011.10.06 (10) | 2011.10.06 |
[내장형]김동화_2011년10월5일 일일보고서 (12) | 2011.10.05 |
[내장형]이성재_20110929 일일보고서 (17) | 2011.09.29 |
[내장형]김수만_110928 (16) | 2011.09.29 |
[내장형]이상만_110927 (14) | 2011.09.28 |
잠깐 내려 놓는 시간.. (7) | 2011.09.27 |