【2.1】HTTP协议

【零】引入

【1】哪些可以充当客户端

  • 自己写的python代码(TCP客户端)
  • 别人写的浏览器

cs架构与bs架构

bs本质也是cs

【2】问题

  • 我们自己写的TCP服务端与浏览器之间通信了 但是浏览器不识别服务端数据

【3】HTTP协议的起源

  • 不同的服务端数据的组织策略千差万别,但是浏览器却需要做到能够统一处理

  • 最佳的解决措施是统一规定一个标准>>>:HTTP协议

【4】什么是HTTP协议

  • 规定了服务端与浏览器之间的数据交互格式及其他事项

  • 如果服务端遵循HTTP协议 就可以被浏览器正常访问并展示内容

  • 如果服务端不遵循HTTP协议 浏览器就不会正常访问和展示 但是不影响服务端

  • 如果这个应用特别火爆 那么完全可以让用户下载专属的客户端(app)

【一】HTTP协议

【1】什么是HTTP协议

  • HTTP协议(HyperText Transfer Protocol,超文本传输协议)
    • 由蒂姆·伯纳斯-李于1989年为了推广互联网技术而推出的一种无状态网络应用协议
  • HTTP协议构建于TCP/IP协议族之上
    • 属于应用层协议
  • 主要用于传输与超文本相关的资源文件
    • 如HTML网页,css,js,图片,视频,音频等。

1

  • 现行的HTTP协议基于数据是否加密,主要分两种。

img

  • 直接构建于TCP协议之上
    • 没有进行加密传输数据的是HTTP协议
    • 默认通信端口是80端口
    • 常用端口有:3000,5000,8000,8080等。
  • 构建于TLS或SSL协议之上
    • 对数据使用SSL加壳加密传输数据的是HTTPS协议
    • 默认通信端口是443端口
    • 常用端口8443。
注意:在本地电脑上双击html网页也可以通过浏览器来查看HTML网页信息,但是这种方式是采用file协议来访问的。
file协议叫本地文件浏览器协议,顾名思义,是只能访问本地电脑中的路径文件,用户无法通过file协议访问另一台电脑中的文件。

除了http或https协议可以提供html等资源的浏览服务以外,还有ws或wss也可以用于在浏览器中提供网页服务,但是ws或wss一般用于web网络即时通信比较多。

【2】HTTP协议的特点

  • http协议具有无状态、无事务、所有请求必有所回应的特点。

(1)基于请求、响应

  • 服务端永远不会主动给客户端发消息 必须是客户端先请求服务端被动响应
  • http协议是基于客户端请求,服务端响应模型来实现的。
  • 所以一般而言对于http协议通信的双方来说,发起请求的一方只能是客户端,而响应数据的一方只能是服务端。

(2)基于TCP/IP作用于应用层之上的协议

  • 应用层协议:HTTP HTTPS FTP ...

(3)无状态

  • 服务端不保存客户端状态(纵使见她千百遍 我都当她如初见)
  • 所谓的无状态是指http协议默认情况下,服务端不识别客户端的。
  • 在客户端多次发起请求到同一个服务器,服务端接收到客户端的请求在处理完成以后就会主动断开。
  • 所以对于客户端的每一次请求,对于服务端来说,都是一次新的客户端请求。
  • 也就是说,服务端无法区分多次请求的客户端是否同一个客户端

(4)短连接

  • 不保持客户端与服务端之间的链接导通

补充:websocket(长连接) 主要用于加好友聊天等业务

【3】请求格式和 响应格式

(1)请求格式

  • 客户端给服务端发送消息应该遵循的数据格式
    • 1.请求首行(请求方法 协议版本)
    • 2.请求头(一大堆k:v键值对)
    • 3.(换行不能省略)
    • 4.请求体(携带敏感数据:密码 身份照号...) 不是一直都有

(2) 响应格式

  • 服务端给客户端发送消息应该遵循的数据格式
    • 1.响应首行(响应状态码 协议版本)
    • 2.响应头(一大堆k:v键值对)
    • 3.(换行不能省略)
    • 4.响应体(给浏览器展示给用户看的页面内容)

【二】请求响应模型

  • HTTP协议永远都是客户端发起请求,服务器回送响应。

2

【1】请求报文格式

  • 对于客户端的http请求格式一般分三部分组成
    • 分别是请求行、请求头、请求体(部分请求方法不具有请求体)。

3

  • 一般如下:
