1.TCP以段为单位发送数据
在建立TCP连接的同时,也可以确定发送数据包的单位,即MSS(Maximum segment Size)
MSS是在三次握手的时候,在两端主机之间被计算的。两端的主机发出建立连接请求时,会在TCP首部写入MSS选项,告诉对方自己的接口能够适应的MSS的大小,然后会在两者之间选择一个较小的值投入使用。
2.利用窗口控制来提升速度
TCP是以1个段为单位,每发一个段进行一次确认应答处理,但是这样的传输方式有一个缺点(发一个段就要收一个确认应答,再发下一个段,即为每个数据包进行确认应答)导致包的往返时间越长,通信性能就越低(网络吞吐量越差)。
基于上述问题,引入了窗口的概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将被大幅度的缩短。
窗口大小:指无需等待确认应答而可以继续发送数据的最大值。
实现方法:此机制的实现使用了大量的缓冲区,实现通过对多个段同时进行确认应答的功能。
于是引入
滑动窗口控制:顺序地将多个段同时发送提高通信性能的机制。
下面的内容参考他人文章,(未找到原创者)
{
TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓 冲区。由于窗口由16位bit所定义,所以接收端TCP 能最大提供65535个字节的缓冲。由此,可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。
关于滑动窗口协议,还有三个术语,分别是:
窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
窗口张开:当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
窗口收缩:当窗口的右边沿向左边移动的时候,这种现象不常发生。
TCP就是用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(但不用发送所有,只是处于窗口内的数据可以发送。)。这就是窗口 的意义。窗口的大小是可以通过socket来制定的,4096并不是最理想的窗口大小,而16384则可以使吞吐量大大的增加。
A—————C—————B
如上图,A与B之间建立TCP连接,滑动窗口实现有两个作用:
由于对称性,只考虑A端发送窗口和B端接收窗口,有如下两个作用
1。B端来不及处理接收数据(控制不同速率主机间的同步),这时,A通过B端通知的接收窗口而减缓数据的发送。
2。B端来得及处理接收数据,但是在A与B之间某处如C,使得AB之间的整体带宽性能较差,此时,A端根据拥塞处理策略(慢启动,加倍递减和缓慢增加)来更新窗口,以决定数据的发送。
与固定大小的滑窗协议相比,TCP采用可变大小的滑窗协议是为了取得更好的性能。
}
3.窗口控制与重发控制
那么问题来了,在窗口控制中,如果段丢失了该怎么办?
(1)首先考虑确认应答未能返回的情况,数据已经到达对端,有了窗口控制,某些确认应答是不需要进行重发的(窗口在一定程度上较大时)
(2)再来考虑下某个报文段丢失的情况,接收端在没有收到自己所期望序号的数据时,会对之前收到的数据进行确认应答,发送端则一旦收到某个确认应答后,又连续三次收到同样的确认应答,则认为数据段已经丢失,需要进行重发,这种机制比超时重发管理机制更为高效,因此也被称作高速重发控制。
4.流量控制
发送端根据自己的实际情况发送数据。但是接收端可能收到一个毫无关系的数据又可能会在处理其他问题上花费一些时间。因此在为这个数据包做其他处理时会消耗一些时间,甚至在高负荷的情况下无法接收任何数据。如此一来,如果接收端本应该接收的数据丢弃的话,就又会触发重发机制,从而导致网络流量的浪费。
为了防止这种情况,TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流控制。
具体操作:接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不超过这个限度的数据。(该大小限度就被称作窗口大小,)接收端主机决定了这个大小。也就是这个时候会传送窗口的大小。