TCP、UDP Socket 发送数据的大小限制,MTU、MSS

虽然我们说 IP 包最大为 65535Bytes ,但这绝不意味着一个网络层(也就是 IP 所在层)的数据包可以有 64KB 那么大。对于来自网络层的过大数据,链路层会对数据进行拆分并分入多个帧进行发送。而链路层允许的最大 IP 包为 1500 Bytes,那么对于每个在链路上单独传输的数据帧来说,其中含有的来自 IP 层的数据的最大大小就是 1480Bytes 。至于建立在 IP 协议之上的其他协议,每个具体多少还要看更上层协议的占用情况

  • 1500 Bytes 的值被称为 MTU,Max Transmission Unit
  • 链路层的传输单位被称为信息帧

另外,由于 Internet 是一个非常庞大且复杂的系统,我们的数据包要经过的路由器支持的 MTU 值很可能不到 1500Bytes。

查到一个说法讲到,576Bytes 应该是确定保险的最小值,这是拨号上网的 MTU 限制。

经测试,从西安电子科技大学校园网 ping 到百度( www.baidu.com )、芬兰( www.apache.org )、日本东京(我的博客,www.marscatxdu.com )的 MTU 都是可以达到 1500Bytes 的。但使用我的手机热点(华为 P40Pro,陕西联通,连接到 4G+ 以及 5G 网络)测出来的 MTU 只有 1400Bytes。由此可见,如果想要确保数据都通过一个帧进行发送以确保可靠性,最好还是不要冲着上限值去尝试。。

Stream Socket

该 Socket 使用 TCP 进行通信,因此它的数据传输是双向连接的,而且顺序发送的数据一定会以发送的顺序抵达。比如 telnet、HTTP 就都是用这种 Socket 实现的。

每个通过 TCP 发送的数据被称为 TCP Segment ,每个 Segment 的最大大小称为 MSS(Max Segment Size )。若要发送的数据大于 Segment 的大小, TCP 会将数据切分成多个 TCP Segment 然后交给网络层发送。实际上在链路层单独送走的 IP 数据包中,数据段的大小也是要受到 MTU 限制的。

(TCP 数据包头长 20Bytes)

Datagram Socket

使用 UDP 进行通信,该 Socket 通信是【无连接】的,从这里发送的数据不保证到达,且到达顺序可能和发送顺序不同。但可以保证,被成功成功收到的数据不会出现错误(检错和纠错由链路层完成,因此保证收到的一定没问题)。

UDP 包的最大长度为 65515 Bytes (IP 包最大大小 65535,去掉 20 的报头就是 65515),然而虽然到了网络层的一个包可以这么大,但链路层还是会再重新进行拆分的。这些被拆分的数据在网络上被单独发送,一旦有一个丢失就会导致接收方重新拼接失败,这也意味着整个大的数据包都传输失败。因此,越大的数据包,传输失败的概率越大。
(整个传输的过程中有太多地方可以造成丢包了,就连到了目的主机的网口都仍有可能丢,比如可能达到了 IO 当前能承受的上限,系统就会开始丢包)

实际被封在单个帧中、作为一整个单位被传输的 UDP 数据大小为:1500-20-8=1472 Bytes(20 是 IP 报头长,8 是 UDP 报头长)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值