以太网缓冲区是否可以填满并且不允许另一个进程接收()以太网数据包?
Can an ethernet buffer fill up and not allow another process to recv() ethernet packets?
假设您有一个从服务器接收大文件的进程。
如果您不执行 recv() 调用,它会永远保留在您的以太网控制器的缓冲区中吗?
如果另一个进程需要接收数据并且缓冲区已满,是否需要等到另一个进程执行 recv() 或缓冲区超时?
如果你有多个进程发送和接收数据是否必须等到缓冲区为空。?或者它可以多路复用它并在驱动程序级别或套接字库的某些部分进行跟踪?
编辑:拼写
- If you do not perform a recv() call does it stay on a buffer of your
ethernet controller forever?
不,数据永远不会在以太网控制器的缓冲区中停留很长时间;内核将尽可能快地从以太网控制器的缓冲区中读取数据并将其读入套接字的缓冲区(在计算机的常规 RAM 中)。如果您的套接字缓冲区已满,则传入数据将被丢弃。
- If another process needs to receive data and the buffer is full from
another process does it need to wait until the other process performs
a recv() or the buffer times out?
每个套接字在计算机的主 RAM 中都有自己独立的缓冲区,每个进程都有自己的套接字,因此进程不必等待彼此的缓冲区清空。
- If you have multiple process sending and receiving data does it have
to wait until the buffer is empty.?
查看问题 2 的答案,因为它也回答了这个问题。
这是真空型答案中的完美球形鸡。但是您的问题非常广泛,并且有很多假设取决于 NIC、OS 和许多其他因素。
但让我们假设您使用的是现代成熟的 OS,带有现代以太网控制器。
- 没有。这一切都由内核和协议的东西处理。内核在等待您时不能让网络控制器上的缓冲区填满。否则会阻塞其他进程访问网络。所以它会缓冲它直到你准备好。对于某些协议,有一种机制可以让一个设备告诉另一个设备不要再发送任何数据。 (ei. TCP 接收 Window 大小,一旦发送方发送了该数量的数据,它将停止,直到接收方以某种方式确认它)
- 基本上和上面的答案一样,OS处理了细节。从你的角度来看,你的 recv() 不会阻止任何其他进程 recv() 的能力。
- 这更有趣,现代 NIC 是基于队列的。您有 n 个 transmit/receive 队列,并且在大多数情况下,过滤器可以附加到它们。这允许 NIC 执行许多通常必须由 OS 完成的功能(这称为卸载),但回到重点。使用这些 NIC,您有多个 I/O 而无需多路复用。虽然一般来说,尤其是在消费级 NIC 上,队列的数量会非常少。通常是4。所以会涉及到一些复用。
假设您有一个从服务器接收大文件的进程。
如果您不执行 recv() 调用,它会永远保留在您的以太网控制器的缓冲区中吗?
如果另一个进程需要接收数据并且缓冲区已满,是否需要等到另一个进程执行 recv() 或缓冲区超时?
如果你有多个进程发送和接收数据是否必须等到缓冲区为空。?或者它可以多路复用它并在驱动程序级别或套接字库的某些部分进行跟踪?
编辑:拼写
- If you do not perform a recv() call does it stay on a buffer of your ethernet controller forever?
不,数据永远不会在以太网控制器的缓冲区中停留很长时间;内核将尽可能快地从以太网控制器的缓冲区中读取数据并将其读入套接字的缓冲区(在计算机的常规 RAM 中)。如果您的套接字缓冲区已满,则传入数据将被丢弃。
- If another process needs to receive data and the buffer is full from another process does it need to wait until the other process performs a recv() or the buffer times out?
每个套接字在计算机的主 RAM 中都有自己独立的缓冲区,每个进程都有自己的套接字,因此进程不必等待彼此的缓冲区清空。
- If you have multiple process sending and receiving data does it have to wait until the buffer is empty.?
查看问题 2 的答案,因为它也回答了这个问题。
这是真空型答案中的完美球形鸡。但是您的问题非常广泛,并且有很多假设取决于 NIC、OS 和许多其他因素。
但让我们假设您使用的是现代成熟的 OS,带有现代以太网控制器。
- 没有。这一切都由内核和协议的东西处理。内核在等待您时不能让网络控制器上的缓冲区填满。否则会阻塞其他进程访问网络。所以它会缓冲它直到你准备好。对于某些协议,有一种机制可以让一个设备告诉另一个设备不要再发送任何数据。 (ei. TCP 接收 Window 大小,一旦发送方发送了该数量的数据,它将停止,直到接收方以某种方式确认它)
- 基本上和上面的答案一样,OS处理了细节。从你的角度来看,你的 recv() 不会阻止任何其他进程 recv() 的能力。
- 这更有趣,现代 NIC 是基于队列的。您有 n 个 transmit/receive 队列,并且在大多数情况下,过滤器可以附加到它们。这允许 NIC 执行许多通常必须由 OS 完成的功能(这称为卸载),但回到重点。使用这些 NIC,您有多个 I/O 而无需多路复用。虽然一般来说,尤其是在消费级 NIC 上,队列的数量会非常少。通常是4。所以会涉及到一些复用。