请求方法  请求路径  http协议版本                   <---- http响应的一行内容,也叫请求行
请求头选项1: 选项值
请求头选项2: 选项值
....
请求头选项n: 选项值

请求体(可以有多行,前后必有空行)

  • 我们可以借助telnet工具对远程的web服务器发起http或https请求。
  • telnet默认是关闭的。所以需要手动打开。

image-20220701093704966

  • 例如,发起http请求访问,基本的http请求格式如下:
GET  /get  HTTP/1.1
Host: httpbin.org
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36

【2】发送GET请求

telnet httpbin.org 80

GET  /get  HTTP/1.1
Host: httpbin.org
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36


  • 请求效果如下:

4

【3】发送POST请求

  • 发送POST请求,并发送json数据格式。
POST /post HTTP/1.1
Host: httpbin.org
Content-Type: application/json
Content-Length: 44

{"name": "xiaoming", "age": 16,"pwd": "123"}
  • 也可以通过安装测试工具,如postmanApifox,来查看并学习http协议的请求与响应格式。

image-20220701101136715

【4】响应报文格式

  • 上面看到的内容实际上就是远程http服务器通过http通信返回的响应报文。格式如下:
协议版本 响应状态码 响应文本提示                               <-----  http响应的第一行内容,响应行
响应头选项1: 选项值
响应头选项2: 选项值
....
响应头选项n: 选项值

响应体(服务端返回的正文信息,前后必有空行)

【三】协议报文详解

  • 前面我们提到,http协议是应用层协议,是基于tcp协议。
  • 在前面的网络编程曾经学习过tcp协议的通信是可靠安全的
    • 所以实际上来说,因为http协议是基于TCP协议来传输数据的,所以http协议就具有了有所请求必有所回应的特点,也因此我们可以说,http协议一次通信的最基本的流程都是具有请求报文与响应报文的。
  • 请求报文与响应报文就组成http协议的通信内容(HTTP报文)。
    • 不管是请求报文还是响应报文在上面的发送请求与查看服务器响应报文
    • 我们都可以看到,实际上HTTP报文就是一段连续的多行的文本

【1】HTTP请求流程

5

【2】请求报文

  • 请求报文(HTTP Rquest)主要通过客户端发送用于表达对服务器资源的操作。
  • 基本格式:
请求方法  请求路径  http协议版本                   <---- http响应的一行内容,也叫请求行
请求头选项1: 选项值
请求头选项:2 选项值
....
请求头选项n: 选项值

请求体(可以有多行,前后必有空行)

(1)请求行

  • 请求行(HTTP Request Line)
    • 表示请求报文的首行
  • 主要三部分组成,使用单个空格隔开,分别是:
    • 请求方法
    • 请求路径
    • HTTP协议版本。

(2)请求方法

  • HTTP请求方法(HTTP Request Method)
  • 表示客户端希望对服务器指定资源进行哪一种类型的操作
  • 存在多种HTTP请求方法表达增删查改。
  • 常见请求方法如下:
请求方法 描述 报文中是否包含请求体
GET 表示客户端希望从服务器中获取下载资源信息 Flase
POST 表示客户端希望上传文件或通过请求在服务器创建资源信息。 True
PUT 表示客户端希望修改或更新服务器资源(表示修改全部资源信息,例如数据表的一整个记录) True
PATCH 表示客户端希望修改或更新服务器资源(表示修改部分资源信息,例如数据表的一个记录里面某个属性值) True
DELETE 表示客户端希望删除或废弃服务器资源 Flase
OPTION 表示客户端希望获取服务器所支持的请求方法列表 Flase
HEAD 表示客户端希望获取服务器支持的跨域地址列表 Flase

(3)请求路径

  • 表示远程web服务器的一个可访问资源。
  • 一般就是代表的就是一个服务器的具体文件或数据表中的记录信息,或一个服务端里面的函数或方法。
/     表示根路径
/1.html   表示web服务器中web根目录下的1.html文件
/login    表示web服务器中的一个login方法或者login函数

(4)http协议版本

  • 表示客户端目前使用的HTTP协议版本,并期望服务端也采用同样版本的协议与客户端进行通信。

  • http协议发送至今已经到了HTTP2.0版本,目前主流的使用版本有:HTTP/1.0 、HTTP/1.1。

(5)请求头

  • HTTP请求头(Request Head)
    • 主要对客户端请求操作进行限制条件与补充说明。
  • 常见的标准HTTP请求头如下:
