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


当前回答

在应用程序级别,应用程序使用TCP作为面向流的协议。TCP则具有段,并抽象了处理不可靠IP数据包的细节。

TCP处理的是段而不是包。每个TCP段都有一个序列号,序列号包含在TCP报头中。 TCP段中实际发送的数据是可变的。

getsockopt有一个在某些操作系统上支持的值,称为TCP_MAXSEG,用于检索最大TCP段大小(MSS)。但并非所有操作系统都支持它。

我不确定你到底想做什么,但如果你想减少缓冲区的大小,你也可以看看:SO_SNDBUF和SO_RCVBUF。

其他回答

似乎互联网上的大多数网站都使用1460字节作为MTU值。有时它是1452,如果你是在VPN上,它会为IPSec头降低更多。

默认窗口大小变化很大,最大可达65535字节。我使用http://tcpcheck.com查看我自己的源IP值,并检查其他互联网供应商正在使用什么。

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

这样可以避免截断数据,应用程序也不必担心缓冲区太小。

IP协议(Ip4)中TCP设置的包大小。对于这个字段(TL),分配了16位,因此数据包的最大大小为65535字节:IP协议细节

在应用程序级别,应用程序使用TCP作为面向流的协议。TCP则具有段,并抽象了处理不可靠IP数据包的细节。

TCP处理的是段而不是包。每个TCP段都有一个序列号,序列号包含在TCP报头中。 TCP段中实际发送的数据是可变的。

getsockopt有一个在某些操作系统上支持的值,称为TCP_MAXSEG,用于检索最大TCP段大小(MSS)。但并非所有操作系统都支持它。

我不确定你到底想做什么,但如果你想减少缓冲区的大小,你也可以看看:SO_SNDBUF和SO_RCVBUF。

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