TCP是否使用自己的线程?
Does TCP use an own thread?
TCP 在收到网络数据包时发送 ACK。它还会在发生超时时重新发送数据包。现在我的问题是:TCP 在哪个线程中执行此操作?是否有一个秘密的 TCP 后台线程监听接收到的数据包和超时并触发发送 ACK 并重新发送?还是仅当我在套接字上调用 receive
时才同步发生?或者可能有一个来自 OS 的自己的 TCP 守护进程来处理这个?
尽管我的问题涉及 .net
,但我认为它通常适用于任何语言的任何 TCP 实现。
简短的回答是它神奇地发生了,你不需要担心它。但这不是你想知道的。
OS 就是这样做的。传入的网络数据包会导致 NIC 出现中断问题。此中断由驱动程序处理并最终传递给 OS 的 TCP 组件。然后 TCP 组件执行必要的操作以将数据包传送到应用程序。这可能意味着完成未完成的数据 IO 请求或排队等待稍后获取的数据。
在大多数现代通用 OSes 中,包括 Linux、其他 Unix 和 Windows,这是在内核态而不是在用户态完成的。在内核领域,这可以使用不同的机制来完成,包括内核线程,但最常见的是通过延迟的超时请求和由特殊线程池执行的短任务来完成。
例如,在 McKusick & Co. 的一本经典书籍 "Design and implementation of 4.4BSD operating system" 中,它描述了几乎所有 OS 供应商克隆的原始 BSD 套接字实现,描述了一个 TCP 套接字的两个计时器, "fast" 和 "slow" 一个。当计时器触发时,将在特定流程上下文之外的所谓 "softinterrupt" 级别安排操作。与现代版本不同,此版本没有将此类 activity 附加到已声明的进程。您应该阅读这本书(或其现代类似物),或其他一些经典系列 - R. Stevens 的网络编程系列。我不知道 Windows 的良好模拟,对 TCP/IP 堆栈工作的深入解释。
TCP 和套接字通常不依赖于语言,而是依赖于系统及其架构。
解决您的问题:
TCP 在哪个线程中执行此操作?
当然,不在任何应用程序线程上。通常,您无法真正定义它,因为在内核级别上 可能 没有 "thread".
这样的东西
是否有秘密的TCP后台线程监听收到的数据包和超时并触发发送ACK和重发?
如果您认为 OS 是 "secret background thread" 那么...是的。
或者这是否只在我调用时同步发生,例如,在套接字上接收?
当您调用 receive 时,系统会检查其缓冲区中是否有任何传入数据包。但话又说回来,这可能或多或少取决于系统。
或者可能有一个来自 OS 的自己的 TCP 守护进程来处理这个?
大致如此。
有关更多信息,您可能需要查看以下链接:
http://en.wikipedia.org/wiki/Protocol_stack
http://www.ece.virginia.edu/cheetah/documents/papers/TCPlinux.pdf
PS。我无法快速找到有关 Windows TCP/IP 实现的详细信息,但由于 winsocks 有点基于 BSD 套接字,我认为它是相似的。
TCP 在收到网络数据包时发送 ACK。它还会在发生超时时重新发送数据包。现在我的问题是:TCP 在哪个线程中执行此操作?是否有一个秘密的 TCP 后台线程监听接收到的数据包和超时并触发发送 ACK 并重新发送?还是仅当我在套接字上调用 receive
时才同步发生?或者可能有一个来自 OS 的自己的 TCP 守护进程来处理这个?
尽管我的问题涉及 .net
,但我认为它通常适用于任何语言的任何 TCP 实现。
简短的回答是它神奇地发生了,你不需要担心它。但这不是你想知道的。
OS 就是这样做的。传入的网络数据包会导致 NIC 出现中断问题。此中断由驱动程序处理并最终传递给 OS 的 TCP 组件。然后 TCP 组件执行必要的操作以将数据包传送到应用程序。这可能意味着完成未完成的数据 IO 请求或排队等待稍后获取的数据。
在大多数现代通用 OSes 中,包括 Linux、其他 Unix 和 Windows,这是在内核态而不是在用户态完成的。在内核领域,这可以使用不同的机制来完成,包括内核线程,但最常见的是通过延迟的超时请求和由特殊线程池执行的短任务来完成。
例如,在 McKusick & Co. 的一本经典书籍 "Design and implementation of 4.4BSD operating system" 中,它描述了几乎所有 OS 供应商克隆的原始 BSD 套接字实现,描述了一个 TCP 套接字的两个计时器, "fast" 和 "slow" 一个。当计时器触发时,将在特定流程上下文之外的所谓 "softinterrupt" 级别安排操作。与现代版本不同,此版本没有将此类 activity 附加到已声明的进程。您应该阅读这本书(或其现代类似物),或其他一些经典系列 - R. Stevens 的网络编程系列。我不知道 Windows 的良好模拟,对 TCP/IP 堆栈工作的深入解释。
TCP 和套接字通常不依赖于语言,而是依赖于系统及其架构。
解决您的问题:
TCP 在哪个线程中执行此操作? 当然,不在任何应用程序线程上。通常,您无法真正定义它,因为在内核级别上 可能 没有 "thread".
这样的东西是否有秘密的TCP后台线程监听收到的数据包和超时并触发发送ACK和重发? 如果您认为 OS 是 "secret background thread" 那么...是的。
或者这是否只在我调用时同步发生,例如,在套接字上接收? 当您调用 receive 时,系统会检查其缓冲区中是否有任何传入数据包。但话又说回来,这可能或多或少取决于系统。
或者可能有一个来自 OS 的自己的 TCP 守护进程来处理这个? 大致如此。
有关更多信息,您可能需要查看以下链接: http://en.wikipedia.org/wiki/Protocol_stack http://www.ece.virginia.edu/cheetah/documents/papers/TCPlinux.pdf
PS。我无法快速找到有关 Windows TCP/IP 实现的详细信息,但由于 winsocks 有点基于 BSD 套接字,我认为它是相似的。