一、URG&PSH的区别
TCP的报头信息有六个控制位,说明本段文的性质;分别为紧急URG、确认ACK、推送ACK、复位RST、同步SYN、终止FIN;
今天我们来主要来介绍介绍PSH和URG的区分;
1.URG是什么?
URG表示紧急指针,与紧急指针字段搭配使用,当URG = 1时,表示紧急指针字段有效。它告诉系统此报文有紧急数据,应尽快传送(相当于高优先级数据),而不按照原来的排序顺序来传送;
当URG=1,发送应用进程就告诉发送方的TCP有紧急的数据要传送,于是TCP就将紧急的数据报文段插入到本报文数据的最前面,而在紧急数据的后面的数据是普通报文的数据,此时紧急指针字段就相当于一个字节偏移量,指出紧急数据到哪里结束。
总结URG:
- URG=1,紧急数据(数据从序号开始到紧急指针指向字节)不经过缓存区直接交给上层程序,而报文段后面的普通数据还需要进入接收方缓冲区;
2.什么是PSH?
当两个进程之间实现通信时,有时在一端的应用进程希望在键入一个命令后能够立即就能收到对方的回应,在这种情况下,TCP就可以使用推送PSH操作;
当发送方TCP中PSH = 1,立即会发送一个报文出去,接收方TCP收到PSH=1的报文段,就尽快地交付接收的应用进程,而不再等待缓冲区都填满后再向上交付;
总结PSH:
- PSH=1,希望将本报文段及发送放缓存区的数据一快交付给应用进程;
3.URG和PSH的区别
- 紧急URG将紧急报文字段插入到普通报文字段的前面,而推送PSH是利用紧急数据重新直接创建一个报文,并立即发送出去;
- URG=1,表示紧急数据(数据从序号开始到紧急指针指向字节)不经过缓冲区直接交付应用进程,PSH=1表示尽快推送,将数据先交给缓冲区,不等待缓冲区填满(默认TCP/IP是将数据缓存到一定上限,才交由上层)就交给上层程序;
- URG=1交给上层进程的只有紧急数据,PSH=1交给上层程序的是紧急数据和之前接收方缓冲区排好序的数据;
二、TCP协议的定时器
1.TCP协议下的定时器总共有4种:
- 重传定时器用于当希望收到另一端的确认;
- 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口;
- 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启
2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
2.分别介绍这四种定时器
1>、TCP的坚持定时器
ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含数据的ACK报文段。为了防止因为ACK报文段丢失而双方进行等待的问题,发送方用一个坚持定时器来周期性地向接收方查询。这些从发送方发出地报文段称为窗口探查。
解决问题:例如A向B发送报文,此时报文到达缓存后,B方的缓冲区已满,则B的发送窗口rwnd为0,通知A不要再发送数据了,此时A暂停一直在等待B方重新发送一个新的窗口,直到应用进程从缓冲区取走数据,B才会发送一个新的窗口值;若经过一段时间,B的缓存区又有了存储空间,B向A发送报文,因为传输的不可靠,该报文丢失,此时两者出现相互等待的状态(A等B发送新窗口通知,B等A发送数据),这种自锁的局面将一直延续下去;
解决办法:坚持定时器;只要TCP的一方收到对方的零窗口通知,就启动该计数器,若计数器设置的时间到期,就发送一个零窗口探测报文段(携带1字节数据),而对方就在确认这个报文段时给出窗口值,(设置为0窗口也必须接收零探测报文段、确认报文段和携带紧急数据的文段)。若窗口任然为0,重新设置定时器,如果不为0,打破死锁僵局;
2>、TCP的保活定时器
如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一。
(1) 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的。服务器在2小时内将保活定时器复位。
(2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能收到对探查的响应,并在75秒后超时。总共发送10个探查,间隔75秒。
(3) 客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个复位,使得服务器终止这个连接。
(4) 客户主机正常运行,但是从服务器不可达。
3>.重传定时器
为了防止报文丢失或者损坏,TCP在发送一个报文以后启动重传定时器,如果定时器溢出之前该报文的ACK还未到达,则重传该报文。重传定时器超时时间(Retransmision Timeout)依赖于往返时间RTT,而RTT在传输的过程中是动态变化的,而且变化范围较大,精准的计算RTT较困难,TCP有时间戳选项,为准确的计算RTT提供了方便。
4>.2MSL定时器
也叫时间等待计时器,设置时间为2MSL(最长报文段寿命)后,主动断开的一方才进入CLOSED状态;
为什么要设置定时器等待2MSL时间?(假设A为主动 断开连接的一方,B为被动断开连接的一方)
第一、四次挥手断开连接时,为了保证A发送给B的最后一个ACK报文能够到达B,该报文可能丢失。若丢失,在CLOSE_WAIT状态的B会重传FIN+ACK报文,而A在2MSL的时间会收到B重传的报文,接着A重新发出确认,重新启动2MSL定时器,最后A和B都进入到CLOSED状态,如果A不设置计数器等待,则A在发送完ACK后立即释放连接,若ACK丢失,则A就发送收到重传,B无法进入CLOSED状态。
第二、防止已失效的连接请求报文(在网络上因时延耽搁的链接请求)出现在本连接中。A在发送完确认报文ACK后,经过2MSL的时间,就可以使本链接持续的时间内产生的所报文段都从网络上消失,下一个新连接中不会出现旧的连接请求报文段。