HTTP协议解析
HTTP协议概述
HTTP协议的全称是超文本传输协议(Hyper Text Transfer Protocol,HTTP),是一个简单的请求-响应协议,运行在TCP之上,是应用层协议,可以实现客户端和服务端、或者服务端和服务端的通信
HTTP请求和响应报文
HTTP请求报文
-
请求行:请求方法+请求URL+http版本
-
请求头:
-
User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
-
Cookie:可能包含一些登录信息
-
Connection:keep-alive。我们一般会在request header 或 response header 中看到”Connection:Keep-Alive”或 “Connection:close”,这里具体的含义是有关http请求的是否保持长连接,即链接是否复用,每次请求是复用已建立好的请求,还是重新建立一个新的请求。
-
Content-Length:请求体的长度
-
Content-type(一般post请求会有这个字段,get请求如果带了请求体也会有这个字段),value值是请求体的格式,常用的几个multipart/form-data、application/x-www-form-urlencoded、application/json,对应的postman上选择body格式的时候,headers会有对应的变化:
- multipart/form-data(可以传文件)
- application/x-www-form-urlencoded
- application/json
- multipart/form-data(可以传文件)
-
Cache-control :是用来控制缓存的。当客户端发送的请求中包含 max-age 指令时,如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端可以接受缓存的资源;当指定 max-age 值为 0,那么缓存层通常需要将请求转发给应用集群。
-
另外,If-Modified-Since: 也是一个关于缓存的。也就是说,如果服务器的资源在某个时间之后更新了,那么客户端就应该下载最新的资源;如果没有更新,服务端会返回“304 Not Modified”的响应,那客户端就不用下载了,也会节省带宽(闪聘订单页面请求两次,第二次就会返回304)。
-
-
空行
它的作用是通过一个空行,告诉服务器请求头部到此为止。
- 请求体:
- GET请求:queryparam、rest参数(一般是包含在url中)
- POST请求:body,包含上面说的3种格式
HTTP响应报文
-
响应行
- 协议版本、状态码、状态码的描述
- 状态码
- 100,continue
- 200,OK
- 301,请求的资源被永久移动
- 302,资源临时移动
- 304,Not Modified,未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源,结合请求头里的if modified since
- 400,bad request,客户端的请求语法错误,服务器无法理解
- 403,Forbidden,服务器理解客户端的请求,但是拒绝执行
- 404,not found,找不到网页
- 500,Internal Server error,服务器内部错误,无法完成请求
- 502,bad gateway,作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
-
响应头
- Content-Length:这个是响应体的长度,单位是啥?(应该是字节)
- Content-Type:响应体的格式,有html,还有json
- Server:Nginx(闪聘web端返回的是)
- Connecttion:keep-alive
- Keep-Alive: timeout=10 有个超时时间,
-
响应体
- 服务端返回的数据
HTTP协议和TCP协议的联系
概述
- HTTP协议是基于TCP协议的,使用TCP协议来建立连接、传输数据和断开连接。
- HTTP协议定义了数据传输的格式和语义,而TCP协议提供了实际的传输通道。
- 当客户端向服务器发送请求时,TCP协议将请求消息分割成多个数据包进行传输,而HTTP协议则解析这些数据包并进行处理,最终返回响应消息。
当数据传输完成后,TCP协议通过四次挥手来断开连接,HTTP协议也随之结束。
详细介绍
-
HTTP最初的版本
- 当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。
- Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。
- 所以Http连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。
- 如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。
-
HTTP 1.1版本
随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次tcp连接就显得低效了。
因此Keep-Alive被提出用来解决效率低的问题。从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性。
- 简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
- 虽然这里使用TCP连接保持了一段时间,但是这个时间是有限范围的,到了时间点依然是会关闭的,所以我们还把其看做是每次连接完成后就会关闭。
- 后来,通过Session, Cookie等相关技术,也能保持一些用户的状态。但是还是每次都使用一个连接,依然是无状态连接。
以前有个概念很容易搞不清楚。就是为什么Http是无状态的短连接,而TCP是有状态的长连接?Http不是建立在TCP的基础上吗,为什么还能是短连接?现在明白了,Http就是在每次请求完成后就把TCP连接关了,所以是短连接。而我们直接通过Socket编程使用TCP协议的时候,因为我们自己可以通过代码区控制什么时候打开连接什么时候关闭连接,只要我们不通过代码把连接关闭,这个连接就会在客户端和服务端的进程中一直存在,相关状态数据会一直保存着。
参考文章
转载自:https://juejin.cn/post/7380513228046827556