Language agnostic tcp底层传输机制/网络编程

Language agnostic tcp底层传输机制/网络编程,language-agnostic,networking,network-programming,tcp,Language Agnostic,Networking,Network Programming,Tcp,我已经搜索了,但找不到以下内容: Process1通过TCP套接字传输数据。进行传输的代码为(伪代码) 写入后的进程1可以在第2节中继续,但这并不意味着数据已经传输。TCP可能已经缓冲了数据以便以后传输。 现在Process2与Process1同时运行。两个进程都尝试同时发送数据。也就是说,两者都有上述代码。 问题1:如果两个进程同时将数据写入TCP套接字数据最终将如何通过IP/OS通过线路传输? a) 进程1的所有数据后跟进程2的所有数据(或相反),即一些FIFO顺序? 或 b) 来自Proc


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

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

b) 来自Process1和Process2的数据将由IP层(或OS)通过线路多路传输,并将“并发”发送?
问题2:如果例如我添加了延迟,我是否可以确保来自两个进程的数据通过线路串行发送(例如,进程1的所有数据后跟进程2的所有数据)?
更新:
进程1和进程2不是父子进程。他们也在不同的插座上工作

谢谢

回答1:顺序未明,至少在我看到的支持操作系统的套接字上是这样。进程1和进程2应设计为协作,例如通过共享套接字上的锁/互斥锁


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

回答1:顺序未指定,至少在我看到的支持操作系统的套接字上是这样。进程1和进程2应设计为协作,例如通过共享套接字上的锁/互斥锁


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

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


如果,更可能的情况是,您讨论的是两个进程中的两个不相关的TCP套接字,那么无法保证数据将以任何顺序到达连接。原因是套接字可能连接到使用不同速度数据的远程点。TCP然后确保快速发送方不会压倒慢速接收方。

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


如果,更可能的情况是,您讨论的是两个进程中的两个不相关的TCP套接字,那么无法保证数据将以任何顺序到达连接。原因是套接字可能连接到使用不同速度数据的远程点。TCP然后确保快速发送方不会压倒慢速接收方。

TCP套接字由一个元组标识,该元组通常至少为(源IP、源端口、目标IP、目标端口)。不同的套接字具有不同的标识元组


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

TCP套接字由一个元组标识,该元组通常至少为(源IP、源端口、目标IP、目标端口)。不同的套接字具有不同的标识元组

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

  • write()是原子的;同上发送()和朋友。首先执行的一个将传输其所有数据,而另一个将阻塞
  • 延迟是不必要的,请参见(1)
  • 编辑:但如果正如我现在看到的,你谈论的是每个进程的不同套接字,那么你的问题似乎毫无意义。应用程序无法知道TCP是如何使用网络的,那么这又有什么关系呢?TCP将以其认为合适的任何顺序以最多一个MTU的数据包进行传输

  • write()是原子的;同上发送()和朋友。首先执行的一个将传输其所有数据,而另一个将阻塞
  • 延迟是不必要的,请参见(1)

  • 编辑:但如果正如我现在看到的,你谈论的是每个进程的不同套接字,那么你的问题似乎毫无意义。应用程序无法知道TCP是如何使用网络的,那么这又有什么关系呢?TCP将以其认为合适的任何顺序以最多一个MTU的数据包进行传输。

    但输出系统调用的顺序必须明确控制,否则它将变得不确定。是的,但这是一个完全不同的讨论。@Nikolai N Fetissov:所以操作系统调用的行为不是
    //Section 1
    write(sock,data,len);//any language.Just write data
    //Section 2