TCP拥塞控制
目的:提高网络利用率,降低丢包率,保障网络资源对每条数据流的公平性
网络拥塞:在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,就会导致网络性能变差。
拥塞控制的最终受控变量:发送端向网络一次连续写入的数据量,称为SWND。(发送窗口)
TCP报文段的数据部分最大长度称为SMSS。
SWND限制了发送端能连续发送的TCP报文数量。
对于SWND的选择,如果过小则会造成明显的网络延迟,如果过大则容易造成网络拥塞。
SWND的值由接收方的接收告知窗口(RWND)和发送端的拥塞窗口(CWND)中的较小值所决定。
四种拥塞控制算法:
慢启动
慢启动:在TCP建立连接后,CWND将被初始化值为IW(2~4个SMSS),每次发送端收到一个接收端的确认,CWND就会增加 CWND+=min(N,SMSS)
N为此次确认中包含的之前未被确定的字节数。
这样 CWND就按指数形式扩大,此为慢启动。
使用慢启动的原因:TCP模块刚开始发送数据不知道网络的实际情况,就需要一种试探性的方式平滑的增加CWND的大小。
慢启动门限:ssthresh;当CWND超过该值时,TCP拥塞控制将进入拥塞避免阶段。
拥塞避免
拥塞避免:使得CWND按照线性方式增加,从而减缓其扩大。
两种实现方式:
注释:RTT(往返时延。是指数据从网络一端传到另一端所需的时间。通常,时延由发送时延、传播时延、排队时延、处理时延四个部分组成。)
①:在每个RTT时间内按照CWND+=min(N,SMSS) 计算新的CWND,不论该RTT时间内发送端收到了多少次确认
②:每收到一个对新数据的确认报文,就按 CWND+=SMSS*SMSS/CWND 来更新CWND。
以上为在发送端为检测到拥塞时采用的积极避免拥塞的方法。
发送端判断发送拥塞的依据:
- 传输超时,或者TCP重穿定时器溢出 (使用慢启动和拥塞避免)
- 接收到重复的确认报文段 (使用快重传和快恢复)
第一种情况,传输超时,将执行重传并调整ssthresh :
? ssthresh=max(FlightSize/2 , 2*SMSS )
? CWMD<=SMSS
FlightSize为已经发送但未收到确认的字节数。之后CWMD小于SMSS,也小于ssthresh,再次进入慢启动阶段
快重传和快恢复
很多时候,发送端会收到重复的确认报文段,可能是TCP报文段丢失或者接收端收到乱序的的TCP段并重排,此时拥塞控制需要进行判断网络是否真正发送了拥塞
具体判断方法:
发送端如果连续收到三个重复的确认报文段,认为拥塞发送,然后启动快重传和快恢复
1):当收到三个重复的确认报文时,重新计算ssthresh( ssthresh=max(FlightSize/2 , 2*SMSS ) ),然后立即重传丢失的报文,重新设置 CWND=sshthresh+3*SMSS
2):每收到一个重复的确认时,设置 CWND=CWND+SMSS ,此时发送端可以重新发送TCP报文段
3):当收到新的数据确认时,设置SWND=ssthresh,(ssthresh为第一步计算得到的新的慢启动门限值)
在快重传和快恢复完成后,拥塞控制进入拥塞避免阶段
附: HTTP的请求头 HTTP请求:
第一行为请求行,其请求头(9种)有一下几种:
请求方式 | 含义 |
---|
GET | 申请获取资源,不对服务器产生影响。 | POST | 客户端向服务器提交数据的方法,可能会对服务器产生影响,可能会创建新的资源或者更新已有资源 | HEAD | 和GET类似,但是需要服务器返回头部信息,而不需要传输任何内容 | PUT | 上传某个资源 | DELETE | 删除某个资源 | TRACE | 要求代理服务器返回原始HTTP请求的内容 | OPTIONS | 查看服务器对每个特点URL请求都支持那些请求方式,将URL设置为*可查看服务器支持的所有请求方式 | CONNECT | 用于某些代理服务器,将请求的连接转换为一个安全隧道 | PATCH | 对某个资源做部分修改 |
其中 GET/HEAD/OPTIONS/TRACE视为安全的方法,只获取资源信息,不对服务器进行修改。
|