之前讨论了一个网络包的发送,现在我们来看看一个计算机或服务器收到一个网络包后会怎么做。
在一台半双工模式的以太网中,一个设备发送的包会被连接在集线器上的所有设备接收,所以接收操作会接收到很多可能不是发给自己的包。
首先PHY(MAU)模块先将信号转为通用格式然后发给MAC模块,MAC模块通过读取报头的同步时钟和起始帧分界符,将分节符后边的东西都转化为数字信息,再检查尾巴的FCS看看这个包有没有出错,出错的话就直接丢弃。
如果FCS校验没错,MAC模块就要查询MAC头部中接收方的MAC地址与自己网卡的MAC地址是否一致,来判断这个包是不是发给自己的,不是的话就丢弃这个包。是的话就把包丢到网卡的缓冲区中,然后网卡会调用操作系统的中断,让操作系统协议栈过来看看这个新收到的包。
协议栈过来后,就是IP模块的工作了,IP模块会查看数据包的IP头部信息,确认IP头部里的接收方的地址是不是自己。如果不是,IP模块就会发送ICMP消息将错误告知发送方。
如果正确,那么就交给TCP模块处理了,TCP模块会查看IP头部的发送方IP地址和接收方IP地址,以及TCP头部的发送端和接收端的端口号来查找自己协议栈内有没有对应的的套接字,找到对应的套接字后,就可以进行相应的操作了。例如,如果包的内容是数据,则返回确认接收的包,然后将数据放入缓冲区等上层应用(浏览器)来读取。如果是建立连接或者断开连接的包,则返回相应的响应控制包,然后告诉上层应用相应的状态。
这里还有个小Tips
整个发送,转发,接收的完整过程可以参考这个动画,非常详细:
https://www.bilibili.com/video/BV1c4411d7jb?p=9&vd_source=5898cd61d2d78c3c6feae32e4c4101c6