TCP如何保证可靠连接
首先应当明确TCP在数据传输过程中可能存在的影响可靠性的原因,主要存在以下几个问题
- 数据发生损坏
- 数据可能不是按顺序到达接受端
- 在传输过程中可能存在数据丢失
- 接收端返回的
Ack
丢失,发送端重新发送导致重复
为解决以上几个问题,TCP主要采用以下几个措施
1. 滑动窗口(流量控制)
发送窗口:发送端没有收到接收端回复的Ack的情况下,发送端可以将窗口内连续的数据都发送出去,但是发送的数据在未被接收端确认之前,都会暂时保留,以便在超时重传时重新使用。在收到接收端的Ack后,Ack之前的数据就不需要再保留。
接收窗口:接收端可以对 按序 收到的数据中的最高序号给出确认
发送缓存:
- 发送端准备发送的数据
- TCP已经发送但是尚未收到确认的数据
接收缓存:
- 按序到达的,但尚未被接收应用程序读取的数据
- 未按序到达的数据
- 同一时刻,发送端和接收端的窗口大小不一定相同
- 对于没有按序到达的数据,TCP通常先临时存放在接收窗口中,等到缺失的数据收到后,再按序交付给上层的应用程序
- TCP的接收方有累积确认的功能,以减少传输开销
2. 超时重传
TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。
重传时间的选择
TCP采用了一种自适应的算法,简单来讲,就是记录报文发送的时间以及收到相应确认的时间,计算其差值为 报文往返时间
RTT
,并且RTT会根据每次报文的往返时间不断更新。
3. 拥塞控制
1. 什么是拥塞
在计算机网络中的带宽,交换节点中的缓存和处理机等,都是网络资源,在某段时间,若 对网络中的某一资源的的需求超过了网络所能提供的可用部分,网络的性能就会变坏了,这种情况就叫拥塞。
2. 控制方法
拥塞控制就是防止过多的数据注入到网络中,这样使得网络中的路由器或链路不至于过载,拥塞控制是全局性的过程
流量控制是一个端到端的,点对点通信的过程。
- 慢开始
由小到大逐渐增大发送窗口
- 拥塞避免
让拥塞窗口缓慢地增大,即每经过一个往返时间RTT就把发送方地拥塞窗口加1,拥塞窗口按现象规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢的多
-
快重传
-
快恢复
4. 校验和
如果接收方校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。
5. 序列号和确认号
序列号: TCP将每个字节的数据都进行了编号,一般情况下序列号Seq为将要传输的数据的第一个编号
序列号的作用:
通过和Ack相互确认,可以判断接收方是否少接收数据
保证数据按序到达,每个字节的数据都又编号
提高效率,可以在多次发送后一次确认
去除重复的数据,假设接收方收到相同的数据,则丢弃
确认号: TCP收到数据后,期望下一次收到数据的第一个编号
确认号的作用:
- 保证数据的可靠性,Ack表示之前的数据都按序到达
- 延迟确认,如果连续收到多个字节的数据,只需要回复最终的Ack,降低网络流量