1,概念
HTTP-超文本传输协议。因特网上应用最广泛的一种网络传输协议,用来传输超文本。
超文本 - HTML是超文本标记语言,而HTTP用来传输超文本(文本、图片、音频、视频、链接等等混合体)
传输 - HTTP主要用于互联网两个点之间的数据传输。这个传输是双向的、多段的(中间会有其他的点衔接)
协议 - HTTP是确定计算机之间交流通信、控制、错误处理的规范
2,特点
- 灵活可扩展 - HTTP早期的设计较简单,但在不断的升级更新,因而他的扩展性特别好
- 可靠传输 - HTTP是基于TCP/IP协议的,因此他也继承了可靠性,保证数据的完整传输
- 应用层协议 - HTTP是基于应用层,且功能非常丰富
- 请求/应答模式 - HTTP使用的是请求、应答的模式,因此双方一定是先发起请求和链接,然后再进行数据传输
- 无状态 - 指客户端和服务器不会对本次链接进行记录,下次再链接还需要重新进行
3,报文结构
HTTP请求报文和响应报文的结构大致相同:
请求报文 | 响应报文 |
起始行 - 请求行 组成:请求方法 + 请求目标URL + 协议/版本 示例:GET /hello.txt HTTP/1.1 | 起始行 - 响应行 组成:协议/版本 + 状态码 + 原因 示例:HTTP/1.1 200 OK |
报文头 - 请求头 组成:key-value形式 示例:HOST: localhost:8080 | 报文头 - 响应头 组成:key-value形式 示例:Content-Length: 155 |
空行 | |
消息正文 - 请求数据 示例:传输的数据,可以是文本、图片等 | 消息正文 - 响应数据 示例:响应体body,例如JSON对象、html等 |
注意:
- 报文必须有header,但可以没有body
- 报文header后面必须有一个空行
4,常用头部字段
4.1 请求头常用
客户端向服务器发送的请求报文中使用的字段。
- Host(必传) - 请求的主机(eg:HOST: localhost:8080)
- Referer - 请求中URI的原始获取方(eg:Referer: http://localhost:8080/)
- User-Agent - 客户端的程序信息(eg:User-Agent: Mozilla/5.0 (Win64; x64)... )
- Accept - 用户代理可处理的媒体类型(eg:Accept: application/json, text/plain, */*)
- Accept-Charset - 优先字符集
- Accept-Encoding:优先的内容编码(eg:Accept-Encoding: gzip, deflate, br)
- Accept-Language:优先的语言(参数值参考语言标识符)
- Authorization:web认证信息(允许客户端在访问受保护资源时提供身份验证信息,以验证其身份并获得授权)
常见的属性:Basic-用户名和密码编码成base64,然后服务器进行解析;
Token-通用的令牌身份雁阵机制
Bearer-用于OAuth2.0授权框架中的身份验证机制
- TE - 客户端能够处理响应传输方式的编码优先级(eg:TE: gzip, deflate;q=0.5)
4.2 响应头常用
服务器向客户端响应报文中所使用的字段。
- Server - 当前服务器上http服务器的信息(eg:Server: Apache/2.2.17 (Unix))
- Accept-Ranges - 是否允许客户端只请求资源的一部分(eg:Accept-Ranges: none | bytes)
- Age - 指代理服务器或缓存资源存在的时长是多久(eg:Age: 600 // 这个缓存存在了10分钟)
- Location - 客户端要重定向的目标URL
- WWW-Authenticate - 用于需要客户端认证的时候,返回认证要求
- --- 响应实体相关 ---
- Allow - 服务器可支持的方法(也可以是自定义的方法)(eg:Allow: GET, POST PUT)
- Content-Encoding - 响应实体内容的编码方式。常见的编码类型有:gzip、deflate、br、identity
- Content-Language - 响应实体中的语言集
- Content-Length - 实体内容内容的大小(单位:字节)
- Content-Location - 提供资源实际位置的URL(eg:Content-Location: www.baidu.com)
- Content-type - 指定传输消息实体的媒体/MIME类型
- Expires - 告知客户端缓存资源的过期时间(eg:Expires: Tue 28, Jul 2023 19:34:26 GMT)
- Last-Modified - 服务器资源的最后修改时间
4.3 通用头常用
请求头、响应头报文中都可以使用的字段。
- Cache-control - 控制缓存行为(参数值参考浏览器缓存篇)
- Connection - 管理持久化连接。
HTTP旧版本 - 默认不持久化连接,设置Connection: Keep-Alive来保持持久化连接;
HTTP1.1版本 - 默认持久化连接,设置Connection: close来断开连接。
- Date - 创建报文的日期时间
- Upgrade - 检测HTTP和其他协议是否可使用更高的版本进行通信
- Warning - 错误通知
4.4 常用的内容类型
无论是请求头参数Accept,还是实体头参数Content-type,都是规定了内容的类型,常见的有:
- text文本类型:text/html、text/plain(纯文本类型)、text/xml、text/css等
- image图像文件类型:image/jpeg、image/gif、image/png等
- audio/video音频/视频文件类型:audio/mpeg、video/mp4等
- application其他不固定的数据类型:application/json、applicatipon/javascript、application/pdf等
- 数据体积大时,设置的压缩格式:gzip、deflate、br等
对于其详细的头部字段可参考网站
5,请求方法
HTTP1.0只定义了3种请求方法:get、post和head
HTTP1.1新增了5中请求方法:put、delete、options、patch、trace、connect
- get - 从服务器获取数据、或者下载资源
- head - 类似于get请求,只是响应的数据只有响应头
- post - 向服务器提交数据、表单、或者上传文件
- put - 类似于post,通常用来做业务的修改数据
- delete - 请求服务器删除资源
- options - 客户端检测服务器是否支持该请求
- patch - 对put方法的补充。对已知资源进行局部更新
- trace - 回显服务器接收的请求,可以用来测试或诊断
- connect - HTTP1.1预留的,能够将连接改成管道形式的代理服务器
get和post方法的区别:
- 功能上。get主要用来获取数据和静态资源,post主要用来提交数据,和服务器进行交互
- 缓存。get请求会被浏览器主动缓存,而post不会,除非手动设置(例如某些get请求是用来获取css、image等资源的,不需要喝服务器交互,就可以缓存到本地)
- 安全。post请求比get更为安全,因为get请求的参数直接暴露在url上,所以get不适合用来传递敏感信息
- 参数位置。get请求的参数拼接在url上,而post请求存在request body上
- 参数长度限制。get请求在url中的参数长度有限制,而post没有
- 参数类型。get请求参数只能传递字符串,而post可以支持图片、视频、音频、文档等多中类型
- 浏览器刷新与回退影响。get在浏览器刷新或回退时没影响,而post会再次提交
- 数据包。get请求只会发送一个数据包,而post部分情况下会发送两个数据包
(get在请求时是将header和data一次性发送;
post部分情况下会先发送一个带有header信息的包,服务器确认接收能力后响
应100,然后客户端接收到100后再次发送data数据包)
6,状态码
- 1xx - 提示信息。当前服务器已收到请求,提示用户继续执行操作
- 100(Continue)- 继续。客户端应该继续他的执行请求
- 101(Switching Protocols)- 切换协议。服务器根据客户端的请求切换协议(只能切换为更高级的协议,例如http1.0到http1.1)
- 2xx - 成功。已成功接收报文,且正确处理
- 200(OK)- 请求成功。一切正常
- 201(Created)- 已创建。成功请求并创建了新的资源
- 202(Accepted)- 已接受。已经接收请求,但并未处理完成
- 204(No Content)- 无内容。与200类似,服务器起成功处理,但没有返回内容体body
- 206(Partial Content)- 部分内容。服务器只成功处理了一部分内容,并不是全部(是HTTP断点续传的基础)
- 3xx - 重定向。资源位置发生改变,需要重新请求
- 301(Moved Permanently)- 永久重定向。资源被永久转移到其他URL,返回信息会包含新的URL,浏览器重新定向到新URL
- 302(Found)- 临时重定向。类似于301,只是资源是临时移动,客户端暂时使用新的URL
- 303(See Other)- 查看其他地址。与301类似,可使用get或post请求查看
- 304(Not Modified)- 未修改。服务器不会返回任何信息,客户端访问缓存的资源
- 305(Use Proxy)- 使用代理。请求的资源必须通过代理来访问
- 4xx - 客户端错误。客户端请求的报文语法错误或无法完成请求,服务器无法处理
- 400(Bad Request)- 请求报文语法错误。服务器无法理解
- 401(Unauthorized)- 要认证身份。请求要求客户端身份认证
- 403(Forbidden)- 禁止访问。服务器可以理解请求,但是拒绝访问此资源
- 404(Not Found)- 找不到。服务器上找不到此资源
- 405(Mthod Not Allowed)- 方法错误。请求的方法错误,比如get请求使用的post
- 408(Request Time-out)- 请求超时。服务器等待客户端请求发送的时间超时
- 410(Gone)- 资源永久删除。不同于404,客户端请求的资源已经被永久删除
- 411(Length Required)- 未携带Content-Length。服务器无法处理客户端不带Content-Length的信息的请求
- 413(Request Entity Too Large)- 请求实体过大。客户端请求的实体过大,服务器无法处理,因此拒绝请求,并关闭链接
- 414(Request-URI Too Large)- URL过长。请求的URL过长,服务器无法处理
- 5xx - 服务器错误。服务器在处理请求时内部发生错误
- 500(Internal Server Error)- 通用的服务器内部错误,但具体原因未知
- 501(Not Implemented)- 不支持功能。服务器不支持请求的功能
- 502(Bad Gateway)- 远程请求错误。服务器自身工作正常,但请求远程服务器时发生错误,收到了一个无效的响应
- 503(Service Unavailable)- 服务器正忙。服务器超载或系统维护,暂时无法处理响应,需要延迟一段时间后再来访问(延迟的时间可以在Retry-After头信息中返回)
- 504(Gateway Time-out)- 远程请求超时。服务器请求远程服务器时,未及时收到远程服务器的响应,发生超时
- 505(HTTP Version not supported)- 不支持的协议版本。服务器不支持当前协议的版本,无法完成处理
对于详细的状态码可以参考网站
7,https协议
7.1 概念
因为http是不安全的,所以使用https协议来完成安全的http请求
7.2 原理
https是通过http进行数据传输,且通过SSL/TLS来加密数据包。https的主要目的是提供对服务器的身份认证,保护数据的私密性和完整性。
https的信任是基于预先安装在操作系统中的证书颁发机构(CA)
SSL:安全套接层,处于OSI模型的会话层
TLS:由记录、握手、警告等多个子协议组成,综合使用了对称与非对称加密、身份认证等技术
数字证书和证书颁发机构CA:
通过摘要、加密、数字签名等复杂的算法,就可以保证数据通信的足够安全;而数字证书是通过证书颁发机构将公钥、颁发者、序列号等进行打包,这样可以避免误信任黑客给的假证书。这样就可以完成安全通信了。
7.3 与http的区别
相同点:
- 二者都采用了请求-应答模式
- 二者的报文结构、请求方法、链接管理都相同
不同点:
- 二者的协议名和端口号不同,分别是http、80端口;https、443端口
- http协议下层紧挨着TCP层;而https协议,他的http下层紧挨着SSL/TLS,然后才是TCP层