底层传输机制/网络编程

时间:2010-11-18 22:09:11

标签: language-agnostic networking network-programming tcp


我搜索过但找不到以下内容:
Process1通过TCP套接字传输数据。进行传输的代码是(伪代码)

//Section 1
write(sock,data,len);//any language.Just write data
//Section 2
写入后的进程1可以在第2节中继续,但这并不意味着数据已经传输。 TCP可以缓冲数据以供以后传输 现在Process2与Process1同时运行。两个进程都尝试同时发送数据 。即两者都将具有上述代码。
问题1:如果两个进程同时向TCP套接字同时写入数据,IP / OS最终将如何通过线路传输数据? a)Process1的所有数据后跟Process2的所有数据(或反向),即一些FIFO顺序?

b)Process1&amp ;;的数据。 Process2将通过网络由IP层(或OS)复用,并且将“同时”发送?
问题2:如果是我添加了一个延迟,我是否确定来自2个进程的数据是通过线路串行发送的(例如,Process1的所有数据后跟Process2的所有数据)?
更新:
Process1和Process2不是父子。他们也在不同的插座上工作 感谢

4 个答案:

答案 0 :(得分:4)

嗯,你在谈论由两个进程共享的单个套接字(如父进程和子进程)吗?在这种情况下,数据将按输出系统调用(write(2) s)的顺序进行缓冲。

如果您更有可能在两个进程中讨论两个不相关的TCP套接字,那么就不能保证数据会在网络中出现任何顺序。原因是套接字可能连接到消耗不同速度数据的远程点。 TCP flow control然后确保快速发送方不会压倒慢速接收方。

答案 1 :(得分:2)

答案1:订单未指定,至少在我见过的支持套接字的操作系统上。过程1& 2应设计成合作,例如通过在套接字上共享一个锁/互斥锁。

答案2:如果你的意思是固定时间延迟,那就不行了。相反,让进程1向进程2发出一个前进信号,指示进程1已完成发送。在进程间通信方面使用管道,本地套接字,信号,共享内存或操作系统提供的任何内容。仅在"flushing" the socket之后发送信号(实际上没有刷新)。

答案 2 :(得分:0)

TCP套接字由元组标识,元组通常至少是(源IP,源端口,目标IP,目标端口)。不同的套接字具有不同的识别元组。

现在,如果在两个进程上使用相同的套接字,则它取决于write(2)调用的顺序。但是,您应该考虑到write(2)可能不会消耗您传递给它的所有数据,发送缓冲区可能已满,导致写入较短(write()小于请求,并返回写入返回值的字节数),导致write()阻塞/休眠,直到有一些缓冲区空间,或导致write()返回EAGAIN / EWOULDBLOCK错误(对于非阻塞套接字)。

答案 3 :(得分:0)

  1. write()是原子的;同上发送()和朋友。无论哪一个先执行都将传输所有数据,而另一个数据阻止。
  2. 延迟是不必要的,见(1)。
  3. 编辑:但如果我现在看到你在谈论每个进程的不同套接字,你的问题似乎毫无意义。应用程序无法知道TCP如何使用网络,这有什么关系? TCP将按照它认为合适的顺序以高达MTU的数据包进行传输。