首页 文章

TCP连接的最大数据包大小

提问于
浏览
167

TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?

10 回答

  • 6

    TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小 .

    例如,以太网的MTU(最大传输单元)为1500字节 . 某些类型的网络(如令牌环)具有更大的MTU,并且某些类型具有更小的MTU,但是每个物理技术的值是固定的 .

  • 2

    这是一个很好的问题,我实际上在工作中遇到了很多 . 有很多“技术上正确”的答案,如65k和1500.我已经做了很多编写网络接口的工作,使用65k是愚蠢的,1500也可以让你遇到大麻烦 . 我的工作涉及很多不同的硬件/平台/路由器,说实话,我开始的地方是1400字节 . 如果你需要超过1400你可以开始上升,你可能会到1450年,有时到1480年?如果您需要更多,那么当然您需要拆分为2个数据包,其中有几个明显的方法 .

    问题是你正在谈论创建一个数据包并通过TCP写出来,但当然还有 Headers 数据等等,所以你有“ Baggage ”让你达到1500或更高......还有一个很多硬件都有下限 .

    如果你“推它”,你可以得到一些非常奇怪的事情 . 显然,截断的数据或丢失的数据我很少见到 . 损坏的数据也很少但肯定会发生 .

  • 3

    在应用程序级别,应用程序使用TCP作为面向流的协议 . TCP依次具有段并且抽象出使用不可靠IP分组的细节 .

    TCP处理段而不是数据包 . 每个TCP段具有包含在TCP头部内的序列号 . TCP段中发送的实际数据是可变的 .

    某些操作系统支持getsockopt的值,可以使用称为TCP_MAXSEG,它检索最大TCP段大小(MSS) . 但是并非所有操作系统都支持它 .

    我不确定你要做什么,但如果你想减少使用的缓冲区大小,你也可以考虑:SO_SNDBUF和SO_RCVBUF .

  • 3

    根据http://en.wikipedia.org/wiki/Maximum_segment_size,网络上IPV4数据包的默认最大大小为536个八位字节(大小为8位的字节) . 见RFC 879

  • 17

    TCP API中没有数据包 .

    基本协议中经常有数据包,比如TCP通过IP完成,你不感兴趣,因为它们与用户无关,除了你可能不感兴趣的非常微妙的性能优化(根据问题的表述) .

    如果你问一个API调用中的最大字节数是多少,那么这是依赖于实现和设置的 . 您通常会调用send()来获取高达几千字节的块,并且随时准备系统拒绝完全或部分接受它,在这种情况下,您必须手动管理拆分为较小的块以将数据提供给TCP send()API .

  • 2

    通常,这取决于连接使用的接口 . 您可以使用ioctl()获取MTU,如果是以太网,通常可以通过从中减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,该大小为14 .

    仅当MTU在整个网络中至少那么大时才是这种情况 . TCP可能会使用路径MTU发现来降低有效MTU .

    问题是,你为什么关心?

  • 72

    如果您使用的是Linux机器,则“ifconfig eth0 mtu 9000 up”是设置接口MTU的命令 . 但是,我不得不说,如果网络传输不那么稳定,大MTU有一些缺点,它可能会使用更多的内核空间内存 .

  • 147

    一种解决方案是将套接字选项TCP_MAXSEG(http://linux.die.net/man/7/tcp)设置为与底层网络"safe"的值(例如,设置为1400以便在以太网上安全),然后在发送系统调用中使用大缓冲区 . 这样可以减少昂贵的系统调用 . 内核将拆分数据以匹配MSS .

    这样您就可以避免截断数据,并且您的应用程序不必担心小缓冲区 .

  • 1

    似乎互联网上的大多数网站使用1460字节对于MTU的值 . 有时它是1452,如果你在VPN上,它将为IPSec Headers 丢弃更多 .

    默认窗口大小变化很大,最大为65535字节 . 我使用http://tcpcheck.com查看我自己的源IP值并检查其他Internet供应商正在使用的内容 .

  • 4

    IP协议(Ip4)中TCP设置的数据包大小 . 对于该字段(TL),分配16位,因此数据包的最大大小为65535字节:IP protocol details

相关问题