TCP是否使用自己的线程?

时间:2015-02-21 20:20:16

标签: .net multithreading sockets networking tcp

TCP在收到网络数据包时发送ACK。它还会在发生超时时重新发送数据包。现在我的问题是:TCP在哪个线程中执行此操作?是否有一个秘密的TCP后台线程,它会侦听收到的数据包和超时,并触发发送ACK和重新发送?或者,这只是在我打电话给你时,例如receive来同步发生的吗?或者是否可能有来自操作系统的自己的TCP守护进程处理这个?

虽然我的问题涉及.net,但我认为它通常适用于任何语言的任何TCP实施。

3 个答案:

答案 0 :(得分:3)

TCP和套接字通常不依赖于语言,而是依赖于系统及其体系结构。

解决您的问题:

TCP在哪个线程中执行此操作? 当然,不在任何应用程序线程上。通常,你无法真正定义它,因为在内核级别上可能不会出现" thread"。

是否存在侦听收到的数据包和超时的秘密TCP后台线程并触发发送ACK和重新发送? 如果你认为OS是一个"秘密背景线程"然后......是的。

或者这只会在我打电话时同步发生,例如,在套接字上接收? 当您调用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套接字,我认为它类似。

答案 1 :(得分:1)

简短的回答是它神奇地发生了,你不需要担心它。但那不是你想要知道的。

操作系统会这样做。传入的网络数据包会导致NIC出现中断问题。该中断由驱动程序处理并最终传递给OS的TCP组件。然后,TCP组件执行将数据包传递到应用程序所需的内容。这可能意味着完成一个未完成的数据IO请求,或者排队等待稍后提取的数据。

答案 2 :(得分:1)

在大多数现代通用操作系统中,包括Linux,其他Unix和Windows,这是在内核上完成的,而不是在用户区域完成的。在内核领域,这可以使用不同的机制来完成,包括内核线程,但大多数情况下,它是通过推迟的超时请求和由特殊线程池执行的短任务完成的。

例如,在McKusick& Sons的经典着作“4.4BSD操作系统的设计和实现”中。 Co。描述了几乎所有操作系统供应商克隆的原始BSD套接字实现,两个定时器被描述为TCP套接字,“快速”和“慢速”。当计时器触发时,在特定进程上下文之外的所谓“软中断”级别调度操作。与现代版本不同,此版本未将此类活动附加到已声明的进程。您应该阅读本书(或其现代模拟),或其他一些经典系列 - R. Stevens的网络编程。我不太了解Windows的模拟,深入解释TCP / IP堆栈的工作原理。