您现在的位置是:首页 >技术杂谈 >net/http transport 参数讲解网站首页技术杂谈
net/http transport 参数讲解
从滑动窗口的角度出发,理解transport的参数。
环境:一个客户端(client),一个服务端(server),client向server发送请求。
1. MaxConnsPerHost:忙碌状态下,滑动窗口大小。(对每个Host的最大连接数)。
情况1:
参数值:MaxConnPerHost=5,总请求数=25,假设响应的顺序就是请求的顺序。
请求发送过程:先发送5个请求,剩下20个请求存储在等待队列中,当收到一个响应后,滑动窗口向前一步,从等待队列中取出一个请求并发送,再收到一个响应后,滑动窗口再向前一步,从等待队列中取出一个请求并发送,直到等待队列为空,发送完成。
连接情况:一共建立了5条连接,复用这5条连接发送数据(5=MaxConnPerHost)。
2. MaxIdleConnsPerHost:空闲状态下,滑动窗口大小。(空闲状态下,对每个Host的最大连接数)
情况2:
参数值:MaxIdleConnsPerHost = 3,假设响应的顺序就是请求的顺序。
前情提要:在情况1结束之后,等待队列已经空闲了10s,此时又有新的30个新的请求一起到达。
滑动窗口情况:由于等待队列空闲了10s,请求发送状态为空闲,所以滑动窗口大小从5(MaxConnPerHost)变成 3(MaxIdleConnsPerHost)。
请求发送过程:先发送3个请求,剩下的27个请求存储在等待队列中,当收到一个响应后,滑动窗口向前一步,从等待队列中取出一个请求并发送,再收到一个响应后,滑动窗口再向前一步,从等待队列中取出一个请求并发送。
滑动窗口情况:由于请求到达数量较多,请求发送状态为忙碌,所以滑动窗口大小从3(MaxIdleConnsPerHost)变成5(MaxConnPerHost)。
请求发送过程:由于滑动窗口增大2,所以立即从等待队列中取出2个请求并发送,然后继续等待响应到达,每到达一个新响应,滑动窗口向前一步,从等待队里中取出一个请求并发送。
连接情况:在滑动窗口大小从5变成3后,原来的5条连接中有2条被回收,只复用剩下的3条连接,在滑动窗口大小从3变成5后,建立两条新连接,复用这5条连接发送数据。
特别提醒:如果新的30个请求是串行缓慢的到达,比如每隔1s到达一个新请求,则请求发送状态仍为空闲,滑动窗口大小一直是3,不会建立两条新连接,只是复用之前的3条连接发送数据。
3. IdleConnTimeout:空闲连接的等待时间。
情况3:
参数值:IdleConnTimeout = 10s
前情提要:在情况1或者情况2之后,等待队列已经空闲了20s,也就是说5条连接已经空闲了20s,此时又有新的10个请求到来。
连接情况:由于IdleConnTimeout = 10s < 20s,所以旧的5条连接已经关闭,系统重新建立5条新连接。