1、窗口大小的通告
窗口大小的变化,窗口大小的数值和4096之间的差距体现了处理程序的缓冲区中还存在着多少未被处理的数据。
2、窗口滑动
窗口大小的默认数值反映了发送和接受缓冲区的大小,而当前窗口的大小和默认大小之间的差距就是数据在缓冲区中未被处理的量。当窗口左沿向右边滑动时称为窗口合拢,这种现象发生在数据被发送和确认时,当窗口右沿向右边移动时被称为窗口张开,这种现象出现在一端的接收进程读取已经确认数据并释放了TCP的接收缓存时。
3、PUSH标记
客户端进程通知TCP在向服务器发送一个报文时不要因为等待额外数据而使得已经提交的数据在缓冲区等待,而服务器的TCP收到一个设置了PUSH标记的报文时,它需要立刻将这些数据递交给服务器进程而不能等待判断是否还有额外数据会到达。
如果待发送数据将清空发送缓存,这意味着每个应用程序的数据均被设置了PUSH标记。
4、慢启动
慢启动为发送方的TCP增加了另外一个窗口:拥塞窗口。当与另外一个网络的主机建立TCP连接后,拥塞窗口被初始化为1个报文,没收到一个ACK,拥塞窗口就增加一倍的数量,例如从1到2,2到4,4到8.发送方取拥塞窗口和通告窗口中的最小值作为发送上限。拥塞窗口技术室发送方的流量控制,而窗口滑动技术则是接收方的流量控制技术。
5、紧急指针
TCP提供了一种可以在普通数据报文中包含了紧急数据的方法。可以通告设置TCP首部中的两个字段来发出从一端到另一端的紧急数据,URG标记为置1,并且用一个16bit的紧急指针标记一个偏移量,该偏移量必须与TCP首部中的序号字段相加,得到紧急数据的最后一个字节的序号。
6、拥塞避免算法
拥塞避免算法和慢启动算法常常放在一起实现。
他们对每个TCP维持两个变量,一个拥塞窗口和一个慢启动变量。
1)对于给定的连接,初始化拥塞窗口为1,慢启动门限为65535
2)TCP的输出不能超过拥塞窗口大小和对端通告的窗口大小
3)当拥塞发生时(超时或收到重复确认),慢启动门限被设置为当前窗口大小的一半和接受方通告窗口大小的最小值,如果是超时引起了拥塞,则拥塞窗口被设置为1个报文段。
4)当数据被确认时,就增加拥塞窗口大小,如果窗口大小小于等于慢启动门限,则进行慢启动,否则进行拥塞避免。慢启动一直持续到发送拥塞时的窗口大小的一半才停止从而转为慢启动。
7、快速重传与快速恢复
1)当收到第三个重复的ACK时,将慢启动门限设置为当前拥塞窗口的一半,重传丢失的报文,设置拥塞窗口为慢启动门限加上三倍报文大小
2)每次收到一个重复的ACK时,将窗口大小增加一个报文段并发送一个报文。
3)当下一个确认新数据的ACK到达后,设置当前拥塞窗口为慢启动门限。
8、坚持定时器
TCP必须要能处理打开窗口的ACK丢失的情况。如果一个窗口更新的确认ACK丢失了,则双方就有可能因为等待对方而终止了连接:接收方等待接收数据(已经向发送方通告了一个非0的窗口ACK),而发送方等待允许它继续发送数据的窗口更新。于是双方陷入死锁,为了防止这种死锁,发送方使用了一个坚持定时器来周期性的向接收方查询。坚持定时器的时间间隔使用了普通的TCP指数退避。
9、保活定时器
如果一个给定的连接在2小时内都没有任何动作,服务器就会向客户端发送一个探查报文,那么就会有如下四种情况
1)客户主机依然正常运行,客户端的TCP正常响应,服务器知道客户端是正常工作,则等待2小时候再次触发探测报文。
2)客户主机崩溃或者重启中,客户端的TCP是不会有响应的,服务器收不到响应后会间隔75秒发送探测报文,一共发送10次,如果没有一个响应,则认为客户端已经关闭并终止连接。
3)客户主机崩溃后系统重启完毕,客户端收到探查报文,但是回应一个复位,服务器终止连接
4)客户主机正常但服务器不可达,服务器仍然没有收到响应,这与2)的处理动作相同。
10、经受时延的确认
通常TCP在接收数据时并不立刻发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送。绝大多数采用的时延是200ms,也就是说TCP将以最大200ms的时延等待是否有数据一起发送。
11、nagle算法
一些包含着很少负载量的报文被称为微小报文,在局域网中,微小报文通常不会引起麻烦,但是在广域网中,微小报文会降低网络资源的利用率,增加拥塞。
nagle算法要求TCP上最多只有一个未被确认完成的微小报文连接,在该分组确认到达之前不发送其他的小分组,相反,TCP尽力搜集这些少量的分组,并在确认到来之时以一个分组的方式发送出去。
该算法的优越性是自适应的:确认的速度越快,数据就发送的越快,而在希望减小微小分组的广域网上,确认的速度会变慢,发送的频率就会降低。
但是有时也是必须要关闭nagle算法的,典型的例子就是实时的窗口系统服务,要求客户端的动作无延时的发送出去以满足用户交互的操作感。
当选择套接字中TCP_NODELAY后就关闭了nagle算法。
12、TCP连接和拆除的状态