在连接建立之后,双向的数据传送(data transfer)就可以开始。客户和服务器可以在两个方向上传送数据和确认。

下面是个例子:
file
在这个例子中,当连接建立后,客户通过两个报文段发送了2000字节的数据。然后,服务器用一个报文段发送了2000字节的数据。
前三个报文段既带有数据又带有确认,但最后一个报文段只有确认而没有数据,因为已经没有更多的数据要发送了。
请注意序号喝确认号的值,客户发送的数据报文段具有置1的PSH(推送)标志。因此服务器TCP知道要在收到这些数据后尽可能快地把它们交付给服务器进程。另一方面,从服务器发送来的报文段则没有把推送标志置为1.大多数TCP的实现把这个标志的置1还说不置1作为一个选项。

推送数据

我们知道,发送TCP利用缓存来存储从发送应用程序传来的数据流。发送TCP可以选择报文段的长度。接收TCP在数据到达时也要将这些数据进行缓存,并在接收应用程序就绪时或者接收TCP认为方便时,再把数据交付给应用程序。这种灵活性提高了TCP的效率
但是,在有些场合,应用程序不想要这种灵活性。例如,某个应用程序正在与对方的另一个应用程序进行交互式通信。其中一方的应用程序希望把它输入的字符发送给对方的应用程序,并希望立即收到响应。

TCP是可以处理这种情况的。发送方的应用程序可以请求推送操作。这就是说,发送TCP不必等待窗口被填满,它必须马上创建一个报文段并立即发送。发送TCP还必须置这个报文段的推送位(PSH)为1,以便告诉接收TCP,这个报文段所包括的数据必须尽快地交付给接收应用程序,不要等待更多数据的到来。

紧急数据

TCP是面向流的协议。这就是说,从应用程序到TCP的数据被表示成一串字节流。数据的每一个字节在字节流中占有一个位置。但是,在某些情况下,应用程序需要发送紧急字节,也就是说有些字节需要被另一端的应用程序以特殊方式对待。解决这个问题的办法就是发送一个URG(紧急)位置1的报文段。发送应用程序告诉TCP这块数据是紧急的。发送TCP创建一个报文段,并把紧急数据插入报文段的最前面。报文段的其余部分可以包含来自缓存的正常数据。首部中的紧急指针字段定义了紧急数据结束的地方(紧急数据的最后一个字节号)。
当接收TCP收到URG置1的报文段时,它就将这个情况通知给接收应用程序
注意:TCP的紧急数据既不是优先服务,也不是加速数据服务。相反,TCP紧急模式只是发送方的应用程序对某一部分字节流做了标记,要求接收方的应用程序特殊对待。
因此,指出紧急数据的存在,并对它在数据流中的位置进行标记,就是紧急数据的交付与其他正常TCP数据的交付之间的唯一的区别。除此之外,紧急数据的处理与其他TCP字节流的处理完全一样。接收方的应用程序必须完全按数据被提交时的顺序来读取每一个字节,不论是否使用了紧急模式。标准的TCP实现永远不会失序地交付任何数据。

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