#P10347. [THUSC 2019] 网络层协议数据处理

[THUSC 2019] 网络层协议数据处理

题目背景

百度对程序员来说最大的作用当然是测试网络的联通性,在处理完 ARP 包以后,芃芃兴奋地输入了 ping baidu.com,然而并没有得到任何结果。咨询过杰哥以后,芃芃懂得了 ping 工具的工作原理,原来它使用了 ICMP 协议,工作在比数据链路层更高的网络层。他还发现,网络中也存在许多给他发送的 ping 报文,看来的确有很多人在关心他。为了不让他们失望,你决定帮芃芃回复这些请求。

题目描述

你需要根据《学习手册》中的相关知识,处理网络层的协议数据:在给定的流量片段中,有一些是对你的 ICMP Echo Request 报文(也就是说,请求的 IP 和 MAC 地址都是是你拥有的,并为 pcap 题面中的对应关系),请你正确地回复它们。你需要构造正确的 ICMP Echo Reply 报文,以及外层的 IP 分组头、以太网帧头尾,并将这些帧按照应答顺序依次写入输出文件中。本题中只对源地址与目的地址在同一个子网中的 ICMP Echo Request 报文进行响应,而不响应其他情况(例如源地址与目的地址不在同一个网络中、ARP 请求)。

我们保证,所有 ICMP Echo Request 报文在数据链路层和网络层都是单播发送的(也就是说不用考虑广播地址等情况,广播地址的定义见《学习手册》),请注意正确填写回复报文在这两层的源、目标地址。如果接收到的报文中含有数据负载,则你回复的报文中也需要原样携带这些负载,但不要携带链路层帧中超过 IP 包尺寸后的多余数据(请忽略 Wireshark 对这部分数据的解析)。特别地,本题对输出数据中片段的时间戳有额外的要求,设 ICMP Echo Request 的时间戳为 (sec0,us0)(\sec_0, \text{us}_0),那么你回应的 ICMP Echo Response 的时间戳 (sec,us)(\sec, \text{us}) 应该满足 $\sec \times 10^6 + \text{us} = \sec_0 \times 10^6 + \text{us}_0 + 1$ 并且 0us<1060 \le \text{us} < 10^6,数据保证 us0<106,sec<232\text{us}_0 < 10^6, \sec < 2^{32},不保证上述加法不会溢出 32 位无符号整数。注意 Wireshark 界面上部显示的时间是相对于第一个以太网帧的时间戳的偏差。

输入格式

输入包含不超过 nn 个流量片段,总大小不超过 mm 字节。

输出格式

你的输出将与答案文件进行逐字节对比。请不要输出任何多余信息,以免导致不必要的失分。

提示

【子任务】

本题的各子任务规模与上一题相同。

【样例 1】

见题目附件 1.in/ans

【样例解释 1】

样例中输入数据是三个 ICMP Echo Request ,输出数据是三个对应的 ICMP Echo Reply

【提示】

请不要忘记前三题题面中与本题相关的内容,并注意 FCS 和 IP 校验和的计算和以太网帧的长度要求。