一:什么是HTTP协议?

超文本传输协议 (HyperText Transfer Protocol),一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。 目的是保证客户端与服务器之间的高校通信。

二:工作原理

客户端(浏览器)向服务器提交 HTTP 请求,服务器向客户端返回响应信息。

具体步骤:

  1. 客户端和服务器建立连接(TCP三次握手);
  2. 客户端发送一个请求给服务器;
  3. 服务器返回相应的响应信息给客户端;
  4. 释放连接(TCP四次挥手);
  5. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上。

三:TCP连接

                                                    

nprogress 设置多次请求只调用一次_服务器

                                                                              TCP三次握手

过程:   

1.客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

2.服务器端收到SYN报文,回应一个SYN (SEQ=y),ACK(ACK=x+1)报文,进入SYN_RECV状态。

3.客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

  

为什么要三次握手?

一次握手:客户端无法确认是否能够和服务器正常通信,却一直发连接请求是毫无意义的。

两次握手:1.客户端发一条连接请求给服务器,由于网络阻塞,服务器未收到。

2.客户端等了一段时间,服务器仍未回应它,于是再次发出连接请求,服务器收到请求并进行确认,TCP连接建立,开始通信,通信结束后释放连接。客户端进入CLOSED状态。

3.此时服务端收到失效的连接请求,并向客户端确认,但客户端已关闭,服务端将会为连接请求分配资源并且一直等待下去,浪费了服务端连接资源。

四次握手:三次握手已经能够建立连接,期间服务器有一次确认连接请求的操作就已足够,没必要进行多次确认,对于资源来说是一种浪费。

四:释放TCP连接

                                                                 

nprogress 设置多次请求只调用一次_TCP_02

                                                                                       TCP四次挥手

过程:

1.数据发送完毕后,客户端发送释放连接请求(FIN=1,seq=u )并进入FIN-WAIT-1状态。

2.服务器收到释放连接请求,做出应答( ACK=1,seq=v,ack=u+1.),并进入CLOSE-WAIT状态。(此时客户端处于FIN-WAIT-2状态不发送只接收数据,此时仍在接收服务器传输的数据)

3.服务器发送完所有数据后发送释放连接请求(FIN=1,ACK=1,seq=w,ack=u+1),并进入LAST-ACK状态。

4.客户端收到释放连接请求后发送确认应答(ACK=1,seq=u+1,ack=w+1),并进入TIME-WAIT状态.该状态会持续2MSL时间(服务器收到应答会立即进入CLOSED状态),若该时间段内没有收到重发请求,就进入CLOSED状态。

 

A:为什么四次挥手?

建立连接时, 服务器收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而释放连接,服务器接收到客户端的FIN报文时,表示客户端不再发送但还能接收数据,此时服务器未必将全部数据都发送给了客户端,因此会先发送ACK报文进入CLOSE-WAIT状态,待发送完所有数据后,再发送FIN报文给客户端表示同意关闭连接(ACK和FIN一般都会分开发送),从而导致多了一次。

B:为什么客户端发完第四次挥手后需要持续2MSL时间后才会关闭?

如果客户端发完第四次挥手立即关闭:

第一,若最后一个ACK报文丢失,服务器收不到客户端的应答,会再次发送一个释放连接请求,而此时客户端已经关闭,服务器会一直等待并发送请求。

第二,若在此次连接中出现“已经失效的连接请求报文段”,下次建立的TCP连接中就会出现旧连接的请求报文(若客户端发送完第四次挥手后,在2MSL时间后关闭,此段时间内可以使本次连接内产生的所有报文段从网络中消失,下次建立的TCP连接中就不会出现旧连接的请求报文)。