选项 描述
Host 指定客户端请求的服务器的域名和端口号。 www.baidu.com
Content-Type 告诉服务器,客户端请求携带的请求体数据的媒体类型信息(MIME类型)
User-Agent 告知服务器HTTP 客户端网络代理程序的版本信息,一般就是浏览器的版本信息。
Authorization 告知服务器客户端的Web认证信息。
Content-Length HTTP报文中请求体的大小,以字节为单位。
Referer 告诉服务器该网页是从哪个页面链接过来。也就是上一页页面的地址。
Accept 指定客户端能够接收并理解的媒体类型类型(MIME类型),用于表达希望服务端的返回资源格式。
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 gzip, deflate, br
Pragma 指定服务端控制缓存行为。http/1.0以前的字段。 Pragme: no-cache
Cache-Control 指定服务端控制缓存行为。http/1.1以后的字段。 Cache-Control: no-cache
Upgrade 向服务器请求在当前http协议的基础上升级采用新的某种传输协议以便服务器进行转换 常用于http协议升级到ws协议。
Connection 指定本次http通信结束以后,是否关闭TCP网络连接。如果设置持久连接,则可以在一次会话中,可以使用同一个TCP连接,进行多次的HTTP通信,提高效率。 持久连接,Connection: keep-alive
非持久连接,Connection: close

注意:在http通信过程中,请求头也是可以自定义的,但是不能出现多字节编码字符,例如中文等。

(6)常见的MIME格式

类型 描述 别名
text/html HTML网页
application/json json文本 text/json
text/plain 纯文本,普通文本
text/xml xml文档
application/javascript js脚本 text/javascript
text/css css样式
image/png png格式图片
image/jpeg jpg格式图片
image/gif gif格式图片
application/x-gzip gzip格式压缩包
application/msword doc文档
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx文档
application/vnd.ms-excel xls文档
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx文档
application/pdf pdf文档
audio/mpeg mp3音频
video/mp4 mp4视频

【3】响应报文

  • HTTP响应报文(HTTP Response)
    • 是服务端在接收理解、处理并返回客户端操作的结果。
    • 主要有三部分组成:
      • 响应行,响应头与响应体。
  • 注意:针对部分请求方法(delete、OPTION、HEAD)的返回结果有时候是没有响应体的。

6

协议版本 响应状态码 响应文本提示                               <-----  http响应的第一行内容,响应行
响应头选项1: 选项值
响应头选项2: 选项值
....
响应头选项n: 选项值

响应体(服务端返回的正文信息,前后必有空行)

(1)响应行

  • HTTP响应行(HTTP Request Line),是HTTP响应报文的首行
  • 由三部分组成,使用单个空格隔开:
    • HTTP协议版本
    • 响应状态码
    • 响应信息。

(2)HTTP协议版本

  • 响应报文的HTTP协议版本,与客户端的协议版本保持一致。
  • 例如:HTTP/1.0,HTTP/1.1。

(3)响应状态码

  • 状态码(Status Code)
    • 用于表达本次服务端在接收客户端请求之后的操作结果的成功或失败结果,由三位整数组成。
状态码类型 描述
1xx 告诉客户端,本次请求,服务端还在持续处理中,并没有结束
2xx 告诉客户端,本次请求,服务端已经接收并成功受理了。
3xx 告诉客户端,服务端位置发生改变,希望客户端重定向访问跳转新的服务器地址进行请求
4xx 告诉客户端,本次请求有误,服务器无法处理。
5xx 告诉客户端,本次请求服务端在处理过程中服务端出错了。

(4)常见的HTTP状态码

