套接字编程,如果我写数据多个TCP / UDP数据包可以携带怎么办?

时间:2016-03-01 03:58:24

标签: sockets tcp udp

我对套接字编程有疑问。当我使用socket发送数据时,我们可以使用诸如sendto()之类的API来使用TCP或UDP发送。 对于sendto(),我们给出一个数组指针和我们想要发送的字节数。

在这种情况下,如果我给出一个大的字节数(例如:20000字节),根据我的理解,网络的MTU不会那么大,所以套接字实际上发送多个数据包而不是一个大数据包。由于这些20000字节被分成几个UDP / TCP数据包,但这些20000字节在开始时会被视为一个数据包吗?这个过程是UDP / TCP碎片吗?

我的另一个问题是,如果我将数据大小小于MTU放入sendto(),那么我可以保证调用sendto()一次,socket只发送一个TCP / UDP数据包?

提前致谢。

1 个答案:

答案 0 :(得分:3)

  

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

  1. 如果套接字发送缓冲区大到足以容纳它,UDP将把它作为一个数据报发送。否则你会得到EMSGSIZE。它可能随后在IP层碎片化,如果碎片丢失,整个数据报也会丢失,但如果所有碎片到达,整个数据报将被完整接收。

  2. TCP将发送所有内容,然后根据其认为合适的方式对其进行分段和分段。除非有足够长的网络中断,否则它将全部到达,完整无缺。

  3.   

    我的另一个问题是,如果我将数据大小小于MTU放入sendto(),那么我可以保证调用sendto()一次,socket只发送一个TCP / UDP数据包?

    1. UDP:是的。
    2. TCP:没有。
相关问题