Tcp的四种定时器和三次握手四次挥手协议

tcp的四种定时器&&三次握手四次挥手协议

TCP使用四种定时器(Timer,也称为“计时器”):

重传计时器(Retransmission Timer) 
坚持计时器(Persistent Timer) 
保活计时器(Keeplive Timer) 
时间等待计时器(Time_Wait Timer) 
(1)重传计时器: 重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报文段的重传计时器,可能发生两种情况:若在计时器超时之前收到对报文段的确认,则撤销计时器;若在收到对特定报文段的确认之前计时器超时,则重传该报文,并把计时器复位; 重传时间=2RTT;* RTT的值应该动态计算。常用的公式是:RTT=previous RTTi + (1-i)current RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上当前RTT值的10%。

Karn算法:对重传报文,在计算新的RTT时,不考虑重传报文的RTT。因为无法推理出:发送端所收到的确认是对上一次报文段的确认还是对重传报文段的确认。干脆不计入。

(2)坚持计时器: 专门为对付零窗口通知而设立的。

当发送端收到零窗口的确认时,就启动坚持计时器,当坚持计时器截止期到时,发送端TCP就发送一个特殊的报文段,叫探测报文段,这个报文段只有一个字节的数据。探测报文段有序号,但序号永远不需要确认,甚至在计算对其他部分数据的确认时这个序号也被忽略。探测报文段提醒接收端TCP,确认已丢失,必须重传。

坚持计时器的截止期设置为重传时间的值,但若没有收到从接收端来的响应,则发送另一个探测报文段,并将坚持计时器的值加倍和并复位,发送端继续发送探测报文段,将坚持计时器的值加倍和复位,知道这个值增大到阈值为止(通常为60秒)。之后,发送端每隔60s就发送一个报文段,直到窗口重新打开为止;

(3)保活计时器:

每当服务器收到客户的信息,就将keeplive timer复位,超时通常设置2小时,若服务器超过2小时还没有收到来自客户的信息,就发送探测报文段,若发送了10个探测报文段(没75秒发送一个)还没收到响应,则终止连接。

(4)时间等待计时器:

在连接终止期使用,当TCP关闭连接时,并不认为这个连接就真正关闭了,在时间等待期间,连接还处于一种中间过度状态。这样就可以时重复的fin报文段在到达终点后被丢弃,这个计时器的值通常设置为一格报文段寿命期望值的两倍。

TIME_WAIT是主动关闭连接的一端最后进入的状态,而不是直接变成CLOSED的状态,为什么呢? 第一个原因是万一最后一个ACK丢失了,对端会重传的,这个在超时之前的重新收到对端的FIN也可以回ACK,而不是RST。 另外一个原因是防止老连接的包在新连接里面出现,影响了新连接。有这个2MSL的时间,可以在2个MSL时间之内不会建立同样四元组(源IP, 源端口,目的IP,目的端口)的连接,也就不会出现老的包影响新连接的事情。

tcp的握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

Alt text

建立连接的过程:

  1. 客户端发出段1,SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地 址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正 确顺 序,也可以发现丢包的情况,另外,规定SYN位和FIN位也要占一个序号,这次虽然没 发数 据,但是由于发了SYN位,因此下次再发送应该用序号1001。mss表示最大段尺寸, 如果一 个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP 层分片,为了避 免这种情 况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长 度。 
 
    BIT科技 仅限于学习交流 19
  2. 服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表⽰示“我接收 到 序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端 的连接 请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024。 

  3. 客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。 
 
    在这个过程中,客户端和服务器分别给对方发了连接请求,也应答了对方的连接请求,其中服务 器 的请求和应答在一个段中发出,因此一共有三个段用于建立连接,称为”’三方握⼿手(three-way- handshake)”’。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段 尺寸等。

在上述过程中,还有一些重要的概念:

未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 Backlog参数:表示未连接队列的最大容纳数目。

SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

tcp的四次挥手协议 1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

Alt text

关闭连接的过程:



  1. 客户端发出段7,FIN位表⽰示关闭连接的请求。

  2. 服务器发出段8,应答客户端的关闭连接请求。

  3. 服务器发出段9,其中也包含FIN位,向客户端发送关闭连接请求。
  4. 客户端发出段10,应答服务器的关闭连接请求。

建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常 不合 并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送 数据给服 务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

通俗理解就是你在和我打电话,告诉我一些事情,我需要用笔记录下来。你说完了告诉我你要挂电话了,我说等一下,我还没记完,你就在等着了。我记完之后给你说我记录完了,然后我们愉快的挂掉了电话。请求连接是一个人的事(好比你给我打电话),但终止连接就是两个人的事了(好比挂电话)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值