若是按照分组数量计算,约有一半的TCP报文段包含成块数据(如FTP、电子邮件等),另外一半则包含交互数据(如telnet和rlogin)。
若是按照字节计算,则成块数据与交互数据的比例约为90%和10%。这是由于成块数据的报文段基本上都是满长度(full-sized)的(一般为512字节的用户数据),而交互数据则小得多,研究代表telent和rlogin分组中一般约90%的用户数据小于10字节。
所以TCP须要能处理交互数据和成块数据,但使用的处理算法有所不一样。算法
一个Rlogin链接上键入一个交互命令时会产生4个报文段:
(1)来自客户的交互按键
(2)来自服务器的按键确认
(3)来自服务器的按键回显
(4)来自客户的按键回显确认
如图:缓存
然而,咱们通常能够将报文段(2)和(3)进行合并--按键确认与按键回显一块儿发送(经受时延的确认)
一般TCP在接收到数据时并不当即发送ACK;相反,它推迟发送,以便将ACK与须要沿该方向发送的数据一块儿发送(有时称这种现象为数据捎带ACK)
绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是否有数据一块儿发送。服务器
一个Rlogin链接上客户通常每次发送一个字节到服务器,这就产生了一些41字节长的分组:20字节的IP首部、20字节的TCP首部和1字节的数据。在局域网上,这些小分组(tinygram)一般不会引发拥塞。
但在广域网上,这些小分组则会增长拥塞出现的可能,一种简单和好的方法就是采用Nagle算法。
Nagle算法要求一个TCP链接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达以前不能发送其余的小分组。相反,TCP收集这些少许的分组,并在确认到来时以一个分组的方式发出去。网络
有时须要关闭Nagle算法:小消息(鼠标移动)必须无时延地发送,以便为进行某种操做的交互用户提供实时的反馈。Socket API用户可使用TCP_NODELAY选项来关闭Nagle算法。性能
如图指针
将字节1~11进行标号,接收方通告的窗口称为提出的窗口(offered window),它覆盖了从第4字节到第9字节的区域,代表接收法已经确认了包括第3字节在内的数据,且通告窗口大小为6。blog
窗口大小与确认序号相对应的,发送方计算它的可用窗口,该窗口代表多少数据能够当即被发送。
当接收方确认数据后,这个滑动窗口向右移动。窗口边沿的相对运动增长或减小了窗口的大小。有以下4种移动状况:
(1)称窗口左边沿向右边沿靠近为窗口合拢,这种现象发生在数据被发送和确认时
(2)当窗口右边沿向右移动时将容许发送更多的数据,称之为窗口张开。这种现象发生在一段的接收进程读取已经确认的数据并释放了TCP的接收缓存时
(3)当右边沿向左移动时,称之为窗口收缩。(不容许)
(4)窗口左边沿向左移动。(不存在)进程
特别说明:
(1)发送方没必要发送一个全窗口大小的数据。
(2)来自接收方的一个报文段确认数据并把窗口向右边滑动。这是由于窗口的大小是相对于确认序号的。
(3)窗口大小能够减少,可是窗口的右边沿却不可以向左移动,若是左边沿到达右边沿,则称为一个零窗口,此时发送方不可以发送任何数据。
(4)接收方在发送一个ACK前没必要等待窗口被填满。路由
由接收方提供的窗口的大小一般能够由接收进程控制,这将影响TCP的性能。
Socket API容许进程设置发送和接收缓存的大小。接收缓存的大小是该链接上所可以通告的最大窗口大小。有一些应用程序通告修改Socket缓存大小来增长性能。io
发送方使用该标志通告接收方将所收到的数据所有提交给接收进程。这里的数据包括与PUSH一块儿发送的数据以及接收方TCP已经为接收进程收到的其余数据。
若是发送方和接收方之间存在多个路由器和速率较慢的链路时,就有可能出现一些问题。一些中间路由器必须缓存分组,并有可能耗尽存储器的空间。
TCP支持一种称为“慢启动(Slow start)”算法。该算法经过观察到新分组进入网络的速率应该与另外一端返回确认的速率相同而进行工做。
慢启动为发送方的TCP增长了另外一个窗口:拥塞窗口(congestion window),记为cwnd。当与另外一网络主机创建TCP链接时,拥塞窗口被初始化为1个报文段(即另外一端通告的报文段大小)。
每收到一个ACK,拥塞窗口就增长一个报文段(cwnd以字节为单位,可是慢启动的报文段大小为单位进行增长),发送方取拥塞窗口与通告窗口中的最小值最为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
发送方开始时发送一个报文段,而后等待ACK。当收到该ACK时,拥塞窗口从1增长为2,便可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增长为4。这是一种指数增长的关系。
当某些点上达到了互联网的容量,因而中间路由器开始丢弃分组。这就通告发送方它的拥塞窗口开的过大。
TCP提供了“紧急方式”(urgent mode),它使一段能够告诉另外一端有些具备某种方式的“紧急数据”已经放置在普通的数据流中。另外一端被通告这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。能够经过TCP首部中的两个字段来发出这种从一端到另外一端的紧急数据已经被放置在数据流中的通告。URG比特被置为1,而且一个16位的紧急指针被置为一个正的偏移量,该偏移量必须与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。