unix网络进程

时间:2009-10-09 08:26:41

标签: unix networking tcp

我想知道如何在unix中实现tcp / ip通信。当您通过套接字发送时,tcp / level工作(汇编数据包,crc等)是否在与调用代码相同的执行上下文中执行?

或者,似乎更有可能的是,消息被发送到负责tcp通信的其他守护进程?然后,此过程接收消息并执行复制内存缓冲区和汇编数据包等所请求的工作?那么,调用代码立即恢复执行并且tcp工作是并行完成的?这是对的吗?

详情将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

TCP/IP stackkernel的一部分。发生的事情是你调用辅助方法来准备“kernel trap”。这是一种特殊的异常,它将CPU置于具有更多权限的模式(“内核模式”)。在陷阱内部,内核检查异常的参数。其中一个是要调用的函数的编号。

调用该函数时,它会将数据复制到内核缓冲区中,并为要处理的数据做好准备。然后它从陷阱返回,CPU恢复寄存器及其原始模式,并继续执行代码。

某些内核thread将获取数据副本并使用网络驱动程序将其发送出去,执行所有错误处理等。

所以,是的,在复制必要的数据后,您的代码将恢复,实际的数据传输将并行发生。

请注意,这是针对TCP数据包的。 TCP协议为您完成所有错误处理和握手,因此您可以为其提供所有数据,并且它将知道该怎么做。如果连接出现问题,您只会在一段时间后发现,因为TCP协议本身可以处理短暂的网络中断。这意味着在您收到错误之前,您已经“发送”了一些数据。这意味着只有在第N次调用send()之后或者当您尝试关闭连接时才会获得第一个数据包的错误代码(close()将挂起,直到接收方确认所有数据包为止)。< / p>

UDP协议不缓冲。当呼叫返回时,数据包就在它的路上。但它是“火与忘记”,所以你只知道司机把它放在电线上。如果你想知道它是否已到达某个地方,你必须找到一种方法来实现这一目标。通常的做法是让接收方发回一个ack UDP数据包(也可能会丢失)。

答案 1 :(得分:0)

不 - 没有并行执行。确实,进行系统调用时的执行上下文与通常的执行上下文不同。当你进行系统调用时,例如通过网络发送数据包,你必须切换到内核的上下文 - 内核自己的内存映射和堆栈,而不是你进程内的虚拟内存。

但是没有守护进程神奇地调度您的呼叫。程序执行的其余部分必须等待系统调用完成并返回它将返回的任何值。这就是为什么当你从系统调用返回时可以立即指望返回值可用的原因 - 例如从套接字实际读取的字节数或写入文件的值。

我试图找到关于上下文切换到内核空间如何工作的一个很好的解释。这是一个很好的深入的,甚至专注于特定于架构的实现:

http://www.ibm.com/developerworks/linux/library/l-system-calls/