您的位置:首页 > 理论基础 > 计算机网络

TCP协议 标记位&定时器&三次握手四次挥手

2017-07-03 10:29 204 查看
TCP段格式:



1、标记位

URG(紧急位)

紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据,不进入接收缓冲就直接交给上层进程,余下的数据要进入接收缓冲的)

PSH(急迫位)

在一个交互程序中,当客户发送一个命令给服务器时,它设置PUSH标志并停下来等待服务器的响应。通过允许客户应用程序通知其TCP设置PUSH标志,客户进程通知TCP在向服务器发送一个报文段时不要因等待额外数据而使已提交数据在缓存中滞留。类似地,当服务器的TCP接收到一个设置了PUSH标志的报文段时,它需要立即将这些数据(包括以前存中滞留的数据)递交给服务器进程而不能等待判断是否还会有额外的数据到达。PSH=1,只对接收方的接收缓冲区起作用,发送方通过使用PUSH位来通知接收方将所有收到的数据立即提交给服务器进程,而不需要等待额外数据(将缓存填满)而让数据在缓存中停留!这里所说的数据包括与此PUSH包一起传输的数据以及之前就为该进程传输过来的数据(滞留在缓存中的数据)。

URG和PSH的区别:

URG:紧急标志位,表示的是此报文段中有紧急数据,将紧急数据排在普通数据的前面;当接受端收到此报文后后必须先处理紧急数据,而后再处理普通数据。

PSH: 催促标志位,当发送端将PSH置为1时,TCP会立即创建一个报文并发送。接受端收到PSH为1的报文后就立即将接受缓冲区内数据向上交付给应用程序,而不是等待缓冲区满后再交付。

2、定时器

重传计时器:Retransmission Timer
坚持计时器:Persistent Timer
保活计时器:Keeplive Timer
时间等待计时器:Time_Wait Timer。


(1)重传计时器

为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间。当TCP发送报文段时,就创建这个特定报文段的重传计时器,可能发生了两种情况:若在计时器超时之前收到对报文段的确认,则撤销计时器;若在收到对特定报文段的确认之前计时器超时,则重传该报文,并把计时器复位;

重传时间=2*RTT;

RTT的值应该动态计算。常用的公式是:RTT=previous RTT*i + (1-i)*current RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上当前RTT值的10%.

(2)坚持计时器

专门为对付零窗口通知而设立的;

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

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

(3)保活计时器

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

(4)时间等待计时器

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

3、三次握手与四次挥手

建立连接的过程:



(1)Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

(2)Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

关闭连接的过程:



(1)客户端发送FIN表示关闭连接请求,Client进入FIN_WAIT_1状态。

(2)服务器收到FIN后发出ACK,应答客户端的关闭连接请求。Server进入CLOSE_WAIT状态。

(3)服务器发送FIN,向客户端发送关闭连接请求。Server进入LAST_ACK状态。

(4)Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息