【发布时间】:2016-06-13 08:49:11
【问题描述】:
我有一个关于套接字编程的问题。当我使用 socket 发送数据时,我们可以使用 sendto() 等 API 使用 TCP 或 UDP 发送。 对于 sendto(),我们给出一个数组指针和我们要发送的字节数。
在这种情况下,如果我给出一个大字节数(例如:20000字节),根据我的理解,网络的MTU不会那么大,所以socket实际上发送多个数据包而不是一个大数据包。既然这 20000 字节被拆分成几个 UDP/TCP 数据包,那么这 20000 字节一开始会被视为一个数据包吗?这个过程是 UDP/TCP 碎片吗?
我的另一个问题是,如果我把小于MTU的数据放入sendto(),那么我可以保证调用一次sendto(),socket只发送一个TCP/UDP包?
提前致谢。
【问题讨论】:
-
UDP 不会按照您描述的方式对数据进行分段。 UDP 是一种面向消息的传输方式。您在 UDP 套接字上发送的内容将始终作为单个数据包发送,或者根本不发送数据包。另一方面,TCP 是一种面向流的传输方式,它会根据需要愉快地分解数据以适应网络缓冲区。
send()/sendto()的返回值会告诉你实际接受了多少字节进行传输,你要注意了。