所以分组最初被存储在接收缓冲器中(这是在OSI模型的网络层)从它们由更高层在OSI模型中,即TCP(在OSI模型的传输层取出这个接收缓冲器),然后删除头部以获得数据/有效载荷...
数据接收
现在,让我们来看看是如何接收数据。数据接收是一个 过程,用于网络堆栈如何处理进入的数据包。图 3显示了网络堆栈如何处理接收到的数据包。
首先,NIC将数据包写入其内存。它通过执行CRC检查来检查数据包是否有效,然后将 数据包发送到主机的内存缓冲区。该缓冲区是驱动程序已经向内核请求 并且分配了 来接收数据包的内存。缓冲区分配后,驱动程序 会告知NIC的内存地址和大小。即使NIC收到 数据包,驱动程序仍未分配主机内存缓冲区时,NIC可能会丢弃数据包。
将数据包发送到主机内存缓冲区后,NIC向主机操作系统发送一个 中断。
然后,驱动程序检查它是否可以处理新数据包。 到目前为止,使用由制造商 定义的驱动程序NIC通信协议。
当驾驶员应该发送的分组到上层,分组 必须包装,所述操作系统使用的操作系统 了解分组的分组结构。例如,Linux的sk_buff, 的BSD系列内核的mbuf和Microsoft Windows的NET_BUFFER_LIST是相应OS的 数据包结构。驱动程序发送 包装的数据包到上层。
以太网层检查数据包是否有效,然后 解除多路复用上层协议(网络协议)。目前,它 使用以太网报头的ethertype值。 IPv4 ethertype 的值是0x0800。它删除以太网报头,然后将IP数据包发送到IP层。
IP层还检查数据包是否有效。换句话说, 它检查IP头校验和。它在逻辑上决定它是否应执行IP路由并使本地系统处理数据包 或将数据包发送到其他系统。如果本地系统必须处理分组 ,则IP层通过参考IP报头的协议值来解复用上层协议 (传输协议)。 TCP协议值为6.它删除IP头,然后将 数据包发送到TCP层。
与下层一样,TCP层检查数据包是否为 有效。它还检查TCP校验和。如前所述,由于当前网络堆栈使用校验和卸载,所以TCP校验和是由NIC而不是由内核计算的 。
然后它搜索数据包连接的TCP控制块。 此时, 数据包的<source IP, source port, target IP, target port>
被用作标识符。搜索完连接后,它会执行处理该数据包的协议。如果它已收到新的 数据,它将数据添加到接收套接字缓冲区。根据TCP状态 ,它可以发送一个新的TCP数据包(例如,一个ACK数据包)。 现在TCP/IP接收数据包处理已完成。
接收套接字缓冲区的大小是TCP接收窗口。对于某个点,当接收窗口大于 时,TCP吞吐量会增加。过去,套接字缓冲区大小已在 应用程序或OS配置上进行了调整。最新的网络堆栈具有 函数来自动调整接收套接字缓冲区大小,即接收 窗口。
当应用程序调用读取系统调用时,该区域将 更改为内核区域,并将套接字缓冲区中的数据复制到用户区中的 内存中。复制的数据将从套接字 缓冲区中删除。然后调用TCP。 TCP增加了接收 窗口,因为套接字缓冲区中有新的空间。它根据协议状态发送一个 数据包。如果没有数据包传输,则系统调用终止。