實驗12 ICMP 協議程式設計

2021-09-21 16:58:13 字數 3010 閱讀 3097

實驗7 icmp 

協議程式設計

實驗要求:

1 根據icmp 

協議,編寫乙個類似

ping 

的程式,具體的要求是:程式發出乙個

icmp 

包到 目的

ip,然後等待接收回應的包(

echo)。

2 根據

icmp 

協議,向乙個固定的

ip 發出一系列的

ttl 

逐次增大的

icmp 

的包,這些包的

ttl 

每通過乙個路由器就會減小1,當

ttl 為0 

的時候,路由器會發回乙個

icmp 

不可達 的包,通過該包可以獲得路由器的

ip 位址,通過這個原理編寫乙個類似

tracert 

的程式

實驗內容: 1、

icmp  

包的頭部結構和

ip 包頭部結構

struct icmp ;

struct ip ;

2、ping 

程式的步驟:

myping()

3 tracer 

的原理,對乙個固定的

ip 位址發出乙個系列的

icmp 

包 1 tracer 

程式步驟:

for(i=1;i<63;i++)

附錄:myping 

程式: #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef struct sockaddr  sa;

#define icmp_echoreply 0

#define icmp_destunreach  3

#define icmp_echo  8

#define icmp_timeout  11

#define max_hops  30

#define icmp_packet_min  8

#define icmp_packet_size  32

#define max_packet_size  1024

struct icmp ;

struct ip

; void show32(char  * buf,int len)

void err_sys(const  char *errmsg)

; void send_echo_req(int  sockfd, struct sockaddr_in *dstaddr);

uint16_t in_cksum(uint16_t  *addr, int len);

void recv_echo_reply(int  sockfd);

int main(int  argc, char **ar**)

void send_echo_req(int  sockfd, struct sockaddr_in *dstaddr)

void recv_echo_reply(int  sockfd)

icmp = (struct  icmp *)(buf + sizeof(struct ip));

if (icmp->type  == icmp_echoreply)

else

} }

} uint16_t in_cksum(uint16_t  *addr, int len)

if (nleft  == 1)

sum = (sum  >> 16) + (sum & 0xffff);

sum += (sum  >> 16);

answer = ~sum;

return(answer); }

2 mytracert  

程式 #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//定義icmp  

資訊型別

#define icmp_echoreply  0

#define icmp_destunreach  3

#define icmp_echo  8

#define icmp_timeout  11

#define maxhops  30

#define bufsize  512

struct ip

; struct icmp

; char buf[bufsize];

unsigned short  checksum(u_short *buffer,int len)

//補全奇數字

if(nleft==1)

//將反饋的

16bit  

從高位移動到低位

sum=(sum>>16)+(sum&0xffff);

sum+=(sum>>16);

answer=~sum;

return (answer);

};void show32(char  * buf,int s)

; printf("\r\n");

};

void err_sys(const char *errmsg) ;

int main(int  argc,char * ar**)

} if(echoicmp->type==icmp_timeout  )

if(echoicmp->type==icmp_destunreach)

sleep(1);//

等待1 秒鐘

} return 0; }

12 ICMP查詢報告報文

icmp查詢報告報文分為2大類 乙個是request請求報文,乙個是reply應答報文,型別為8就代表是請求,型別為0就代表是應答。icmp查詢報告報文 型別為8代表請求報文 型別為0代表應答報文 為0 無論是請求報文還是應答報文,都是為0 前面已經多次介紹過校驗和,識別符號,序列號,這裡不再說明。...

icmp重定向實驗ensp icmp重定向實驗

一 實驗拓撲圖 二 實驗要求 三 實驗步驟配置 1 配置r0 r1 r2 r3的ip位址 r0 int f0 0 ip add 10.1.1.1 255.0.0.0 no sh r1 int f0 0 ip add 10.2.2.2 255.0.0.0 no sh r2 int f0 0 ip ad...

網路基礎 ICMP協議與eNSP實驗

1.icmp internet control message protocol internet 控制報文協議引言 icmp經常被認為是ip層的乙個組成部分。它傳遞差錯報文以及其他需要注意的資訊。icmp報文通常被ip層或更高層的協議 tcp或udp 使用。一些icmp報文把差錯報文返回給使用者程...