1 TCP的消息格式
由于网络层(IP层)是没有可靠传输机制的,尽自己最大的努力进行交付。而传输层使用 TCP 实现可靠传输。
TCP保证可靠性传输的机制依靠一下几种
1)校验和
2)序列号和确认应答机制
3)重传机制
4)滑动窗口
5)流量控制
6)拥塞控制
2 校验和
所谓 TCP 的校验和就是由发送端计算待发送 TCP 报文段的校验和,然后接收端对接收到的 TCP 报文段验证其校验和(TCP 的校验和是一个端到端的校验和)。其目的是为了发现 TCP 的协议头和数据在发送端到接收端之间是否发生了变动。如果接收方检测到校验和有差错,则该 TCP 报文段会被直接丢弃。默认没有收到数据,返回一个延时ack,告诉对端重发数据。
3 序列号和确认应答机制
TCP 报文段的首部中有一个序号字段指的是该报文段第一个字节的序号(一个字节占一个序号)。确认应答机制就是接收方收到 TCP 报文段后就会返回一个确认应答消息。
4 重传机制
数据在传输过程中丢失了呢?
下面介绍几种常见的重传机制:
超时重传
RTO 超时重传时间
当发送端发送一个报文的时候会启动一个超时重传的定时器,当收到接收端返回这个数据报文的ack数据时候,定时器会被刷新,当定时器事件 超过RTO时候,会重新发送这一条数据报文。如果依然没有被收到,定时器事件 >上一次RTO*2 继续重新发送。一般在数据包丢失,或者说ack数据包丢失才会出现超时重传。
快速重传
它不以时间为驱动,而是以数据驱动重传
当三次返回的ACK是相同的时候就会触发快速重传的机制。
SACK
这里就不多讲述
滑动窗口
下一期博客讲解TCP/ip定时器和滑动窗口
流量控制
双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过,的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。
如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。对发送方发送速率的控制,称之为流量控制。
那么流量控制如何控制?
接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。
发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。
流量控制- 发送方何时再继续发送数据
当发送方停止发送数据后该怎样才能知道自己可以继续发送数据?
1 当接收方处理好数据,接受窗口win>0时,接收方发个通知报文去通知发送方,告诉他可以继续发送数据了,当发送方收到窗口大于0的报文时,就继续发送数据。
2 当发送方收到接受窗口win=0时,这时发送方停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方,打听是否可以继续发送数据了,如果可以,接收方就告诉他此时接受窗口的大小,如果接受窗口大小还是为0,则发送方再次刷新启动定时器。
拥塞控制
拥塞控制和流量控制虽然采取的动作很相似,但拥塞控制与网络的拥堵情况相关联,而流量控制与接收方的缓存状态相关联。
慢启动与快恢复
慢启动:
1 窗口恢复 比如默认32
2 即使对方窗口恢复为32 ,发送数据按照指数真正去发送窗口数据
1->2-.3->5->
快恢复
一下载就开始放松12个包
tcp年代久远,以前带宽有限,大家不要去抢带宽
现在带宽很强大,用快恢复比较多