實驗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報文把差錯報文返回給使用者程...