TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?
当前回答
根据http://en.wikipedia.org/wiki/Maximum_segment_size的说法,网络上IPV4数据包的默认最大大小是536字节(字节大小为8位)。参见RFC 879
其他回答
TCP API中没有包。
底层协议中通常有一些数据包,比如TCP在IP上运行时,你对这些数据包不感兴趣,因为它们与用户没有任何关系,除了非常微妙的性能优化,你可能对这些性能优化不感兴趣(根据问题的提法)。
如果你问在一个API调用中可以发送()的最大字节数是多少,那么这取决于实现和设置。您通常会调用send()来获取最多几千字节的数据块,并随时准备好系统完全或部分拒绝接受它,在这种情况下,您必须手动管理将数据分割为更小的数据块,以便将数据送入TCP send() API。
一种解决方案是将套接字选项TCP_MAXSEG (http://linux.die.net/man/7/tcp)设置为一个对底层网络“安全”的值(例如,设置为1400在以太网上是安全的),然后在发送系统调用时使用一个大的缓冲区。 这样可以减少昂贵的系统调用。 内核将拆分数据以匹配MSS。
这样可以避免截断数据,应用程序也不必担心缓冲区太小。
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低的层(例如以太网)具有更小的数据包大小。
例如,以太网的MTU(最大传输单元)是1500字节。某些类型的网络(如令牌环)具有较大的mtu,而某些类型的mtu较小,但每个物理技术的值都是固定的。
This is an excellent question and I run in to this a lot at work actually. There are a lot of "technically correct" answers such as 65k and 1500. I've done a lot of work writing network interfaces and using 65k is silly, and 1500 can also get you in to big trouble. My work goes on a lot of different hardware / platforms / routers, and to be honest the place I start is 1400 bytes. If you NEED more than 1400 you can start to inch your way up, you can probably go to 1450 and sometimes to 1480'ish? If you need more than that then of course you need to split in to 2 packets, of which there are several obvious ways of doing..
问题是,您正在谈论创建一个数据包并通过TCP将其写入,但当然还有附加的头数据等等,因此您有“包袱”,使您达到1500或更多。而且很多硬件都有下限。
如果你“推它”,你会看到一些非常奇怪的事情发生。显然,我很少看到被截断的数据,或者丢失的数据。损坏的数据也很少发生,但肯定会发生。
根据http://en.wikipedia.org/wiki/Maximum_segment_size的说法,网络上IPV4数据包的默认最大大小是536字节(字节大小为8位)。参见RFC 879
推荐文章
- 连接网络共享时,如何提供用户名和密码
- 如何找到可用的端口?
- 如何通过windows命令行关闭TCP和UDP端口
- UDP和TCP比起来快多少?
- 一个干净、轻量级的Python扭曲的替代品?
- 将主机端口转发到docker容器
- 远程主机强制关闭现有连接
- TCP连接的最大数据包大小
- HTTP 1.1和HTTP 2.0的区别是什么?
- connectexception:拒绝连接
- 互联网上最大的安全UDP包大小是多少
- 关闭vs关闭套接字?
- 如何解决“java.net.BindException: Address already in use: JVM_Bind”错误?
- 增加Linux中TCP/IP连接的最大数量
- 模拟慢速网络连接的网络工具