TCP连接的最大数据包大小是多少,或者如何获得最大数据包大小?
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小 .
例如,以太网的MTU(最大传输单元)为1500字节 . 某些类型的网络(如令牌环)具有更大的MTU,并且某些类型具有更小的MTU,但是每个物理技术的值是固定的 .
这是一个很好的问题,我实际上在工作中遇到了很多 . 有很多“技术上正确”的答案,如65k和1500.我已经做了很多编写网络接口的工作,使用65k是愚蠢的,1500也可以让你遇到大麻烦 . 我的工作涉及很多不同的硬件/平台/路由器,说实话,我开始的地方是1400字节 . 如果你需要超过1400你可以开始上升,你可能会到1450年,有时到1480年?如果您需要更多,那么当然您需要拆分为2个数据包,其中有几个明显的方法 .
问题是你正在谈论创建一个数据包并通过TCP写出来,但当然还有 Headers 数据等等,所以你有“ Baggage ”让你达到1500或更高......还有一个很多硬件都有下限 .
如果你“推它”,你可以得到一些非常奇怪的事情 . 显然,截断的数据或丢失的数据我很少见到 . 损坏的数据也很少但肯定会发生 .
在应用程序级别,应用程序使用TCP作为面向流的协议 . TCP依次具有段并且抽象出使用不可靠IP分组的细节 .
TCP处理段而不是数据包 . 每个TCP段具有包含在TCP头部内的序列号 . TCP段中发送的实际数据是可变的 .
某些操作系统支持getsockopt的值,可以使用称为TCP_MAXSEG,它检索最大TCP段大小(MSS) . 但是并非所有操作系统都支持它 .
我不确定你要做什么,但如果你想减少使用的缓冲区大小,你也可以考虑:SO_SNDBUF和SO_RCVBUF .
根据http://en.wikipedia.org/wiki/Maximum_segment_size,网络上IPV4数据包的默认最大大小为536个八位字节(大小为8位的字节) . 见RFC 879
TCP API中没有数据包 .
基本协议中经常有数据包,比如TCP通过IP完成,你不感兴趣,因为它们与用户无关,除了你可能不感兴趣的非常微妙的性能优化(根据问题的表述) .
如果你问一个API调用中的最大字节数是多少,那么这是依赖于实现和设置的 . 您通常会调用send()来获取高达几千字节的块,并且随时准备系统拒绝完全或部分接受它,在这种情况下,您必须手动管理拆分为较小的块以将数据提供给TCP send()API .
通常,这取决于连接使用的接口 . 您可以使用ioctl()获取MTU,如果是以太网,通常可以通过从中减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,该大小为14 .
仅当MTU在整个网络中至少那么大时才是这种情况 . TCP可能会使用路径MTU发现来降低有效MTU .
问题是,你为什么关心?
如果您使用的是Linux机器,则“ifconfig eth0 mtu 9000 up”是设置接口MTU的命令 . 但是,我不得不说,如果网络传输不那么稳定,大MTU有一些缺点,它可能会使用更多的内核空间内存 .
一种解决方案是将套接字选项TCP_MAXSEG(http://linux.die.net/man/7/tcp)设置为与底层网络"safe"的值(例如,设置为1400以便在以太网上安全),然后在发送系统调用中使用大缓冲区 . 这样可以减少昂贵的系统调用 . 内核将拆分数据以匹配MSS .
这样您就可以避免截断数据,并且您的应用程序不必担心小缓冲区 .
似乎互联网上的大多数网站使用1460字节对于MTU的值 . 有时它是1452,如果你在VPN上,它将为IPSec Headers 丢弃更多 .
默认窗口大小变化很大,最大为65535字节 . 我使用http://tcpcheck.com查看我自己的源IP值并检查其他Internet供应商正在使用的内容 .
IP协议(Ip4)中TCP设置的数据包大小 . 对于该字段(TL),分配16位,因此数据包的最大大小为65535字节:IP protocol details
10 回答
TCP数据包大小的绝对限制是64K(65535字节),但实际上这远远大于您将看到的任何数据包的大小,因为较低层(例如以太网)具有较低的数据包大小 .
例如,以太网的MTU(最大传输单元)为1500字节 . 某些类型的网络(如令牌环)具有更大的MTU,并且某些类型具有更小的MTU,但是每个物理技术的值是固定的 .
这是一个很好的问题,我实际上在工作中遇到了很多 . 有很多“技术上正确”的答案,如65k和1500.我已经做了很多编写网络接口的工作,使用65k是愚蠢的,1500也可以让你遇到大麻烦 . 我的工作涉及很多不同的硬件/平台/路由器,说实话,我开始的地方是1400字节 . 如果你需要超过1400你可以开始上升,你可能会到1450年,有时到1480年?如果您需要更多,那么当然您需要拆分为2个数据包,其中有几个明显的方法 .
问题是你正在谈论创建一个数据包并通过TCP写出来,但当然还有 Headers 数据等等,所以你有“ Baggage ”让你达到1500或更高......还有一个很多硬件都有下限 .
如果你“推它”,你可以得到一些非常奇怪的事情 . 显然,截断的数据或丢失的数据我很少见到 . 损坏的数据也很少但肯定会发生 .
在应用程序级别,应用程序使用TCP作为面向流的协议 . TCP依次具有段并且抽象出使用不可靠IP分组的细节 .
TCP处理段而不是数据包 . 每个TCP段具有包含在TCP头部内的序列号 . TCP段中发送的实际数据是可变的 .
某些操作系统支持getsockopt的值,可以使用称为TCP_MAXSEG,它检索最大TCP段大小(MSS) . 但是并非所有操作系统都支持它 .
我不确定你要做什么,但如果你想减少使用的缓冲区大小,你也可以考虑:SO_SNDBUF和SO_RCVBUF .
根据http://en.wikipedia.org/wiki/Maximum_segment_size,网络上IPV4数据包的默认最大大小为536个八位字节(大小为8位的字节) . 见RFC 879
TCP API中没有数据包 .
基本协议中经常有数据包,比如TCP通过IP完成,你不感兴趣,因为它们与用户无关,除了你可能不感兴趣的非常微妙的性能优化(根据问题的表述) .
如果你问一个API调用中的最大字节数是多少,那么这是依赖于实现和设置的 . 您通常会调用send()来获取高达几千字节的块,并且随时准备系统拒绝完全或部分接受它,在这种情况下,您必须手动管理拆分为较小的块以将数据提供给TCP send()API .
通常,这取决于连接使用的接口 . 您可以使用ioctl()获取MTU,如果是以太网,通常可以通过从中减去硬件头的大小来获得最大数据包大小,对于没有VLAN的以太网,该大小为14 .
仅当MTU在整个网络中至少那么大时才是这种情况 . TCP可能会使用路径MTU发现来降低有效MTU .
问题是,你为什么关心?
如果您使用的是Linux机器,则“ifconfig eth0 mtu 9000 up”是设置接口MTU的命令 . 但是,我不得不说,如果网络传输不那么稳定,大MTU有一些缺点,它可能会使用更多的内核空间内存 .
一种解决方案是将套接字选项TCP_MAXSEG(http://linux.die.net/man/7/tcp)设置为与底层网络"safe"的值(例如,设置为1400以便在以太网上安全),然后在发送系统调用中使用大缓冲区 . 这样可以减少昂贵的系统调用 . 内核将拆分数据以匹配MSS .
这样您就可以避免截断数据,并且您的应用程序不必担心小缓冲区 .
似乎互联网上的大多数网站使用1460字节对于MTU的值 . 有时它是1452,如果你在VPN上,它将为IPSec Headers 丢弃更多 .
默认窗口大小变化很大,最大为65535字节 . 我使用http://tcpcheck.com查看我自己的源IP值并检查其他Internet供应商正在使用的内容 .
IP协议(Ip4)中TCP设置的数据包大小 . 对于该字段(TL),分配16位,因此数据包的最大大小为65535字节:IP protocol details