TCP 的三次握手

原因

HTTP 是建立在 TCP 基础之上的应用层协议,因此要想发送一条HTTP请求,TCP 必须先要建立连接。

TCP 为什么要经过三次握手(通信)才能建立连接?原因很简单,因为最少要三次通信,客户端和服务器才能都知道连接是否建立成功。试想如果 TCP 连接只进行两次握手,比如客户端发起请求,服务器响应请求后就结束,这回导致服务器无法知道响应是否发送成功,因为可能由于网络问题,服务器已经发送请求,但是客户端没有接收到。通常情况下客户端会有个超时限制,即如果迟迟没有响应就会关闭连接,然后发起新的连接,但是服务器还在那傻傻的等待。而三次握手可以确保双方知道TCP连接是否建立成功

过程

上图已经基本说明了连接的建立过程,首先客户端会发送一个SYN(标志位)和 Seq(x是一个的数字),然后服务端会返回一个SYN、ACK(等于客户端Sep + 1)和Sep(y是一个的数字),最后客户端再发送ACK(等于服务端Sep + 1)和Seq。完成上面三步后表示TCP连接建立成功,然后就可以发送HTTP请求了

HTTP

对于从事web开发的人员,肯定都知道HTTP协议,现在广泛使用的是HTTP1.1版本。HTTP是一种无状态协议,因为TCP的建立的连接不是永久的,当HTTP请求结束后,客户端和服务端就会商量是否断开连接。如果报文头部的Connectionkeep-alive,就会根据服务器(如Nginx)设置的timeout来确定连接的保持时间;如果是close,会立即关闭连接。

对于现代浏览器,如Chrome,出于性能考虑,它一次性最多只能建立6个TCP连接(),因此一次最多并行发送6个HTTP请求,后面的请求要等到6个请求结束才能发送。通常情况下报文头部的Connection值是keep-alive,这样可以让后面的请求复用前面的TCP连接,省去了三次握手的时间消耗,下面是打开我的博客首页的截图:

图中Connection id(最后一行的数字)表示的就是TCP连接id,首次打开页面时浏览器会一次性创建6个TCP连接,id相同的表示复用的同一个TCP。需要注意的是当不同域名时,一定会建立新的连接

HTTP2

HTTP1.1中,一个TCP连接只能发送一个请求,如果请求很多必然会消耗更多的时间。在HTTP2中,可以只建立一个TCP连接,并发多个HTTP请求,这将会对加载速度有质的提升,而且数据的传输采用的二进制形式,这么做可以减少数据传输过程中带宽的占用,相比于1.1中字符串的形式,http2数据到达时间要快很多

posted @ 2018-12-23 19:43:12 浏览(865) HTTP

avatar