应用进程在Internet域中创建一个SOCK_RAW类型的插口,就可以利用原始IP层。一般有下列3种用法:
1.应用进程可利用原始插口发送和接收ICMP和IGMP报文。
有些选路守护程序,利用这一特征跟踪通常由内核处理的ICMP重定向报文段。
这个特征还用于实现基于ICMP的协议,如路由通告和路由请求,他们需用到ICMP,不过最好由应用进程,而不是内核完成
相应处理。
多播路由守护程序利用原始IGMP插口,发送和接收IGMP报文。
2.应用进程可利用原始插口构造自己的IP首部。
3.应用进程可利用原始插口读写内核不支持的IP协议的IP数据报。
1.原始IP的protosw结构
与所有其他协议不同,inetsw数组有多条记录都可以读写原始IP。inetsw结构中有4个记录的插口类型都等于SOCK_RAW,
但协议类型则各不相同。
IPPROTO_ICMP(协议值1)
IPPROTO_IGMP(协议值2)
IPPROTO_RAW(协议值255)
原始IP通配记录(协议值0)
四项记录间的区别总结如下:
如果应用进程创建了一个原始插口(SOCK_RAW),协议值非0,并且如果协议值等于IPPROTO_ICMP、IPPROTO__GMP
或IPPROTO_RAW,则会使用对应的protosw记录。
如果应用进程创建了一个原始插口(SOCK_RAW),协议值非0,但内核不支持该协议,pffindproto会返回协议值为0的通配
记录,从而允许应用进程处理内核不支持的IP协议,无需修改内核代码。