1 tcp三次握手
它本质上,是客户端给服务器端发探测,服务器端给出响应;然后服务器端给客户端发探测,服务器端给响应;实际上是2个来回,共计4次。但服务器端给客户端的响应,以及服务器端给客户端的探测,合并成了一次进行,因此最后变成了3次。简称三次握手。
2 tcp和http请求的关系
http协议实际上是建立在tcp协议之上的。tcp代表一次物理连接。http请求背后,肯定有一个tcp连接,也就是一个http肯定对应一个tcp。但一个tcp连接是否在http请求结束后就直接释放了,也就是一个tcp是否对应一个http?不一定。
2.1 http1.0版本,一个tcp一个http
要是一个tcp只对应一个http,由于http是短连接,经常建立和释放,会导致tcp也频繁进行建立和释放。而tcp连接建立是很耗资源的,这会带来性能问题。这就是http1.0协议的做法。
2.2 http1.1版本,一个tcp多个http
现代浏览器,默认会在http请求头携带 Connection: keep-alive ,这样在http结束后,tcp并不断开和释放,而是持续存在直到配置的超时时间。除非你指定请求头:Connection: close,这样才会在http结束后,立即关闭tcp连接。这就是http1.1协议的做法。显然,此时一个tcp对应多个http。
正常情况下,多个http,是不能合并发送的,而是顺序进行。也就是一个http请求结束后,在同一个tcp连接上进行下一个http请求。
http1.1版本有提供pipeline,但浏览器大多数默认关闭。
它就是在管道中依次发送多个http请求。但不同的浏览器对其支持程度不一样,而且实现复杂,可能会出现问题。比如,pipelining的请求,也要求其响应的顺序和请求的顺序一样。如果多个请求之间响应速度不同,会导致pipelining中的响应出现短板效应。
浏览器对同一个host的tcp数量有限制,不同浏览器设置不一样。
2.3 http2的Multiplexing技术
http2建立在https基础上,支持一个tcp多个http并发进行。