码迷,mamicode.com
首页 > 其他好文 > 详细

如何判定TCP报文超时

时间:2020-07-26 01:38:31      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:计时   多个   com   str   服务器   握手   target   nbsp   超时   

上一篇文章已经简单介绍了TCP连接三次握手、四次挥手的原理。

有网友对如何判定TCP报文超时有点疑惑,这里作者按照自己的理解简单阐述一下,如有错误与不足之处,欢迎大家指正和交流。

 

技术图片

2*MSL(最长报文段寿命)与报文没有关系,每次客户端或者服务器发出报文之后都会开始计时 2*MSL (除第二次挥手外)。

在2*MSL时间内,对于报文发送方而言, 无论是报文发送失败(如①)还是接收失败(如②),报文发送方本身是不知道的。在规定的时间内没有接收到该接收的报文(如①②)或者接收到了不该接收的报文(如③)都会判定上一次报文超时,然后重传。

这里还要注意一个问题:在③阶段客户端如何判定发来的FIN是不是正确的,是不是之前延时才到的呢?是接收还是丢弃呢?如果丢弃,时间已经到了2*MSL,就要关闭连接进入CLOSE状态。如果接收就要重传ACK报文。

这就涉及到了TCP时间戳选项Timestamp

时间戳选项发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT(注意是“每一个收到的ACK”而不是“每一个收到的报文段”,是因为TCP通常用一个ACK来确认多个报文段)。

TimeStamp选项主要有两个用途:
1. 测量TCP连接两端通讯的延迟(Round Trip Time Measurement)。
    有了RTTM机制。TCP的两端能够非常容易的推断出线路上报文的延迟情况。从而制定出一个优化的发包间隔和报文TimeOut时间。

2.TCP收端收到一个数据报文后,会先比较本次收到报文的TimeStamp和上次收到报文的TimeStamp。假设本次的比较新,那么能够直接推断本次收到的报文是新的报文,不须要进行复杂的Sequence Number Window Scale计算。

这样子③阶段客户端就知道此次发来的报文相对于上一次接收到的报文是新的还是旧的,如果是新的,那么就会接收该报文,重传ACK,否则就丢弃该报文,关闭连接。

如何判定TCP报文超时

标签:计时   多个   com   str   服务器   握手   target   nbsp   超时   

原文地址:https://www.cnblogs.com/mzyzy/p/13377785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!