MSL 是 Maximum Segment Lifetime 英文的缩写,中文能够译为“报文最大生存工夫”,他是任何报文在网络上存在的最长工夫,超过这个工夫报文将被抛弃。
MSS:最大报文段长度
TCP 连贯的握手时延
- tcp 建设须要工夫
- 通常 HTTP 事务都不会替换太多数据,此时,SYN/SYN+ACK 握手(参见上图 -8a 和上图 -8b)会产生一个可测量的时延。TCP 连贯的 ACK 分组(参见上图 -8c)通常都足够大,能够承载整个 HTTP 申请报文,而且很多 HTTP 服务器响应报文都能够放入一个 IP 分组中去(比方,响应是蕴含了装饰性图片的小型 HTML 文件,或者是对浏览器高速缓存申请产生的 304 Not Modified 响应)。
- 最初的后果是,小的 HTTP 事务可能会在 TCP 建设上破费 50%,或更多的工夫
提早确认
因为因特网本身无奈确保牢靠的分组传输(因特网路由器超负荷的话,能够随便抛弃分组),所以 TCP 实现了本人的确认机制来确保数据的胜利传输。每个 TCP 段都有一个序列号和数据完整性校验和。每个段的接收者收到完整的段时,都会向发送者回送小的确认分组。
如果发送者没有在指定的窗口工夫内收到确认信息,发送者就认为分组已被毁坏或损毁,并重发数据。因为确认报文很小,所以 TCP 容许在发往雷同方向的输入数据分组中对其进行“捎带”。TCP 将返回的确认信息与输入的数据分组联合在一起,能够更无效地利用网络。为了减少确认报文找到同向传输数据分组的可能性,很多 TCP 栈都实现了一种“提早确认”算法。提早确认算法会在一个特定的窗口工夫(通常是 100~200 毫秒)内将输入确认寄存在缓冲区中,以寻找可能捎带它的输入数据分组。如果在那个时间段内没有输入数据分组,就将确认信息放在独自的分组中传送。
TCP 慢启动
TCP 数据传输的性能还取决于 TCP 连贯的使用期(age)。TCP 连贯会随着工夫进行自我“调谐”,起初会限度连贯的最大速度,如果数据胜利传输,会随着工夫的推移进步传输的速度。这种调谐被称为 TCP 慢启动(slow start),用于避免因特网的忽然过载和拥塞。
TCP 慢启动限度了一个 TCP 端点在任意时刻能够传输的分组数。简略来说,每胜利接管一个分组,发送端就有了发送另外两个分组的权限。如果某个 HTTP 事务有大量数据要发送,是不能一次将所有分组都发送进来的。必须发送一个分组,期待确认;而后能够发送两个分组,每个分组都必须被确认,这样就能够发送四个分组了,以此类推。这种形式被称为“关上拥塞窗口”。
Nagle 算法
Nagle 算法激励发送全尺寸(mss)(LAN 上最大尺寸的分组大概是 1500 字节,在因特网上是几百字节)的段。
if there is new data to send #有数据要发送
# 发送窗口缓冲区和队列数据 >=mss,队列数据(available data)为原有的队列数据加上新到来的数据
# 也就是说缓冲区数据超过 mss 大小,nagle 算法尽可能发送足够大的数据包
if the window size >= MSS and available data is >= MSS
send complete MSS segment now # 立刻发送
else
if there is unconfirmed data still in the pipe # 前一次发送的包没有收到 ack
# 将该包数据放入队列中,直到收到一个 ack 再发送缓冲区数据
enqueue data in the buffer until an acknowledge is received
else
send data immediately # 立刻发送
end if
end if
end if
Nagle 算法的规定
(1)如果包长度达到 MSS,则容许发送;
(2)如果该蕴含有 FIN(敞开连贯标识),则容许发送;
(3)设置了 TCP_NODELAY 选项,则容许发送;默认状况下,发送数据采纳 Nagle 算法。这样尽管进步了网络吞吐量,然而实时性却升高了,在一些交互性很强的应用程序来说是不容许的,应用 TCP_NODELAY 选项能够禁止 Nagle 算法。
(4)之前产生的包都曾经确认了,则容许发送;
(5)上述条件都未满足,但产生了超时(个别为 200ms),则立刻发送。
TIME_WAIT 累积与端口耗尽
当某个 TCP 端点敞开 TCP 连贯时,会在内存中保护一个小的管制块,用来记录最近所敞开连贯的 IP 地址和端口号。这类信息只会维持一小段时间,通常是所预计的最大分段使用期的两倍(称为 2MSL,通常为 2 分钟左右,以确保在这段时间内不会创立具备雷同地址和端口号的新连贯。实际上,这个算法能够避免在两分钟内创立、敞开并从新创立两个具备雷同 IP 地址和端口号的连贯。
但因为可用源端口的数量无限(比方,60000 个),而且在 2MSL 秒(比方,120 秒)内连贯是无奈重用的,连贯率就被限度在了 60000/120=500 次 / 秒