Pulpcode

捕获,搅碎,拼接,吞咽

0%

http的两个超时时间

超时时间

如果你使用http库来进行http请求时,你会发现可以设置超时时间。
比如python最好用的requests库,或者是tornado自带的异步http客户端。都有一个可选参数叫timeout。实际上如果你不设置这个值,那它默认就是20s,我不知道其它语言是怎样的,但是在python中,几个http库都是这个默认值。

但是如果你看了这些http库的源码就会发现,这个timeout,被分别赋值给两个参数,connect_timeout和read_timeout(或者说叫request timeout)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"""HTTP client request object."""

# Default values for HTTPRequest parameters.
# Merged with the values on the request object by AsyncHTTPClient
# implementations.
_DEFAULTS = dict(
connect_timeout=20.0,
request_timeout=20.0,
follow_redirects=True,
max_redirects=5,
decompress_response=True,
proxy_password='',
allow_nonstandard_methods=False,
validate_cert=True)

连接超时和请求超时

这个request_timeout很好理解,就是建立连接后如果指定时间内服务器没有返回数据的后超时时间,也就是说如果你这个请求一共要花费20秒,但是你的timeout设置为10秒,那么这个请求就会在10秒中的时候就会断开,并抛出 ReadTimeout异常,实际上我们经常讨论的设置超时时间,也就是指这个时间。

那么什么是connection timeout呢?它就是请求服务器建立连接的超时时间,实际上你在socket编程的时候,常常会设置这个时间,这个时间也就是所谓TCP“三次握手”所花费的时间。

三次握手

这个是大学背过的内容了,比如两台主机通信,主机a发送SYN去主机b,主机b接收后再发送SYN-ACK信息回主机a表示收到syn并确认,然后主机a收到后发ACK回主机b表示收到确认信息。这样双方就建立了链接,可以开始通信了。

为什么三次

先讲一个“错误”的笑话吧:

“我能给你讲个关于tcp的笑话吗?”,“行,给我讲个tcp的笑话”,“好吧,那我就给你讲个tcp的笑话。”。

这个笑话看上去是在描述tcp的三次握手,但实际上完全没有描述出第三次握手的原因,看上去第三次握手完全没有意义。感觉这个笑话像是在讽刺tcp本身,但是却又没喷到点子上。

很多人说三次是最精简的建立连接的方式,保证双方都是可通信状态,那么保证可通信两次就完全就够用了,一问以答,不就是你也可以我也可以么。(看上面的笑话就知道了)。

之所以要第三次握手在《计算机网络》这本书上已经讲了,就是防止已经失效的连接请求,被服务器当成有效的连接请求进行处理。这是因为网络通信可能会滞留,很有可能一个链接请求在都已经被客户端放弃之后,经过漫长的“旅行”终于到达了服务器端。而服务此时处理这个连接请求就是占资源,浪费时间。所以才要客户端发送第三次握手给服务器,确认这次请求还有效。这很像我们在聊微信的时候,很多人会说:“才看到,你还在吗?”。所以这个笑话,应该这么讲:

“我给你讲个tcp笑话,你听么?”,“恩,我听,你还准备讲么?”,“是的,我要准备讲tcp的笑话了。”

实用性

扯了些tcp的知识,那么回到标题,理解这两个超时时间对我的“实用性”是什么呢?

首先如果你请求一个接口,它报连接超时了,那在建立连接的时候就出现了问题,那很可能是网络堵塞。

但是如果是readtimeout,那么我们可以去看对方服务的负载,看是请求量高服务器处理不过来,如果不是再看看是不是单次请求本身花费的时间就已经太长了。然后再针对不同的问题分别考虑。