2016-03-01 20 views
1

我有一个关于套接字编程的问题。当我使用套接字发送数据时,我们可以使用sendto()等API使用TCP或UDP进行发送。 对于sendto(),我们给出一个数组指针和我们想要发送的字节数。在这种情况下,如果我给出了一个大的字节数(例如:20000字节),根据我的理解,网络的MTU不会那么大,所以socket实际上发送多个数据包而不是一个大数据包。由于这些20000字节被分成多个UDP/TCP数据包,但是这些20000字节在开始时会被看作是一个数据包吗?这个过程是UDP/TCP碎片吗?套接字编程,如果我写入多个TCP/UDP数据包可以承载数据会发生什么?

我的另一个问题是,如果我把数据大小比MTU小sendto(),那么我可以保证调用sendto()一次,套接字只发送一个TCP/UDP数据包?

在此先感谢。

+0

UDP不会按照您描述的方式对数据进行分段。 UDP是一种面向消息的传输。您在UDP套接字上发送的内容将总是作为单个数据包发送,或者根本不发送数据包。另一方面,TCP是一种面向数据流的传输方式,可以根据需要快速分解数据以适应网络缓冲区。 'send()'/'sendto()'的返回值会告诉你到底有多少字节被传输,你必须注意它。 –

回答

2

这20000字节在开始时会被看作是一个数据包吗?这个过程是UDP/TCP碎片吗?

  1. 如果你的socket发送缓冲区足够大的空间容纳UDP将会把它作为一个数据报。否则,你会得到EMSGSIZE。它可能随后在IP层被分割,并且如果一个片断丢失,那么整个数据报也会丢失,但是如果所有片段都到达,那么整个数据报将被原封不动地接收。

  2. TCP将发送它所有,分割和碎片它,但它认为合适。除非有足够长的网络中断,否则它将全部到达,完好无损。

我的另一个问题是,如果我把数据大小小于MTU到的sendto(),那么我可以保证通话的sendto()一次,插座只发送一个TCP/UDP数据包?

  1. UDP:是的。
  2. TCP:no。
+0

TCP:no这是因为数据大小必须小于MSS而不是MTU? – buddha

+0

@buddha没有,因为我上面说的:TCP可以segmentize它喜欢的任何方式。 – EJP

+0

好吧,我对“TCP可以以任何方式进行分段”的理解是,影响TCP分段的因素很多,例如网络拥塞状况,而不仅仅是MSS。 – buddha

相关问题