HTTP的三次握手

 

在讲三次握手之前,希望大家理解一个概念,什么概念呢?
就是在我们的客户端和我们的服务器之间进行http请求,发送和返回的过程当中,我们是需要去创建一个tcp connection的东西,因为http是不存在连接这么一个概念的,它只有一个请求和响应这么一个概念,那么请求和响应都是一个数据包,它们之间是需要一个传输的通道的,那么这个传输的通道在哪里呢?就在tcp里面,去创建了这么一个从客户端发起,服务端接收的这么一个连接,这个连接呢,是可以一直保持在那边,然后我们的http请求是在连接这个基础上面去发送的,那这里就有一个概念,就是在tcp连接上面,是可以发送多个http请求的,在不同的版本里面,这个模式是不一样的

 

在http/1.0里面,这个连接是在http请求创建的时候,就去创建这个tcp连接,然后连接创建完之后,然后请求发送过去,然后服务器响应之后呢,这个tcp连接它就关闭了
然后在http/1.1里面,这个连接我们可以通过某种方式去申明这个连接可以一直保持在那边,然后保持在那边是什么意思呢?就是我们这个请求,第一个请求发送之后,这个连接没有关,然后第二个请求进来的时候,它还可以在这个连接上面进行发送,这有什么好处呢?就是因为tcp连接,我们这节课要讲的,在创建过程当中,是有三次握手这么一个消耗的,三次握手就是代表着有三次网络传输,客户端发送一次,然后服务端返回一次,然后客户端再发送一次,这个时候才创建了tcp连接,然后才能去发送http请求,所以如果把连接一直保持在那边,那么第二个http请求就没有三次握手的开销
在http2里面还有一个好处就是,http2里面tcp连接上面的http请求是可以并发的,这就导致什么呢,就是说我们同一个用户对同一个服务器发起一个网页请求的时候,它只需要一个tcp连接,那么具体什么含义呢,我们后期课程会详细的讲,现在要清楚tcp连接和http请求之间的关系


 

 

在http的三次握手当中,首先客户端发起一个我要发送一个数据包的请求,发送到服务端,这里面呢会有一个标志SYN=1,Seq=X,syn是一个标识,就是我这是一个创建请求的数据包,然后seq等于一个数字,一般来说都是1,然后服务端接收之后,知道了我有一个客户要跟我创建连接了,那创建这个连接之后呢,服务端就会开启一个tcp,socket的一个端口,然后这个端口开启了之后,它返回给客户端,它返回的数据里面也是一个SYN=1,ACK=X+1,Seq=Y,然后它会返回一个ACK,ACK就等于第一次发送过来的Seq,就是X,然后+1,然后它再发送一个Seq,这个是服务器端的一个Seq,然后客户端拿到之后,服务端允许我们打开创建这个连接,然后客户端再去发送它的ACK=Y+1,Seq=Z,它再发送一个Seq,等于一个新的数字Z,这就是tcp去创建的一个过程

 

为什么要进行这样一个三次握手呢,这是为了防止服务端这边开启一些无用的连接,因为我们知道网络传输是有延迟的,因为我们之间可能隔着非常远的距离,要通过一个光纤,然后各种中间的代理服务器来进行一个传输,在传输的过程当中,比如客户端发送一个SYN=1,创建连接的请求,如果服务端就直接创建了这个连接,然后返回内容给客户端,但是这个数据包因为网络传输的原因,它丢了,丢了以后,客户端就一直没有接收到服务器返回到这个东西,然后客户端可能设置了一个超时时间,关闭了,关闭了之后才发现一个新的创建连接的请求,这个时候服务端是不知道的,如果没有第三次握手,服务端根本不知道客户端有没有接收到我返回到信息,并且没有说要去创建还是关闭这个请求,服务端就开在那边,等着客户端发送实际到请求数据,那么这个时候服务端这个开销就浪费了,因为它不知道这个连接已经创建失败了,可能客户端已经创建新到连接去了,所以呢,我们需要三次握手,让客户端和服务端察觉到我们因为网络原因端一些问题导致数据没有查到,这个端口,这个连接已经关闭了,我们需要一直等在那边的情况,三次握手主要是规避网络传输当中延迟而导致服务器开销的一些问题

 

接下来看下三次握手数据包的相信内容,Wireshark抓包工具

13789是本机的一个端口,80是服务器端的一个端口,因为有三次握手,客户端和服务器之间有三个来回,只要找到同一个端口的来回,就可以找到这三次握手

如图,这三次是完整的三次握手的过程,第一次握手可以看到发送了一个SYN标示位,为了简单演示,说SYN=1,其实,就是SYN占据了第一个标识位,用图片只是为了更形象的展示这三个过程,返回的时候是一个SYN,再加上一个ACK。最后客户端再发送一个ACK给服务端,作为第一个标识位,这样一个过程就完成了一个三次握手

posted @ 2018-11-26 06:54  wzndkj  阅读(7244)  评论(0编辑  收藏  举报