简单描述HTTP连接建立流程
连接建立流程步骤如下:
![](https://img.haomeiwen.com/i4360127/84fd2150cff9f01e.png)
第1步:TCP通过三次握手建立双方连接;
第2步:客户端通过发送请求报文及请求数据给服务端;
第3步:服务端返回响应报文及响应数据给客户端;
第4步:TCP通过四次挥手进行断开连接。
TCP连接(三次握手)
TCP连接就是我们熟悉的三次握手过程
第一次握手:客户端通过标志位发送SYN = j 给服务端,表面客户端想要建立连接,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务端收到SYN标志后返回ACK =(j+1) 应答标志给客户端,同时自己也发送一个SYN包(syn=k),表面可以建立连接,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务端端SYN+ACK应答标志后回传ACK =(k+1)标志给服务端,说明自己已经收到了ACK标志,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
为什么会有三次握手而不是两次握手呢?
因为TCP有超时重连机制,
HTTP请求报文:
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
![](https://img.haomeiwen.com/i4360127/4c3dca8580da817a.png)
1.请求行
请求行分为三个部分:请求方法、请求地址和协议版本。
请求方法:HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。
请求地址:URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略(HTTP默认端口号是80)
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
2.请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
3.实体主体
实体主体即请求数据,不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应报文
HTTP响应也由三个部分组成,分别是:状态行、响应头部、响应正文(实体主体)。
![](https://img.haomeiwen.com/i4360127/230b2211f05aaa53.png)
其中,版本(HTTP-Version)表示服务器HTTP协议的版本;状态码(Status-Code)表示服务器发回的响应状态代码;短语(Reason-Phrase)表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
状态码对应的含义:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
响应头部与相应正文则与请求头部及请求数据向对应。
TCP关闭连接(四次挥手)
但服务端与客户端的数据传输完毕后,需要通知对方断开连接,就有了现在的四次挥手过程:
第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
为什么要四次分手
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
参考资料:一次完整的HTTP请求过程