Web服务器返回了一个网络包,协议栈如何处理呢?
假如服务器返回的包的以太类型应该是0800,因此网卡驱动会将其交给TCP/IP协议栈来进行处理。
接下来就轮到IP模块先开始工作了,第一步是检查IP头部,确认格式是否正确。如果格式没有问题,下一步查看接收方IP地址。如果服务器返回的包的接收方IP地址和客户端网卡的地址一致,就可以接收这个包了。如果不一致,那一定是发生了什么错误。客户端计算机不负责对包进行转发,不应该收到不是发给自己的包。当发生这样的错误时,IP模块会通过ICMP消息将Destination unreachable的错误告知发送方。
接收方IP地址正确后,还要检查包是否分片,分片的话需要分片重组。IP协议有一个叫作分片的功能,简单来说,网线和局域网中只能传输小包,因此需要将大的包切分成多个小包。如果接收到的包是经过分片的,那么IP模块会将它们还原成原始的包。分片的包会在IP头部的标志字段中进行标记,当收到分片的包时,IP模块会将其暂存在内部的内存空间中,然后等待IP头部中具有相同ID的包全部到达,这是因为同一个包的所有分片都具有相同的ID。此外,IP头部还有一个分片偏移量(fragment offset)字段,它表示当前分片在整个包中所处的位置。根据这些信息,在所有分片全部收到之后,就可以将它们还原成原始的包,这个操作叫作分片重组。
IP模块的工作结束了,接下来包会被交给TCP模块。TCP模块会根据IP头部中的接收方和发送方IP地址,以及TCP头部中的接收方和发送方端口号来查找对应的套接字。找到对应的套接字之后,就可以根据套接字中记录的通信状态,执行相应的操作了。
举例子,如果包的内容是应用程序数据,则返回确认接收的包,并将数据放入缓冲区,等待应用程序来读取;如果是建立或断开连接的控制包,则返回相应的响应控制包,并告知应用程序建立和断开连接的操作状态。
本文摘取自周自恒翻译的户根勤编写的《网络是怎样连接的》
网友评论