概述

对于 TCP 我们都非常熟悉了,三次握手,可靠传输这些名词都是了然于胸的,但是,有一些其他的事情也很有趣,例如你知道一个 TCP send 的大小限制是多少吗?

分析

我们不妨回顾一下 TCP 的发送过程,首先是应用层调用一个 send 将数据从用户态放到内核态,这中间过程比较复杂,但是可以不表,然后再由内核态交给硬件 - 网卡,然后再发送出去。我们其实也很清楚,这中间每一层都有分段的概念,例如 TCP 会分段,IP 会分片。

那么假设我用一根网线直接将两台 PC 直连,那一个大的 TCP 包也会分段吗?如果不一定,那么最大可以发送的 TCP 包是多大?

从链路层开始推断起吧,MTU 一般都不会超过,常见的数值应该是 1500,所以 IP 层以及之上再大到这里也是会被分开;假设忽略这个,再来就是 IP 层了,IP 层的最大大小是 65535,去掉 20 byte 的头部,那就是 65515 bytes 了,这里可以不分片,再来就是 TCP 了,最短 20,然后就剩下 65515-20,那就是 65495 bytes 了,这就是可承载的最大报文数据段了。

结论

Ref