TCP定时器讲解与TCP三次握手四次挥手
来源:互联网 发布:勒夏特列原理 知乎 编辑:程序博客网 时间:2024/06/05 15:50
从名字上讲,他是一个定时器,并且是一个应用在TCP协议中的定时器,关于TCP协议,可以自行了解,这里就不多说了。
TCP定时器
TCP一共有几种定时器呢?答案是四种,分别是:
**重传计时器:**Retransmission Timer
**坚持计时器:**Persistent Timer
**保活计时器:**Keeplive Timer
**时间等待计时器:**Time_Wait Timer。
接下来我们就进行一一讲解。
重传计时器:
重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报文段的重传计时器,可能发生两种情况:若在计时器超时之前收到对报文段的确认,则撤销计时器;若在收到对特定报文段的确认之前计时器超时,则重传该报文,并把计时器复位;
重传时间=2*RTT;
RTT的值应该动态计算。常用的公式是:RTT=previous RTT*i + (1-i)*current RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上当前RTT值的10%.
Karn算法:对重传报文,在计算新的RTT时,不考虑重传报文的RTT。因为无法推理出:发送端所收到的确认是对上一次报文段的确认还是对重传报文段的确认。干脆不计入。
坚持计时器:
专门为对付零窗口通知而设立的。
当发送端收到零窗口的确认时,就启动坚持计时器,当坚持计时器截止期到时,发送端TCP就发送一个特殊的报文段,叫探测报文段,这个报文段只有一个字节的数据。探测报文段有序号,但序号永远不需要确认,甚至在计算对其他部分数据的确认时这个序号也被忽略。探测报文段提醒接收端TCP,确认已丢失,必须重传。
坚持计时器的截止期设置为重传时间的值,但若没有收到从接收端来的响应,则发送另一个探测报文段,并将坚持计时器的值加倍和并复位,发送端继续发送探测报文段,将坚持计时器的值加倍和复位,知道这个值增大到阈值为止(通常为60秒)。之后,发送端每隔60s就发送一个报文段,直到窗口重新打开为止;
保活计时器:
每当服务器收到客户的信息,就将keeplive timer复位,超时通常设置2小时,若服务器超过2小时还没有收到来自客户的信息,就发送探测报文段,若发送了10个探测报文段(没75秒发送一个)还没收到响应,则终止连接。
时间等待计时器:
在连接终止期使用,当TCP关闭连接时,并不认为这个连接就真正关闭了,在时间等待期间,连接还处于一种中间过度状态。这样就可以时重复的fin报文段在到达终点后被丢弃,这个计时器的值通常设置为一格报文段寿命期望值的两倍。
TCP三次握手四次挥手—-TCP的建立与断开
讲到这里,又不得不提一下,TCP报文的格式
如图所示,
有几个比较重要的位置:
- (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
- (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- (A)URG:紧急指针(urgent pointer)有效。
- (B)ACK:确认序号有效。
- (C)PSH:接收方应该尽快将这个报文交给应用层。
- (D)RST:重置连接。
- (E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
需要注意的是: (A)不要将确认序号Ack与标志位中的ACK搞混了。 (B)确认方Ack=发起方Req+1,两端配对。
三次握手——建立连接
所谓三次握手(Three-Way Handshake)即建立TCP连接。指建立一个TCP连接时,需要客户端和服务端总共发送3个有效包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
客户端发来请求连接(SYN=1 seq=J),服务端收到客户端的请求,并作出相应,返还(SYN=1,ACK=1,ack=J+1,seq=K),客户端收到服务器的许可报文,告诉服务器(ACK=1,ack=K+1),接下来我要发送东西了,至此TCP协议链接建立完成。
四次挥手——释放链接
由于TCP是全双工协议,所以在断开链接时是两方的事情,就好比那么女朋友提出分手一样,客户端说,我没有爱情了(数据),我们分手吧,服务器说不,我不想(那刚好,老娘不想伺候你了),然后装作冷静地说那好我们分手(不给你数据了),我们分手,客户端听到后说,好啊好啊,我们分手吧(再次强调,我们断开连接关系)
全双工,就意味着任何事情,不是由你一方决定的,是你我两方的事情。
【如果你还有疑惑,可以参考一下文章:】
http://www.cnblogs.com/Jessy/p/3535612.html
http://blog.csdn.net/renzhenhuai/article/details/12105457
- TCP定时器讲解与TCP三次握手四次挥手
- Tcp三次握手与四次挥手
- Tcp三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP三次握手与四次挥手!
- TCP三次握手与四次挥手
- TCP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP/IP三次握手与四次挥手
- TCP的三次握手与四次挥手
- 自己写的第一个练习网页【2017.7.12】
- spring注解识别一个接口的多个实现类方法
- 方向梯度直方图(HOG)
- Linux
- 病毒、木马、蠕虫与恶意代码关键点
- TCP定时器讲解与TCP三次握手四次挥手
- 《java并发编程实战》笔记(第10章)
- KMP--找子串
- EffectiveC++学习笔记-条款32|33
- 结构算法 002 单链表的头插法和尾插法
- webView之post请求携带请求头及打印日志等剖析
- 前端经典面试题1
- python 字典
- 我的C程序设计语言学习日记#03