我对套接字编程有疑问。当我使用socket发送数据时,我们可以使用诸如sendto()之类的API来使用TCP或UDP发送。 对于sendto(),我们给出一个数组指针和我们想要发送的字节数。
在这种情况下,如果我给出一个大的字节数(例如:20000字节),根据我的理解,网络的MTU不会那么大,所以套接字实际上发送多个数据包而不是一个大数据包。由于这些20000字节被分成几个UDP / TCP数据包,但这些20000字节在开始时会被视为一个数据包吗?这个过程是UDP / TCP碎片吗?
我的另一个问题是,如果我将数据大小小于MTU放入sendto(),那么我可以保证调用sendto()一次,socket只发送一个TCP / UDP数据包?
提前致谢。
答案 0 :(得分:3)
这些20000字节会在开始时被视为一个数据包吗?这个过程是UDP / TCP碎片吗?
如果套接字发送缓冲区大到足以容纳它,UDP将把它作为一个数据报发送。否则你会得到EMSGSIZE。它可能随后在IP层碎片化,如果碎片丢失,整个数据报也会丢失,但如果所有碎片到达,整个数据报将被完整接收。
TCP将发送所有内容,然后根据其认为合适的方式对其进行分段和分段。除非有足够长的网络中断,否则它将全部到达,完整无缺。
我的另一个问题是,如果我将数据大小小于MTU放入sendto(),那么我可以保证调用sendto()一次,socket只发送一个TCP / UDP数据包?