TCP:传输控制协议
TCP: 是一种面向连接的可靠的传输协议
什么是可靠?—>保证数据传输给对方
怎么保证可靠性?—> 确认机制 重传输机制
什么是面向连接?—>在传输数据之前,双方进行协商,保证双方可以收发数据
怎么保证面向连接?—>三次握手
可靠传输— 4种可靠机制 – 确认 重传 排序 流控(滑动窗口)
确认应答(ACK)机制确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。
TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
当主机A发送到主机B时,主机B会返回给主机A一个确认应答。
超时重传机制超时重传的两种情况
(1)如果主机A发送给主机B的报文,主机B在规定的时间内没有及时收到主机A发送的报文,我们可以认为是ACK丢了,这时就需要触发超时重传机制。
(2)如果主机A未收到B发来的确认应答,也可能是因为ACK丢了。因此主机B会收到很多重复的数据,那么,TCP协议需要能够识别出那些包是重复的包,并且把重复的包丢弃,这时候我们可以用前面提到的序列号,很容易做到去重的效果
超时重传时间的确认
重传时间的确定:报文段发出到收到应答中间有一个报文段的往返时间RTT,
显然超时重传时间RTO会略大于这个RTT,
TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。
排序机制在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2500ms后再进行重传,如果仍然得不到应答就等待4500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。
确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一。
流控(滑动窗口)机制接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。
因此TCP支持根据接收端的处理能力,来决定发送端的发送速度,这个机制叫做流量控制。
在TCP报文段首部中有一个16位窗口大小,窗口大小的内容实际上是接收端接收数据缓冲区的剩余大小,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,那么发送方将停止发送数据。并定期的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
注:16位的窗口大小最大能表示65535个字节(64K),但是TCP的窗口大小最大并不是64K。在TCP首部中40个字节的选项中还包含了一个窗口扩大因子M,实际的窗口大小就是16位窗口字段的值左移M位。每移一位,扩大两倍。
利用滑动窗口来实现流量控制。
发送方的发送窗口,不能超过接收方给出的接受窗口的数值。
当发送一次数据,等到确认应答时才可以发送下一个数据段,这样的效率会很低,我们利用滑动窗口,无需等待确认应答而可以继续发送数据的最大值;收到第一个ACK后,滑动窗口向后移;*操作系统为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有那些数据没有应答,只有确认应答过的数据,才能从缓冲区删除掉;窗口越大,网络的吞吐率越高;TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带一个字节的数据),对方就在确认这个探测报文段时给出了现在的窗口值,如果仍然是0,那么收到这个报文段的一方就重新设置持续计时器;如果窗口不是0,那么死锁的僵局就可以打破。
在使用窗口控制中, 出现丢包一般分为两种情况:
(1)数据包在传送过程中丢失了
当发送端的某一段报文丢失后,发送端会一直收到1001这样的ACK;如果发送端主机连续三次收到同样的”1001”这样的应答,就会将对应的数据1001-2000重新发送;当成功接收到1001之后,再次返回的ACK就是6001了,接收端在之前就已经收到(2001-7000)了,被放到了接收端操作系统内核的接受缓冲区中。这种机制被称作快重传
(2)数据包已经递达,ACK丢了
被放到了接收端操作系统内核的接受缓冲区中。这种机制被称作快重传



