浙江做铁塔的公司网站,做一个app需要什么流程,wordpress用什么服务,学生网站开发大赛1、TCP重传机制 通过序列号和确认号确保可靠传输#xff0c;当发送端发送数据给接收到#xff0c;接收端会返回一个确认号#xff0c;表示收到消息了 超时重传#xff1a;没有在指定时间内收到ACK报文 超时重传的两种可能#xff1a;数据包丢失、确认包丢失超时重传时间RT…1、TCP重传机制 通过序列号和确认号确保可靠传输当发送端发送数据给接收到接收端会返回一个确认号表示收到消息了 超时重传没有在指定时间内收到ACK报文 超时重传的两种可能数据包丢失、确认包丢失超时重传时间RTO: RTO较大重发就变慢了丢包之后需要半天才能重发效率低RTO较小可能没有丢包还在等待ACK过程中就重发了会导致网络拥塞进而导致更多的超时重发所以RTO需要略大于报文往返的时间RTT(数据发送到接收到ACK的时间差) 由于网络波动问题RTT可能不是固定的所以RTO对应也不是固定的一般超时重传一次下一次超时重传的间隔会加倍避免网络环境差的频繁发送 快速重传 超时重传的问题重传周期可能很长(时间会加倍)快速重传可以解决这个问题以数据为驱动作为重传发送了数据包seq1~seq5, 发送端发送seq1接收端回复ack2表示接收到包1seq2丢失发送端连续发送seq3~seq5接收端会重复返回ack2连续三次ack2触发快速重传重复seq2由于接收到了seq3~seq5发送端会返回ack6 快速重传只解决了超时问题但是还有一个问题重传的时候重传一个还是所有数据包因为如果只重传一个当有两个数据包丢失的时候需要判断两次返回的ack(三次重复)来进行单包重传效率低如果重传所有就会有多余的包被重新发送无用功 SACK选择性确认,可以知道哪些数据丢失了 需要TCP头部选项字段中添加一个SACK可以将已接收到的数据的信息发送给发送方发送方就知道了哪些数据丢失了从而只发送丢失的数据在快速重传的基础上发送方收到三次相同的ack报文触发快速重传机制通过SACK信息可以知道哪段数据丢失了只对丢失的数据重传 D-SACK通过SACK告诉发送端哪些数据被重复接收了 可以让发送端知道是包丢失还是ACK包丢失了可以知道发送的数据包是不是被网络延迟了可以知道网络中是不是把发送端的数据包给复制了 小结 如果数据包丢失或者ACK包丢失超过一定时间会触发超时重传超时时间RTO略大于RTT时间(发送数据到接收ACK包的时间间隔)为了解决超时等待的时间提高效率就有了快速重传当有一个包丢失的时候可以通过判断重复的ack进行快速重传通过在TCP头部的选项字段里面添加SACK就可以知道哪些包是丢失的从而只重传丢失的包如果在ACK包丢失导致的超时重传发送端接收到接收端SACK从而知道收到了重复数据这个SACK就是D-SACK如果一个包由于网络问题导致的快速重传也可以通过D-SACK来进行判断
2、TCP滑动窗口 TCP每次发送数据都要进行确认应答当上一个包收到应答了再发下一个 如果是一问一答的形式则数据包往返的时间周期越长通信效率就越低为了解决上面的问题就有窗口概念 可以指定窗口大小窗口大小是不需要等待确认应答可以继续发送数据的最大值窗口是内核里面开辟的缓存区需要保留发送的数据只有收到应答才会从缓冲区中删除在TCP头部可以指定窗口大小发送端会根据ACK返回的窗口大小来发送数据从而保证对端可以正常接收数据所以窗口大小是由接收端决定的 发送端的窗口 有两个绝对指针一个指向没有收到ack的第一个字节的序列号 一个指向窗口中可用空间的第一个字节的序列号会根据ACK报文中的窗口大小进行调整因为应用层不一定及时收数据此外如果发送端窗口满了没有及时收到ACK就不能在应用层进行发送数据如果序列号较前的收到ack窗口会向右移动存在可发空间应用层可以继续拷贝发送数据 接收端的窗口可以接收发送端发送的数据量一次能处理的数据量 只有一个绝对指针指向期望对端发送来的下一个字节的序列号窗口里面是还没进行确认的数据也就是还没收到的数据但是可以接收的数据大小 发送端窗口约等于接收端窗口因为传输存在延迟不一定及时调整窗口大小所以是约等于小结 三次握手确定窗口大小接收端能接收多少数据发送端根据接收端数据进行调整去发送数据在发送端窗口大小内发送端可以一直发并等待接收端返回ack确认号来发送窗口移动每次ack报文都会携带窗口大小可能会改变
3、TCP流量控制 利用滑动窗口实现流量控制发送端不能一股脑的发过去如果对方处理不过来就会触发重传机制 流量控制发送方 根据 接收方的实际接收能力发送数据也就是接收端滑动窗口的大小TCP内核缓冲区和滑动窗口的关系缓冲区大小会影响窗口大小 应用层不及时收取数据会导致窗口变小 TCP滑动窗口(指针实现)是处于TCP缓冲区中间的如果接收端接收到数据并返回ACK但是应用层没有及时收取当缓冲区内存不够可能会导致滑动窗口变小当窗口大小变成0就发生了窗口关闭 系统资源减少会导致缓冲区变小 如果用户空间没有及时读取缓冲区数据并且接收缓冲区由于系统资源突然变小发送端来不及调整会导致数据丢包现象这是因为先减少缓冲区再收缩窗口所以不允许同时减少缓冲又收缩窗口而先收缩窗口后一段时间再减少缓冲从而避免丢包 窗口关闭 窗口大小为0的情况就会阻止发送端发送数据直到大小变成非0如果接收端窗口变成非0会通过发送携带窗口大小的ACK报文如果ACK报文丢失发送端会一直等待造成死锁问题如何避免死锁问题当窗口关闭就会启动一个持续计时器如果超时就会发送一个窗口探测报文接收端收到这个报文就会返回一个携带当前窗口大小的ACK报文如果窗口依旧为0就会重启持续计时器 糊涂窗口综合症 接收端太忙会导致发送端的窗口越来越小到最后只有接收端腾出字节空间发送端就会马上发送但是TCP/IP包头就有40字节有数据就传输的话开销太大了导致的原因是 接收端告知小窗口大小发送端发送小数据 如何避免 接收方不告知小窗口窗口小于某个值就发送窗口为0的ACK阻止对端发送数据发送发避免发送小数据开启Nagle算法避免小包发送 Nagle算法思想延时处理满足下面一个条件即可 窗口大小MSS并且数据大小MSS收到前一个数据的ack报文 一般需要搭配 不通知小窗口给发送方开启Nagle算法才能避免糊涂窗口综合症
4、TCP拥塞控制 流量控制是为了避免发送端 数据填满 接收端的缓存但是流量控制并不知道网络中发送的情况 网络拥塞网络发生拥堵的时候继续发送大量数据包就可能导致数据包延时、丢失等情况TCP就会重传数据一旦重传就会导致网络更加拥堵从而不断恶性循环 拥塞控制避免发送方的数据填满整个网络并且为了调节发送数据的量定义了一个拥塞窗口(cwnd)的概念 拥塞窗口(cwnd)是发送方维护的一个状态变量会根据网络的拥塞程度进行变化滑动的发送窗口min(滑动的接收窗口拥塞窗口)当网络没有出现拥塞cwnd窗口就会越大当网络出现拥塞cwnd就会越小 如何判断网络拥塞发送方没有在指定时间接收到ACK应答报文也就是发送超时重传就会认为网络出现拥塞了 拥塞控制主要是四算法 慢启动(指数增长) TCP建立连接后一点点点提高数据包发送的数量发送端没收到一个ACK,拥塞窗口cwnd的大小就会1;存在一个慢启动门限ssthresh如果cwndssthresh使用的就是慢启动算法如果cwndssthresh就使用拥塞避免算法ssthresh一般大小为65535字节 拥塞避免 没收到一个ACKcwnd增加1/cwnd是为了确保cwnd的线性增长如果一直保持增长网络就会慢慢进入拥塞状态从而出现了丢包现象如果触发了重传机制就会进入拥塞发生算法 拥塞发送 发生重传(超时、快速)的时候就会进入拥塞发生算法超时重传的拥塞发生 ssthresh会设置为cwnd/2,并且cwnd会回复为初始值linux的初始值是10(10个MSS)设置完ssthresh和cwnd之后会重新开始慢启动这种方式下来的拥塞发生太激进了容易造成网络卡顿 快速重传的拥塞发生 设置cwnd为cwnd/2再设置ssthresh为cwnd设置完之后会进入快速回复算法 快速回复 当发生快速重传的时候表示网络不是太糟糕一般快速回复和快速重传同时使用进入快速回复前 cwnd和ssthresh都全部设置完了快速回复 cwnd ssthresh33表示接收到了三个数据包重传丢失的数据包;如果再收到重复的ACKcwnd就1如果收到的是新的ACK表示网络没问题了则将cwnd设置为ssthresh进入拥塞避免状态 拥塞控制算法过程 从TCP三次握手建立连接开始发送端开始慢启动没收到一个包的ACK拥塞窗口就会1如果达到阈值就会进入拥塞避免算法每收到一个包的ACK拥塞窗口就会增加窗口的倒数从而保证拥塞窗口的线性增加当遇到丢包的情况就判断为网络拥塞从而重复重传机制进入拥塞发送算法根据重传机制的不同拥塞发送算法也会不同超时重传sthreshcwnd/2,并且cwnd初始值重新重慢启动开始快速重传cwndcwnd/2ssthreshcwnd开启快速回复快速回复先是设置cwndssthresh3并重传丢失数据包如果依旧重复收到相同的ACK就会重复触发快速重传和快速回复如果收到的是新的数据包则进入拥塞避免状态。
参考文章小林coding