概述
对于 TCP 我们都非常熟悉了,三次握手,可靠传输这些名词都是了然于胸的,但是,有一些其他的事情也很有趣,例如你知道一个 TCP send 的大小限制是多少吗?
分析
我们不妨回顾一下 TCP 的发送过程,首先是应用层调用一个 send
将数据从用户态放到内核态,这中间过程比较复杂,但是可以不表,然后再由内核态交给硬件 - 网卡,然后再发送出去。我们其实也很清楚,这中间每一层都有分段的概念,例如 TCP 会分段,IP 会分片。
- TCP 会分段是因为拥塞控制和流量控制
- IP 会分片是因为网络的 MTU(Maximum Transmission Unit)
那么假设我用一根网线直接将两台 PC 直连,那一个大的 TCP 包也会分段吗?如果不一定,那么最大可以发送的 TCP 包是多大?
从链路层开始推断起吧,MTU 一般都不会超过,常见的数值应该是 1500,所以 IP 层以及之上再大到这里也是会被分开;假设忽略这个,再来就是 IP 层了,IP 层的最大大小是 65535,去掉 20 byte 的头部,那就是 65515 bytes 了,这里可以不分片,再来就是 TCP 了,最短 20,然后就剩下 65515-20,那就是 65495 bytes 了,这就是可承载的最大报文数据段了。
结论
- 理论上最大的 TCP 有效最大数据长度是:65495(瓶颈:IP 分片长度)
- 实际上最大的 TCP 有效最大数据长度是:1460(1500-20-20,瓶颈:MTU)