专栏首页cwl_Java速读原著-TCP/IP(最大报文段长度)

速读原著-TCP/IP(最大报文段长度)

第18章 TCP连接的建立与终止

18.4 最大报文段长度

最大报文段长度(M S S)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的 M S S。我们已经见过 M S S都是1 0 2 4。这导致I P数据报通常是4 0字节长:2 0字节的T C P首部和2 0字节的I P首部。

在有些书中,将它看作可“协商”选项。它并不是任何条件下都可协商。当建立一个连接时,每一方都有用于通告它期望接收的 M S S选项(M S S选项只能出现在S Y N报文段中)。如果一方不接收来自另一方的 M S S值,则M S S就定为默认值5 3 6字节(这个默认值允许 2 0字节的I P首部和2 0字节的T C P首部以适合5 7 6字节I P数据报)。

一般说来,如果没有分段发生, M S S还是越大越好(这也并不总是正确,参见图 2 4 - 3和 图2 4 - 4中的例子)。报文段越大允许每个报文段传送的数据就越多,相对 I P和T C P首部有更高的网络利用率。当 T C P发送一个S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将 M S S值设置为外出接口上的 M T U长度减去固定的I P首部和T C P首部长度。对于一个以太网, M S S值可达1 4 6 0字节。使用IEEE 802.3的封装(参见2 . 2节),它的M S S可达1 4 5 2字节。

在本章见到的涉及 B S D / 3 8 6和S V R 4的M S S为1 0 2 4,这是因为许多 B S D的实现版本需要M S S为5 1 2的倍数。其他的系统,如SunOS 4.1.3、Solaris 2.2 和AIX 3.2.2,当双方都在一个本地以太网上时都规定 M S S为1 4 6 0。[Mogul 1993] 的比较显示了在以太网上 1 4 6 0的M S S在性能上比1 0 2 4的M S S更好。

如果目的I P地址为“非本地的 ( n o n l o c a l )”,M S S通常的默认值为 5 3 6。而区分地址是本地还是非本地是简单的,如果目的 I P地址的网络号与子网号都和我们的相同,则是本地的;如果目的I P地址的网络号与我们的完全不同,则是非本地的;如果目的 I P地址的网络号与我们的相同而子网号与我们的不同,则可能是本地的,也可能是非本地的。大多数 T C P实现版都提供了一个配置选项(附录E和图E - 1),让系统管理员说明不同的子网是属于本地还是非本地。这个选项的设置将确定 M S S可以选择尽可能的大(达到外出接口的 M T U长度)或是默认值5 3 6。

M S S让主机限制另一端发送数据报的长度。加上主机也能控制它发送数据报的长度,这将使以较小M T U连接到一个网络上的主机避免分段。

考虑我们的主机s l i p,通过M T U为2 9 6的S L I P链路连接到路由器b s d i上。图1 8 - 8显示这些系统和主机s u n。

从s u n向s l i p发起一个T C P连接,并使用t c p d u m p来观察报文段。图 1 8 - 9显示这个连接的建立(省略了通告窗口大小)。

在这个例子中,s u n发送的报文段不能超过 2 5 6字节的数据,因为它收到的 M S S选项值为2 5 6(第2行)。此外,由于 s l i p知道它外出接口的 M T U长度为2 9 6,即使s u n已经通告它的M S S为1 4 6 0,但为避免将数据分段,它不会发送超过 2 5 6字节数据的报文段。系统允许发送的数据长度小于另一端的M S S值。

只有当一端的主机以小于5 7 6字节的M T U直接连接到一个网络中,避免这种分段才会有效。如果两端的主机都连接到以太网上,都采用 5 3 6的M S S,但中间网络采用 2 9 6的M T U,也将会出现分段。使用路径上的M T U发现机制(参见2 4 . 2节)是关于这个问题的唯一方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 速读原著-TCP/IP(连接的建立与终止)

    T C P是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。本章将详细讨论一个 T C P连接是如何建立的以及通信结束后是如...

    cwl_java
  • 速读原著-TCP/IP(TCP的服务)

    尽管T C P和U D P都使用相同的网络层(I P),T C P却向应用层提供与U D P完全不同的服务。T C P提供一种面向连接的、可靠的字节流服务。

    cwl_java
  • 经典面试题-数据连接池的工作机制是什么

    J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没...

    cwl_java
  • TCP-IP详解卷1:协议 学习笔记(5) RARP ICMP

    RARP分组的格式与ARP分组基本一致,它们之间的主要差别是RARP请求或应答的帧类型为0x8035,RARP请求的操作码为3,应答操作码为4。

  • Access数据库相关知识

    比如,公园到访者的数据表,可能包含的实体有:公园信息(主键是公园编号),到访者的信息(主键是到访者编号),到访者居住地的信息(主键是居住地编号)一共有2个实体,...

    Sidchen
  • 5件你可能不知道可以使用 CSS-in-JS 来做的事情

    除了传统的 CSS,你还可以使用 内联样式 和 CSS-in-JS 作为 React 应用程序的样式选项。

    一墨编程学习
  • 信用风险建模 in Python 系列 4 - 混合模型概述

    本文是「信用风险建模 in Python」系列的第四篇,其实在之前的 Cufflinks 那篇已经埋下了信用风险的伏笔,

    用户5753894
  • 百度APP移动端网络深度优化实践分享(二):网络连接优化篇

    在《百度APP移动端网络深度优化实践分享(一):DNS优化篇》里大家了解到网络优化一般会首选优化DNS,而接下来的HTTP协议成为优化的重点,一般优化者会选择协...

    JackJiang
  • Jedis连接池1. 什么是连接池2. Jedis的连接池3. 源码解析4. 总结

    JavaEdge
  • Netty新连接接入(一)-新连接检测1 新连接检测

    JavaEdge

扫码关注云+社区

领取腾讯云代金券