(网易游戏一面的问题,没答上来...)
不考虑域名解析、ARP 广播、路由转发、各种校验的简化版:
ping 192.168.0.4 ----> 构建 ICMP 包 ----> 构建 IP 分组 ----> 解析硬件地址封装成帧 ----> 物理层发送
接收方就是反过来拆包的过程。
完整流程如下:
- 如果是 ping 域名,首先需要通过 DNS 服务拿到对方的 IP。
- 主机构建一个 ICMP 格式的数据包,由 ICMP 协议将这个数据包(有效负荷)连同目的 IP 地址一起交给 IP 协议。
- IP 协议构建一个分组(本机 IP + 控制信息 + 目的 IP),控制信息至少包含了 01h 的协议字段,这样当此分组到达目的方时,这些内容就会告诉目的主机应该将这个有效负荷交付给哪个协议来处理,本例中就是 ICMP。
- 如果目的 IP 不跟自己在同一个网段,则需要通过路由转发,先通过路由信息得到网关 IP。如果在同一网段则没有此步骤。
- 如果之前与目的 IP (或网关 IP)通信过,应该在 ARP 缓存表中能查到对应的 MAC 地址。如果没有,就需要通过 ARP 广播来获取 MAC 地址了。把 IP 地址解析为 MAC 地址后,此分组就可被传送到数据链路层以组建成帧。
- 数据链路层将控制信息封装到此分组上,创建成帧。在这个帧中,附加有目的 MAC 地址和源 MAC 地址,以及以太网类型字段(用来指明应用于帧数据字段的协议)。在帧的尾部是 FCS(帧校验序列)字段,这个部分装载了 CRC(循环冗余校验)的计算结果。
- 把帧交付给物理层,物理层会以一次一比特的方式将帧发送到物理介质。
- 这时,此冲突域中的每台设备都会接收这些比特,并将它重新组建成帧。每个设备都会对接收到的内容进行 CRC 运算,并与帧中 FCS 字段的内容进行比对。如果值不匹配,接收到的帧将被丢弃。如果匹配,接着将检查目的 MAC 地址与自己的是否匹配。如果匹配,则接下来查看以太网类型字段,以获悉完成数据后续处理的网络层协议。
- 将分组从帧中取出,并将其他部分丢弃。然后,分组被递交给以太网类型字段中列出的协议(本例是 IP 协议)。
- IP 协议接收这个分组,并检查它的 IP 的地址。如果这是一个路由器(网关),跳到 11。如果这就是目的主机,跳到下一步 12。
- 由于分组的目的 IP 地址与此接收路由器上的各个地址均不匹配,路由器会在其路由表中查找目的 IP 的地址,(在此路由表中需要包含目的子网的相关表项,否则路由器会立即将收到的分组丢弃,并同时向发送方回送一个携带有目标网络不可达信息的 ICMP 报文。),并按照路由规则被交换到指定的输出接口的缓冲区内。接着重复 5 ~ 11 步骤。
- 分组的目的 IP 与此主机 IP 地址匹配,检查分组的协议字段,了解分组有效负荷的交付对象。此有效负荷将被递交给 ICMP,后者知道这是一个回应请求数据。ICMP 将负责应答这个请求,它首先立即丢弃这个接收到的分组然后产生一个新的有效负荷作为回应应答数据。
之后的流程就和上面一样了~