《TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》 —1.4 T/TCP上的客户-服务器
1.4 T/TCP上的客户-服务器
我们的T/TCP客户-服务器的源代码和上一节的TCP客户-服务器的源代码略有不同,以便能够利用T/TCP的优势。图1-10给出了T/TCP上的客户程序。
图1-10 T/TCP上的事务客户程序
图1-10 (续)
1. 创建TCP插口
10-15 对socket函数的调用与TCP上的客户程序一样,在Internet插口地址结构中同样也填入服务器的IP地址和端口号。
2. 向服务器发送请求
17-19 T/TCP上的客户程序不调用connect函数,而是直接调用标准的sendto函数,该函数向服务器发送请求,同时与服务器建立起连接。此外,我们还用sendto函数的第4个参数指定了一个新的标志MSG_EOF,用以告诉系统内核数据已经发送完毕。这样做就相当于图1-5中的调用shutdown函数,向服务器发送一个FIN。MSG_EOF标志是T/TCP实现中新加入的,不要把它与MSG_EOR标志混淆,后者是基于记录的协议(比如OSI的运输层协议)中用来标志记录结束的。我们将在图1-12中看到,调用sendto函数的结果是客户端的SYN、客户的请求以及FIN都包含在一个报文段中发送出去。换言之,调用一个sendto函数就实现了connect、write和shutdown三个函数的功能。
3. 读服务器的应答
20-21 读服务器的应答还是用read_stream函数,与前文讨论过的TCP上的客户程序一样。
图1-11所示的是T/TCP上的服务器程序。
图1-11 T/TCP上的事务服务器程序
图1-11 (续)
这个程序与图1-7中TCP上的服务器程序几乎完全一样:对socket函数、bind函数、listen函数、accept函数和read_stream函数的调用都一模一样。唯一的不同在于T/TCP上的服务器发送应答时调用的是send函数,而不是write函数。这样就可以设置MSG_EOF标志,从而可以将服务器的应答和服务器的FIN合并在一起发送。
图1-12所示的是T/TCP上客户-服务器事务的时序图。
T/TCP上的客户测量到的事务时间和UDP上的几乎一样(图1-4):RTT + SPT。我们估计T/TCP上的时间会比UDP上的时间稍长一点,因为TCP需要处理的事情比UDP要多一些,而且通信双方都要执行两次read操作分别读数据和文件结束标志(而UDP环境下双方都只要调用一次recvfrom函数即可)。但是双方主机上这一段额外的处理时间比一次网络往返时间RTT要小得多(我们在1.6节中给出了一些测试数据,用来比较UDP、TCP和T/TCP上的客户-服务器事务的差别)。由此我们可以得出结论:T/TCP上的事务时间要比TCP上的事务小大约一次网络往返时间RTT。T/TCP中省下来的这个RTT来自于TAO,即TCP加速打开(TCP Accelerated Open)。这种方式跳过了三次握手的过程。下面两章中我们将说明其实现方法,在4.5节中我们还将证明这样做的正确性。
UDP上的事务需要两个分组来传送,T/TCP上的事务需要3个分组,而TCP上的事务则需要9个分组(这些数字的前提是没有分组丢失)。因此,T/TCP不仅缩短了客户端的事务处理时间,而且也减少了网络上传送的分组数。我们希望减少网络上的分组数,因为路由器往往受限于它们可以转发的分组数,而不是每个分组的长度。
概括地讲,T/TCP以一个额外的分组和可以忽略的延续时间为代价,同时具有了可靠性和适应性这两个对网络应用至关重要的特性。
图1-12 T/TCP上客户-服务器事务的时序图
- 点赞
- 收藏
- 关注作者
评论(0)