TCP提供紧急模式,它是一端可以告诉另一端有“紧急数据”被放置在普通的数据流中,而对“紧急数据”的处理留给对方决定。
TCP的一端是这么通知对方紧急数据的信息的——发送端将TCP首部中的URG设置为1,并将紧急指针设置成一个正值,该值与首部中的序号的和指向紧急数据最后一个字节的下一个字节。(注意:RFC确定紧急指针应该指向紧急数据的最后一个字节,但大多数实现使用错误的做法——即指向最后一个字节的下一个字节。)
TCP是这么通知对方有紧急数据的——当A方把带有紧急数据的报文放入发送缓冲区时(在这个紧急报文放入缓冲区时,缓冲区中可能还有其它报文等待发送),TCP会设置即将发送的下一个报文(可能是带有紧急数据的报文,也可能是排在该报文前得待发送报文)的URG和紧急指针以通知B方自己进入紧急模式,B方接受到这个带有URG和紧急指针的报文后,就会认为A方处于紧急模式直到带有紧急数据的报文通过自己(即已经接受到紧急报文数据最后一个字节的下一个字节)。
而实际上,发送端的TCP可能因为流量控制而无法发送数据(比如说对方的接受缓冲区已满,而通告了一个大小为0的窗口),但此时紧急通知照样可以不带数据地发送给对方。也就是说,数据流动可能会因为流量控制等原因被停止,而紧急通知却总是能无障碍地发送给对方。
发送端TCP经常会发送多个含有URG和指向同一个数据的紧急指针的报文(分节)给对方,第一个到达的分节会告诉对方有紧急数据。
紧急数据放在普通的数据流中被发送给对方,要将紧急数据按普通数据处理还是按普通数据处理,留给对方决定。