http协议

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/jsonapplicatipon/javascriptapplication/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层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妍思码匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值