网络:HTTP详解
HTTP超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如”HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其它信息。
一、工作原理
客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
具体步骤如下:
客户端发送请求
客户端根据域名、请求方法、URL、请求数据构建请求报文
客户端和服务端建立HTTP连接
HTTP是基于TCP传输层协议,建立连接采用三次握手
服务器返回结果
服务器返回状态码、提示语、响应数据构成的响应报文
客户端和服务器断开连接
四次挥手断开连接
二、特点
基于 请求-响应 的模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应
无状态保存
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
但是现在的
HTTP/1.1
版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒
三、请求报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。
请求报文
响应报文
下面逐个介绍报文中的各个部分~
协议版本参考:github
四、请求方法
GET
:get方法一般用于获取服务器资源。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作POST
:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有PUT
:向指定资源位置上传其最新内容DELETE
:请求服务器删除Request-URI所标识的资源HEAD
:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)OPTIONS
:options方法用于询问请求URI资源支持的方法TRACE
:回显服务器收到的请求,主要用于测试或诊断CONNECT
:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)
经典面试题:GET和POST的区别
- GET方法的请求没吃得到的结果都是幂等的,也就是每次都是一样的,而POST是不一定的
- GET请求会被浏览器主动cache,而POST不会,除非手动设置
- GET请求只能进行URL编码,而POST支持多种编码方式
- GET请求在URL中传送的参数是有长度限制(浏览器的限制)的,而POST没有
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
五、状态码
状态代码的第一个数字代表当前响应的类型
常见的状态码:
- 100:请求成功,还有后续操作
- 101:协议切换,比如HTTP升级为WS
- 200:请求成功
- 204:请求成功,但是没有实体内容
- 206:分块请求成功
- 301:永久重定向
- 302:临时重定向
- 304:资源未更改,缓存有效
- 400:请求失败,请求参数或语义有误
- 401:认证失败
- 404:资源不存在
- 405:请求方法错误
- 500:服务器遇到了不知道如何处理的情况。
详细状态码请查看:MDN HTTP状态码
六、头部字段
头部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容。
头部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。
首部字段根据实际用途被分为以下4种类型:
- 通用头部字段: 请求报文和响应报文两方都会使用的首部
- 请求头部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
- 响应头部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
- 实体头部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息。
常见头部字段:
- 通用头部字段
- Cache-Control:操作缓存的工作机制
- Connection:管理持久连接
- Date:表明创建 HTTP 报文的日期和时间
- Upgrade:用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信
- 请求头部字段
- Accept:用户代理可处理的媒体类型
- Accept-Charset:优先的字符集
- Accept-Encoding:优先的字符编码
- Accept-Language: 优先的语言
- Authorization:Web认证信息
- If-Modified-Since:比较资源的更新时间
- If-None-Match:比较实体标记
- Referer:对请求中 URI 的原始获取方
- User-Agent:HTTP 客户端程序的信息
- 响应头部字段
- ETag:资源的匹配信息
- Location:令客户端重定向至指定 URI
- 实体头部字段
- Allow:资源可支持的 HTTP 方法
- Content-Encoding:实体主体适用的编码方式
- Content-Language:实体主体的自然语言
- Content-Length:实体主体的大小(单位:字节)
- Content-Type:实体主体的媒体类型
- Expires:实体主体过期的日期时间
- Last-Modified:资源的最后修改日期时间
详细头部字段请查看:MDN HTTP头部字段
参考文章: