滑动窗口:决定一次发送的TCP报文数量
TCP有超时重传机制,已经发出去,但是暂时没有收到应答的报文,要被TCP暂时保存起来。发送缓冲区保存的方式就是 保持未收到应答的数据不覆盖。
已发送已确认可被覆盖,可以发送未确认的是滑动窗口。
滑动窗口的范围大小是对方的接受窗口(接收能力的大小)
滑动窗口用双指针来划分区域。窗口滑动是指针移动
win_start=确认序号
win_end= 确认序号+win大小
通过滑动窗口大小来控制流量控制
滑动窗口向右移动,确认应答的的确认序号决定左指针
滑动窗口移动时大小是动态变化的
滑动窗口,会在发送缓冲区越界吗?
TCP采用环状算法,类似于数组组成的队列
确认序号=1234+下次发送数据在缓冲区的位置(数组下标(类似于缓冲区看成数组))
延迟应答:返回更大的窗口
延迟应答,等待数据从缓冲区拿走后,返回的ACK可以发送更大的窗口。
接收方发送更大的数据。
窗口越大,网络吞吐量越大,传输效率越高
所有的包都可以延迟应答吗?
数量限制:每隔N个包就应答一次
时间限制:最大延迟时间应答一次
快重传
收到三个同样的应答时则进行重发,在剩余报文少于三个时,不会触发
拥塞控制
如果通信的时候出现少量的丢包?主机问题
r如果通信的时候出现大量的丢包?拥塞控制
当大量数据超时,按照拥塞控制策略,不能立即进行超时重发。
当多台主机受到TCP的影响,减少发送,就可以缓解网络拥塞,实现拥塞控制。
拥塞窗口
发送开始的时候,定义拥塞窗口为1
每次收到一个ACK应答,拥塞窗口+1
滑动窗口=min(发送方窗口,拥塞窗口)
拥塞窗口是动态的。
拥塞窗口的慢启动
出现拥塞时,网络发送数据
存在一个慢启动的阈值
拥塞窗口超过这个阈值增长先按指数级增长,再按线性方式增长。
当TCP开始启动的时候,慢启动阈值等于窗口最大值:
在每次超时重发的时候,慢启动國值会变成原来窗口的一半,同时拥塞窗口变为1。
当TCP通信开始后,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立刻下降;
拥塞控制。
TCP策略分类
可靠性:
校验和 序列号 确认应答 超时重发 连接管理 流量控制 拥塞控制
提高性能:
滑动窗口 快速重传 延迟应答 稍带应答
面向字节流
面向数据报:udp没有发送缓冲区,发送几次数据报,读取几次数据报,write和read一一对应。
TCP读和写不是一一匹配的,原因TCP是自主控制的发送的
TCP可以将数个请求变成字节,字节被接收到再划分成完整报文。
如发送5000个字节,直接从缓冲区拿到5000个字节,组装成TCP报文,发送,接收到的报文要把5000个字节再划分成请求
udp之间传递n个请求,tcp传递的是n个字节,n个字节可能有多个请求。
解决粘包问题:明确两个包的边界
数据包粘包:用户层读到半个或者不完整报文(请求)的行为
固定大小:对于定长的报文,按固定大小读取。
使用自描述字段:变长的包,在包头约定一个包总长度的字段。
使用特殊字符:对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议)
UDP协议不存在粘包问题,UDP要么收到,要么没收到,保证请求是一个一个的。
TCP链接异常
进程终止:网络文件相关->文件的生命周期随进程->进程断开->连接自动断开->四次挥手
机器重启:杀掉进程->连接自动断开->四次挥手
机器断电/网线断开:服务器认为连接正常,客户端连接断开,导致连接认知不一致