状态码 响应信息 描述
101 Switching Protocols 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用升级协议来完成请求。
200 OK 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。常用于GET,PUT或PATCH
201 Created 请求已成功,请求的资源已经创建成功或更新完成,常用于POST,PUT或PATCH
204 No Content 请求已成功,但是没有任何内容返回。常用于DEELTE
301 Moved Permanently 永久重定向,表示当前客户端请求的资源地址已经永久发生改变。
302 Move Temporarily 临时重定向,表示当前客户端请求的资源地址还存在,但是访问客户端达不到访问资源的条件,所以暂时无法访问。
304 Not Modified 表示本次客户端请求的资源,并非来自服务端,而是本地缓存。如果web项目有做了客户端缓存,一般静态文件都会出现304
305 Use Proxy 被请求的资源必须通过指定的代理才能被访问。
307 Temporary Redirect 请求的资源临时从不同的URI 响应请求。
400 Bad Request 本次请求,报文语义有误或请求参数有误,当前请求无法被服务器理解。
401 Unauthorized 本次请求,需要需要用户验证,但用户并没有提供认证。
403 Forbidden 服务器已经理解请求,但是拒绝执行它。一般是因为没有权限导致的。
404 Not Found 请求失败,请求所希望得到的资源未被在服务器上发现,请求路径不存在。
405 Method Not Allowed 请求行中指定的请求方法不能被用于请求相应的资源。使用了错误的请求方法。
500 Internal Server Error 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。就是服务端的代码报错了。
502 Bad Gateway 网关宕机,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。一般就是大量访问请求导致服务器瘫痪或宕机了。
503 Service Unavailable 网关过载,由于临时的服务器维护或者过载,服务器当前无法处理请求。
504 Gateway Timeout 网关超时,作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应。
507 Insufficient Storage 服务器无法存储完成请求所必须的内容。

(5)响应头

  • HTTP响应头(Response Head),主要是服务器返回的内容进行补充说明,并提供下一次请求的一些辅助信息。
选项 描述
Content-Type 告知客户端,响应数据的MIME类型
Content-Length 告知客户端,响应数据的字节大小
Content-Encoding 告知客户端,响应数据采用的压缩格式
Server 告知客户端,响应服务器的名字或类型
Date 告知客户端,响应请求的时间
Location 告知客户端,实际要请求的资源地址(用于301或302进行页面跳转)
Cache-Control 告知客户端,响应数据的缓存机制
Refresh 告知客户端,要定时刷新的时间间隔
Connection 告知客户端,本次HTTP通信完成以后是否要保持TCP连接。
Transfer-Encoding 告知客户端,数据是以分块方式响应回来的。
Content-Disposition 告知客户端,以下载方式打数据的,格式:Content-Disposition: attachment;filename=文件名
Expires 告知客户端,响应数据的过期事件,-1表示马上过期,客户端不要缓存当前响应数据。
Retry-After 告知客户端,应该在多久之后再次发送请求。常见于服务端限流,或503中。
Access-Control-Allow-Origin 指定客户端通过哪些域名下的脚本可以访问服务器资源。
Access-Control-Allow-Methods 指定客户端通过哪些HTTP请求方法访问服务端资源。
Access-Control-Allow-Headers 指定客户端请求服务器的报文中,允许包含哪些请求头。

【总结】

【1】什么是HTTP协议

  • 超文本传输协议,用来规定服务器和浏览器之间数据交互的格式
  • 该协议可以不遵循,但是自己写的服务端不能被浏览器正常识别,只能单机使用

【2】HTTP协议的四大特性

(1)基于请求响应

(2)基于TCP/IP之上,作用域应用层之上的协议

(3)无状态

  • 不保存用户的信息

    • 早期的网站不需要用户注册 所有人访问的网页数据都是一样的
  • 由于HTTP协议是无状态的,所以后来出现了一些专门用来记录用户状态的技术

    • cookie/session/token

(4)无/短链接

  • HTTP协议默认是HTTP 1.0 短链接

    • 即两者请求响应后立刻断绝关系,绝大多数网站都用的短链接
  • HTTP 1.1 长链接

    • 长链接:双方建立连接之后默认不会断开链接(websocket)

【3】HTTP协议的格式

(1)请求数据格式

  • 请求首行(标识HTTP协议,当前请求方式)

  • 请求头(多组K:V键值对)

  • \r\n\r\n

  • 请求体(并不是所有的请求都有,get没有post有,存放的是post请求提交的敏感数据)

(2)响应数据格式

  • 响应首行(标识HTTP协议,当前请求方式,响应状态码)

  • 响应头(多组K:V键值对)

  • \r\n\r\n

  • 响应体(返回给浏览器,展示给用户看的数据)

(3)请求方式

  • get请求
    • 朝服务端要数据
      • 输入网址获取对应的内容
  • post请求
    • 朝服务端提交数据
      • 用户登录 输入用户名密码之后 提交到服务端后端做身份校验

(4)响应状态码

  • 用一堆简单的数字来表示一些复杂的状态或描述性信息

(5)URL

  • 统一资源定位符(网址)
posted @ 2024-02-27 08:29  Chimengmeng  阅读(10)  评论(0编辑  收藏  举报
/* */