1. HTTP简介
HTTP是应用层协议的一种,超文本传输协议。
2. HTTP传输模型

3. HTTP协议栈中各层数据流
首先我们看看客户端请求的时候,数据在各层协议的数据组织如下图:

而服务器解析客户机请求就是反向操作的过程,如下图:

4. HTTP请求报文

5. HTTP响应

、
6. HTTP 的建立连接过程,由于它是基于TCP协议的,只有TCP连接完成,它才可以进行数据传输,TCP的协议就是HTPP 的建立连接过程:

6.1 为什么要三次握手?
防止客户端是失效的连接请求到达服务器导致网络错乱问题:例如客户端向服务器请求连接,由于网络缓慢问题导致该请求滞留在某个路由节点,这是客户端做了超时处理,但是此时该请求到了服务端,服务端还是认为客户端需要进行连接,那么它会将客户端发送确认连接响应,并且进如SYN_RECEV状态,由于客户端一直没有回复确认连接,服务器会一直处于等待状态,从而导致了资源浪费。
7. HTTP请求报文

请求报文包括请求头、请求头、请求数据
7.1 请求头
请求方法
HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。
最常的两种GET和POST,如果是RESTful接口的话一般会用到GET、POST、DELETE、PUT。
请求地址
URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有时可以省略(HTTP默认端口号是80)
7.2 请求头

7.3 请求数据 可选部分,比如GET请求就没有。
8. HTTP响应报文

响应报文包括: 状态行(状态码 协议版本 状态吗描述信息)、响应头部、响应数据
8.1 状态行
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
8.2 响应头部

8.3 响应数据 可选部分
9. HTTP 断开

9.1 为什么TCP不是3次分手
假如client在收到server的FIN请求段后直接close,那么服务器会做超时处理重发FIN数据段,这是client回复的不是ACK=1,ack=seq(server的序列号)+1, 而是给server回复了RST=1数据段,那么server认为是数据错误,从而向上层报错,但是这样的跟TCP是可靠连接的概念是相悖的,所以在收到server端的FIN数据段后自己也要回复ACK确认数据段,并且进入TIME_WAIT状态等待2MSL后如果没有消息就进入close 状态。
网友评论