TCP协议基础之上建立着许多不同类型的网络协议,我们通常根据数据吞吐量的大小将其分为两大类:
第一类协议是交互数据类型协议,较为常见的协议有Telnet协议、SSH协议等。这种类型的协议在多数情况下用做小流量的数据交换,诸如输入一小段指令、回显一些文字等;
第二类协议是数据成块类型协议,较为常见的协议有FTP协议、HTTP协议、电子邮件等。这种类型的协议要求TCP尽可能的运载数据,把数据吞吐量做到最大,并尽可能提高效率。
针对这两类协议,TCP都会对他们进行优化传输。接下来,一起分析TCP是如何应对交互数据流传输的。
交互式输入
(图片源于网络)
如图所示, Telnet是连接交互命令时所产生的数据流。在Telnet传输的过程中,每次的交互输入都会产生一个数据分片,而当客户端输入完命令敲击回车键时都会产生一次数据交互,同时Telnet需要服务器回显给客户端需要响应的字符,此时产生四个报文段:
首先,输入完命令敲击回车时,产生了来自客户端的数据交互字节;
当服务器收到以后,会将这些字节发送给服务器,同时对客户端进行确认;
当Telnet处理完之后,会将回显的内容发送给TCP,TCP再将回显的内容发送给客户端进行显示;
最后,客户端收到回显内容,并在屏幕进行显示,对回显的字段进行确认。
整个交互过程中,每段数据流的内容都较少,这充分展示了Telnet的特点:流量小,交互次数多。而多数使用Telnet的用户对传输延迟不敏感,因此TCP需要采用两种手段对交互式输入进行优化处理。
第一种优化手段:Delay ACK
(图片源于网络)
Delay ACK也被称作延迟确认、延迟ACK、捎带ACK等,经常被次数多、流量小的应用来进行优化传输。TCP在接收数据时并不会立即发送ACK,相反会推迟发送,并在以下三种情况中触发服务器对收到的程序进行确认。
第一种情况:三次握手完成后,服务器会开启不断翻滚的计时器,一般该计时器的时间会设置成200ms。在200ms的计时器内,没有其它内容需要发送时,等待200ms时间到之后进行Delay ACK确认,而不是在收到数据后立即进行确认。该计时器在三次握手建立后启动,并非在收到数据后立即启动,因此等待的时间应为0-200ms之间的随机数。
第二种情况:服务器接收到数据之后不会立即回复确认,而是在计时器的时间到限前,如果有回显的数据需要发送,TCP会捎带着确认信息一并发送,这也就是捎带ACK的原因。
第三种情况:计时器时间到限前,服务器连续两次收到数据字节,此时的服务器不再遵循之前提到的两种等待情况,而会直接进行答复。
Delay ACK正是通过减少确认的次数,让原本需要在网络中频繁应答的过程变得简洁。
第二种优化手段:Nagle算法
MSS
学习Nagle算法前,先来了解一个概念:MSS。MSS的全称是Maximum Segment Size, TCP在建立连接发送SYN段时,会同时将MSS发送给对方。例如图中的第一个红框内容,flags是TCP的标志位,标志该数据包为一个SYN;而下面的红框内容是MSS的参数,发送该参数意味着告诉对方其希望接收TCP数据报文段的最大长度。图中示例能接收到的最大长度是1460个字节,在三次握手建连的过程中,双方会将该参数协商清楚,并在传输的过程中以此作为依据。
Nagle算法
TCP在传输过程中的任意时刻最多只能有一个未被确认的小段,而小于MSS尺寸的数据块就是小段。
Nagle算法规则
Nagle算法的规则一共有四个:
1、 如果数据包的长度没有达到MSS,TCP会等待后面的数据包;
2、 如果数据包中含有FIN标识,TCP会立即把数据包发送出去;
3、 如果TCP设置了NPdelay的选项,TCP会把收到的数据包直接发送出去;
4、 如果以上三种情况都没有发生,而TCP发生了超时,TCP会把缓存中的数据立刻发送出去。
Nagle算法的目的是尽可能发送大的数据块,尽量避免网络中充斥着小的数据块,以减少传输压力。但有时Nagle算法也会造成延时,这种情况下我们需要设置TCP Nodelay选项来关闭Nagle算法。
Nagle算法全过程?
看不懂没关系,视频正在加载中...
(点击扫码☝观看视频吧)