Chinaunix首页 | 论坛 | 博客
  • 博客访问: 302072
  • 博文数量: 47
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-23 09:10
文章分类

全部博文(47)

文章存档

2009年(3)

2008年(4)

2007年(14)

2006年(26)

我的朋友

分类: 系统运维

2006-02-23 21:19:35

ICMP协议分析

- ICMP 数据结构

类型8的回显请求
struct icmp_echo_hdr {
  u16_t _type_code;
  u16_t chksum;
  u16_t id;
  u16_t seqno;
};
类型3的目的不可达应答
struct icmp_dur_hdr {
  u16_t _type_code;
  u16_t chksum;
  u32_t unused;
};
类型11的超时应答
struct icmp_te_hdr {
  u16_t _type_code;
  u16_t chksum;
  u32_t unused;
};

- ICMP 处理函数

void icmp_input(struct pbuf *p, struct netif *inp);
lwIP ICMP只接受类型为8的ECHO。函数首先从pbuf中去除IP头,获得ICMP头。只有当type为ECHO时才处理。
首先忽略源ip为广播或多播的分组(ICMP协议规定)。检查校验和是否正确。然后准备回显分组,其实就是将接受到的分组的IP源/目的地址交换,设置ICMP报头类型为0,重新计算校验和。最后发送ECHO回应。
 
void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
发送主机不可达的ICMP回应。分配一个IP分组缓冲区,然后填充成ICMP错误报文。再交至ip_output发送。
该函数被ip_input及udp_input调用,来处理ip头中无效protocol域,发送无效协议ICMP及UDP包的目的地址是广播或多播地址,发送端口不可达ICMP分组。
 
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
发送TTL超时错误报文,和icmp_dest_unreach处理方式一样。
该函数被ip_forward调用,如果TTL为0,则发送超时ICMP分组
阅读(6180) | 评论(8) | 转发(0) |
0

上一篇:lwIP ARP协议分析

下一篇:STL map/hash_map/string

给主人留下些什么吧!~~

chinaunix网友2008-04-15 09:13:54

你们好,我现在正在AT7X256上 基于ucos移植lwip,现在已经可以ping通了 ,也就是icmp协议是好的了,可是当我测试上层tcp udp时 写一个创建socket的函数,程序就死掉了,不知道各位碰到过没,我QQ 49329745 希望得到指点