TCP传输可靠性的前提条件
- 重传机制:针对数据包丢失或者出现定时器超时
- 确认应答:停止等待协议,发送之后等待收到应答。
- 序列号:针对数据包到达接收端主机顺序乱掉
- 流量控制:针对避免网络拥堵时候;针对高效传输数据包的流动窗口的控制
- 拥塞控制:针对刚开始启动的时候避免一下子发送大量数据包而导致网络瘫痪的慢启动算法和拥塞控制。
- 校验和:发送方和接收方计算校验和并进行对比确认未出错
- 连接管理:三次握手与四次挥手
- 数据的合理分片和排序
可靠性传输的要求
- 数据能够完整地到达对方
- 到达的数据不是乱序,不重复
- 到达的数据未被损坏
TCP的报头结构
在物理网络上传输的数据:
帧头+网络层协议(IP)+传输层协议报头(TCP/UDP)+应用层协议报头(HTTP)+用户需要传递的数据+帧尾
TCP报头是由:20个字节的固定部分+40字节的选项部分(可选)
-
16位源端口号:发送方的程序所使用的的端口号
-
16位目的端口号:接收方的程序所使用的端口号
-
32位序号:它是由发送方填充,序号值是发送方随机产生的数ISN+当前报文段所携带的数据的第一个字节在整个字节流中的偏移量(
唯一标识在这个传输方向上的TCP报文段
)
(ISN产生在双方第一次通讯时,一旦产生就确定下来了) -
32位确定号:它是由接收方填充,是对接收到的报文段的确认,确认号 = 接受的报文段的序号 + 报文段所携带的数据长度 + 1
-
4位头部长度:0 - 15 单位 :4字节 ——> TCP报头是4字节对齐的
-
6位标记位:URG ACK PSH RST SYN FIN
-
16位的窗口大小:由接收方填充,用来通告发送方本端的接受缓冲区还有多少个字节的空余空间
-
16位的校验和:对TCP报文段的报头和数据部分进行冗余校验
-
16位紧急指针:发送紧急数据
TCP的报头结构中,保证可靠性的数据是:
- 确认号:确认机制+超时重传机制(保证数据能够完整地到达对方)
- 序号:进行排序和去重,保证到达的数据不乱序,不重复
- 16位冗余校验和:对TCP报头和数据进行冗余校验,保证数据不被破坏
滑动窗口
滑动窗口用来做流量控制,使得 发送方发送的速率
和接收方接受数据的速率
做匹配。防止发送方发送数据过快,而接收方来不及接受数据,而造成数据的丢失。
TCP报头中的16位窗口大小是接收端填充
的,来通告发送方本端的接受缓冲区还可以接受多少字节的数据。
发送方可以根据接受的窗口大小还有接收端对数据的确认,将可发送的数据的窗口向右移动。
如果收到36确认,并且发送了46-51的数据,则窗口就会向右滑动
滑动窗口的拓展问题
-
如果接受通告窗口为0(不可发送),则发送端怎么处理?
发送方维护坚持定时器
,窗口探查 -
糊涂窗口综合征—窗口大小从0变到非0(较小的一个值),若不加控制则发送方会发送小数据,使得发送数据的效率低下,解决方案如下:
①接收方:若窗口大小没有达到MSS或者接受缓冲区的一半,则不告知发送发送方窗口为非0值
②发送方:
第一.可以发送一个满长度(MSS)的报文段;
第二.达到接受缓冲区大小的一半;
第三.发送方没有未被接收端确认的报文段 -
Nagle算法:尽量减少数量的发送,在以下两个条件之一满足之前,就会一直积累待发数据:
-
①收到之前发送的报文段的确认之前
-
②积累的数据量没有达到MSS或者没有到发送窗口(接受通告窗口)的一半
以上的这些机制仅仅是在通信的两端控制数据的可靠性,但是没有让发送方去适配网络环境
拥塞控制
用来控制发送数据的速率与当前网络环境适配
四种算法:
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
快速重传:
发送方不需要等待一个报文段的超时时间段到达只要有下面的情况,就立即重传需要的报文段:
收到三个连接的对同一个报文段的连续确认,则立即重传需要的报文段。