面试题答案
一键面试ICMP协议主要功能
- 差错报告:当网络设备(如路由器)在处理IP数据报时遇到错误,例如目的不可达(网络不可达、主机不可达、端口不可达等)、数据报超时(生存时间TTL为0)等情况,会通过ICMP向源主机发送差错报告报文,告知源主机出现的问题。
- 网络拥塞控制:当网络发生拥塞时,路由器可能会向源主机发送ICMP源抑制报文,通知源主机降低发送数据的速率,以缓解网络拥塞。
- 路径控制:路由器可以通过ICMP重定向报文,通知主机去往某目的地址更优的下一跳地址,帮助主机优化其路由表。
- 网络诊断与测试:如ping命令利用ICMP回显请求和回显应答报文来测试网络连通性;traceroute命令利用ICMP超时和目的不可达报文来跟踪数据包从源到目的所经过的路由路径。
基于ICMP协议编写网络连通性测试工具(类似ping命令)主要实现步骤
- 创建原始套接字:在大多数操作系统中,使用socket函数创建一个原始套接字,指定协议族为IP(AF_INET),套接字类型为原始套接字(SOCK_RAW),协议为ICMP(IPPROTO_ICMP)。
- 构造ICMP报文:
- ICMP头部:
- 类型:设置为8(表示回显请求)。
- 代码:一般为0。
- 校验和:先将校验和字段置为0,然后计算整个ICMP报文(包括头部和数据部分)的校验和并填充到该字段。
- 标识符:可以是进程ID,用于标识本进程发送的ICMP报文。
- 序列号:从0开始递增,用于标识不同的回显请求报文。
- ICMP数据部分:可以包含一些自定义的数据,例如时间戳等,用于计算往返时间(RTT)。
- ICMP头部:
- 设置IP头部:虽然ICMP协议本身不包含IP头部,但原始套接字发送数据时需要填充IP头部。
- 版本:一般为IPv4,即4。
- 首部长度:IP头部长度,一般为20字节,对应值为5(以4字节为单位)。
- 区分服务:通常为0。
- 总长度:IP头部长度 + ICMP报文长度。
- 标识:可以随机生成一个值,用于唯一标识该IP数据报。
- 标志:一般设置为0。
- 片偏移:一般为0。
- 生存时间:设置合适的TTL值,如64。
- 协议:设置为ICMP协议号(1)。
- 首部校验和:计算IP头部的校验和并填充。
- 源IP地址:获取本机IP地址填充。
- 目的IP地址:填充目标主机的IP地址。
- 发送ICMP报文:使用sendto函数将构造好的包含IP头部和ICMP报文的数据发送到目标主机。
- 接收ICMP应答报文:使用recvfrom函数从套接字接收数据,等待目标主机返回的ICMP回显应答报文。
- 解析应答报文:
- 首先解析IP头部,检查IP头部的正确性,如版本、首部长度等。
- 然后根据IP头部中的总长度字段找到ICMP报文的位置,解析ICMP头部。
- 检查ICMP类型是否为0(回显应答),代码是否为0,标识符是否与发送时的标识符一致,序列号是否匹配。
- 从ICMP数据部分提取发送时填充的数据,例如时间戳,计算往返时间(RTT)。
- 显示结果:根据解析结果,显示网络连通性信息,如目标主机是否可达、往返时间等。如果在一定时间内未收到应答报文,则提示超时,表明目标主机可能不可达。