Tcp如何保证可靠传输呢?
什么是TCP?
TCP是一个运输层的传输协议,是面向连接的、可靠的、基于字节流的协议。
我们来看一下这几个概念:
面向连接:TCP的传输必须是有连接的,即要用三次握手建立可靠的通信信道,当然,这个信道是全双工的。
基于字节流:应用层的数据即应用层报文要在网络中传输,TCP会把报文以字节单位在网络中进行传输。
可靠的:即在传输过程中不会发生数据丢失,这个丢失指的不是数据包在网络中丢失,而是指的是Client发多少包Server就接受了多少包,没有漏传、错传的现象。
TCP如何保证可靠传输呢?
- 应用层报文被TCP分成最适合传输的数据块,TCP给这些数据块编上号。这样能保证数据有序。
- TCP头部有个检验和,TCP保持它头部和数据的检验和,如果检验有差错则丢弃和不确认接收。
- TCP会丢弃重复的数据。
- 流量控制
- 拥塞控制
- 停止等待协议
流量控制
流量控制的前提:以字节为单位的滑动窗口。
接收方发送的确认报文中的窗口字段可以控制放松方的发送窗口,若将窗口字段设为0,则发送方不能发送数据。
拥塞控制
-
慢开始
当主机开始发送数据时,大量字节涌入网络会引起阻塞,则将cwnd滑动窗口值先设为1,每传输一次令cwnd * 2 *(1,2,4,8) -
拥塞避免
而拥塞避免则是每传输一次(经过一个RTT),就令cwnd+1
开始传输时设满开始门限ssthresh,当cwnd < ssthresh时采用慢开始算法 ,cwnd > ssthresh时采用拥塞避免算法,两者相等时可任意二选一。
当发生超时的时候,将ssthresh / 2,开始上述步骤。
-
快重传
-
快恢复
丢失个别报文段,不启动慢开始算法,执行快恢复算法。ssthresh = cwnd / 2,同时让cwnd = ssthresh进行快恢复。此时执行的是拥塞避免算法。
停止等待协议
- 无差错
- 有差错
超时重传的前提:
1)保留发送的分组
2)对包进行编号
3)设置超时重传的时间比一个RTT长 - 确认丢失和确认迟到
确认丢失
确认迟到
- 连续的ARQ协议
可提高信道利用率,发送方维持一个窗口, 位于窗口内的所有数据都可以发送出去,不需要等待确认,接收方采用累计确认的方式。这时候就会产生拥塞控制部分的东西。