URG和PSH

来源:互联网 发布:吃东西知乎 编辑:程序博客网 时间:2024/06/06 11:34

1. 是什么?

URG:紧急标志

PSH:推标志

2. 各自特点,如何使用?

URG:当URG=1时,表示分段中有紧急数据应当加速传送

PSH:推标志,该标置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理telnet或rlogin等交互模式的连接时,该标志总是置位的。

当PSH=1时,要求发送方马上发送该分段,而接收方尽快的将报文交给应用层,不做队列处理。

3. 对比两者区别

URG=1,表示紧急指针指向包内数据段的某个字节(数据从第一字节到指针所指字节就是紧急数据),不进入接收缓冲就直接交给上层进程,余下的数据都是要进入接收缓冲的;一般来说TCP是要等到整个缓存都填满了后再向上交付,但是如果PSH=1的话,就不用等到整个缓存都填满,直接交付,但是这里的交付仍然是从缓冲区中交付的,URG是不要经过缓冲区的,千万记住!

4.TCP使用的四种定时器有:

重传计时器、坚持计时器、保活计时器和时间等待计时器

(1)重传计时器:为了防止报文丢失或者损坏,TCP在发送一个报文以后启动重传定时器,如果定时器溢出之前该报文的ACK还未到达,则重传该报文。重传定时器超时时间(Retransmision Timeout)依赖于往返时间RTT,而RTT在传输的过程中是动态变化的,而且变化范围较大,精准的计算RTT较困难,TCP有时间戳选项,为准确的计算RTT提供了方便。

1)若在计时器截至时间之前收到了对此报文段的确认,则撤销此计时器
2)若在计时器截至时间之前没有收到了对此报文段的确认,则重传此报文段,并将计时器复位。(设一次数据传输的往返时间为RTT,则重传时间为2×RTT)

(2)坚持计时器:TCP报文段可能是不携带任何数据的ACK分节,接收端对此分节无确认必要。假设有如下场景,A是发送端,B为接收端,B的通告窗口win大小为100字节,这时A发送100字节到B,由于A的ACK告知B A.win=0,所以,A暂停发送数据等待A.win变大,稍后A的接受缓存中的数据被上层应用处理,于是A.win增大,接着A发送ACK窗口更新通知B,如果这个不携带任何数据的分节丢失,则A,B就会处于一种死锁状态(A等待B通知窗口更新,B等待A发送数据)。为了解决这一问题,TCP发送方使用一个坚持定时器来周期性的向接收方查询,以便发现窗口是否已经增大。这些从发送方发出的报文段称为窗口探查。
1)零窗口死锁
2)探测报文段

(3)保活计时器:这个定时器在选项中设置,默认是关闭的。如果开启这个选项,那么如果一个连接闲置了一定时间以后,服务端会发送探寻分节给客户端判断客户端是否有响应。这个时间在TCP的各种实现中不尽相同,但通常都在一小时以上。由于这个保活时间间隔太长,所以很多需要频繁检测对端是否存活的应用都是在应用层自行开发心跳机制。
1)防止在两个TCP之间的连接长时间空闲
2)保活计时器超时通常设为2小时
3)若超时发送10个探测报文段(每个相隔75秒)
4)若没有响应中止该连接  

(4)时间等待计时器:
MSL是报文段做大生存时间(Maximum Segment Lifetime),设置这个定时器有两个目的其一是为了测量连接处于TIME_WAIT状态的时间.这样可以让TCP再次发送最后的ACK以防止这个ACK丢失(如果丢失,另一端会重传FIN)。其二,为允许老的重复分节在网络中消逝。具体可以解释为,如果一个TCP连接在断开之前有迷途分节尚未消逝,在断开该TCP连接之后立刻重启一个同样的连接(双方的IP地址和端口port相同),这时之前的迷途的老分节可能对新的新的TCP连接接收,从而造成未定义的错误。为了避免这种情况,TCP规定在TIME_WAIT状态,不能启动一个连接的化身。既然TIME_WAIT状态维持2MSL,这就保证了一个连接上的分组及其应该在2MSL内都会消失。
1)连接终止期间使用
2)重复的FIN报文段到达目的站
3)计时器的值通常设置为一个报文段的寿命期待值的两倍


原创粉丝点击