当前位置: 首页 > 知识库问答 >
问题:

套接字编程,如果我写的数据超过一个TCP/UDP数据包可以携带会发生什么?

公孙成仁
2023-03-14

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

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

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

提前感谢。

共有1个答案

锺伟志
2023-03-14

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

>

  • 如果套接字发送缓冲区足够大,UDP会将其作为一个数据报发送。否则你会得到EMSGSIZE。它可能随后在IP层被分割,如果一个片段丢失,整个数据报也会丢失,但如果所有片段都到达,整个数据报将被完整接收。

    TCP将发送所有内容,按其认为合适的方式对其进行分段和分割。除非网络中断足够长的时间,否则所有这些信息都会完整有序地到达。

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

    1. UDP:是的。
    2. TCP:没有。

  •  类似资料:
    • 我创建了某种类型的客户机/服务器应用程序,它有自己的数据ACK系统。由于某些限制,它最初是用TCP编写的,但它的基础是考虑到UDP编写的。 我发送到服务器的数据包有自己的封装(数据包id和数据包大小报头。我知道UDP还有一个校验和,所以我没有为此添加报头),但是TCP是如何工作的,我知道服务器可能接收不到整个数据包,所以我收集并缓冲了接收到的数据,直到收到一个完整的有效数据包。 我想知道的是:如果

    • 我在JAVA中通过TCP接收字节数据包时遇到了一些问题。我的TCPServer类发送207字节的数据包。当我发送一个数据包时,控制台中的程序显示“读取207字节的数据包”然后停下来。在下一个数据包继续执行时,显示“多重测量”和“读取1868767867字节数据包”。之后,接收将永远停止。我不知道它为什么接收1868767867字节。我在wireshark中检查它,服务器总是发送207字节。 这是我

    • 我对ServerSocket客户端有疑问:Android服务器:我的pc带有静态IP我正在使用客户端的一个套接字连接到服务器,服务器接受套接字并获取其输入和输出流。问题是,当服务器将数据写入输出流时,我无法理解客户端如何接收消息(我知道如何)。如果服务器向客户端发送数据,考虑到客户端(android)没有可以通过互联网访问的ip,怎么可能呢。我知道长轮询,这里也使用这种方法吗?

    • 我正在使用异步套接字用C#编写一个多客户端/服务器应用程序。连接上的每个客户端发送10个项目。问题是,当快速启动大量客户机时,每个客户机发送的条目都少于10个,有时什么也不发送,服务器只记录它们的连接。

    • 我正在开发一个使用TCP套接字的客户端(Java)/服务器(C++)应用程序。我使用的协议由2个字节开头的消息组成,这些字节定义了消息内容的类型。所以基本上,接收线程在循环中等待接收数据。但我希望使用套接字的超时通知其他主机发送数据的时间过长。