《图解HTTP 2024-Y02》Chapter2 简单的http协议

138 阅读7分钟

前言:

目前市场上得书籍很少能将http相关知识讲的很清楚,很多开发在这一块的体系知识需要得到补充,当然也包括我。无意间,看到一本 日本人写的 《图解http》书,发现里面讲的很细致,并且以图形得方式深度还原http之间的联系,值得推荐,于是好记性不如烂笔头,开始记录吧,本文主要是针对第二章记录,共11章每个章节都会做详细的讲解

image.png

http协议和tcp/ip协议组的其他众多协议相同,用于客户端和服务端之间的通信,通信必然有两个端,一个是发送端一个是接收端。

   GET  /index.html HTTP 1.1
   
   /* 请求首部字段 */
   Host: hackr.jp
   
   /* 内容实体 */
   Connection: keep-alive
   Content-type: application/json; charset=UTF-8
   Content-Length: 836 
   ......

综合来看发送端请求报文有:请求方法、请求URI, 协议版本、可选首部字段和内容实体组成

   HTTP 1.1  200 OK
   Date: Tue, 20 Feb 2024 01:10:15 GMT 【响应首部字段】
   Content-Length: 836
   Content-Type: application/json; charset=utf-8 
   ......

接收端: 会有结果的协议版本、状态码、创建时间、资源实体主体

http是无状态协议,自身不对请求和响应之间的通信状态进行保存,不做持久化处理,只负责单次请求请求路线响应,为了解决这个问题,引入了cookie技术,在通信的过程中保留上一个http请求的状态控制
http协议使用URL定位资源,所以互联网上任何资源都能访问,当客户端请求访问资源发送请求时,URI需要作为请求报文中的请求URI包含在内,指定方式很多种

     GET  www.baidu.com/index.html    HTTP 1.1  200 OK [完整情况时]
   
    /* 首部字段host写域名和IP地址 */
    GET  /index.html HTTP/1.1
    Host: hackr,jp
   ......

细致聊聊http的请求方法们

GET

请求访问已被URI识别的资源,指定资源经服务器端解析后返回响应内容,也就是说,请求资源是文本,就保持原样返回,如果是需要CGI(通用网关接口)的程序,则需要经过执行后的输出结果。

请求设置更新的时间: if-modified-since: 时间, 如果时间后没有内容更新,则返回状态码304作为响应返回

POST

传递实体的主体 虽然GET也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法,虽说POST功能与GET相似,但POST

PUT

用于传输文件,就像ftp协议的文件上传一样,要求在报文的主体中包含文件内容,然后保存到指定的URI指定的位置,但是这个方法存在着自身不带验证机制,任何人都可以上传文件,存在安全性的问题,所以一般不使用这个方法,如果配合web应用的验证机制(token等),或框架设计采用REST 标准的网站,就可以使用PUT方法

响应:响应状态码204 no content,标识请求执行成功,但是无数据返回

HEAD

获取报文首部

这个方法我想很多前端同学不太清楚,这个方法和get方法一样,只是不返回报文主体部分,用于确定URI的有效性及资源更新的日期时间等。

DELETE

删除文件

delete方法用于删除文件,是和PUT相反的方法,按请求URI资源来删除指定的资源,但是它和PUT一样,也是不带安全验证的,一般网站也不使用如果配合web应用的验证机制(token等),或框架设计采用REST 标准的网站,就可以使用PUT方法

响应:响应状态码204 no content,标识请求执行成功,标识html已从服务器中删除

老生常谈,这种重要的操作,那为什么不做安全认证呢?

OPTION

查询针对请求URI指定资源支持的方法。

响应的报文中会在allow做出显示 :GET,POST,HEAD,OPTION

TRACE

让web服务器将之前的请求通信返回给客户端的方法

发送请求时,在MAX-forwards字段写一个数值,每经过一个服务器端就减1,然后当减到0的时候,就停止继续传输,最后接收到请求的服务端则返回状态码200 OK响应。

这个方法还挺高级的,但是知道咋用的人很少,那是因为啥?因为它太容易被注入攻击了,它在代理服务器中请求过程中,被其他病毒篡改,那不是一系列的服务器都会出现跨站攻击吗

客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的,这是因为,想要连接到源目标服务器可能会通过代理中转,这个方法就是用来确认连接过程中发生的一系列操作,如果没有代理服务器,请求比如是MAX-forwards:2, 那返回还是MAX-forwards等于2,这个方法其实使用起来还是稍微有点怪异

CONNECT

要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输安全层安全)协议把通信内容加密后经网络隧道传输

客户端 connect请求 -> 【隧道 接受 OK】 -> 服务端

请求: CONNECT proxy.hackr.jp:8080 HTTP/1.1

响应: HTTP/1.1 200 OK (之后进入网络隧道)

1708396100808.png

持续的http连接如何节省通信量

最开始的http版本,每进行一次通信就会断开一次TCP连接,这种对应非常简单的网站而言,的确能够满足需求,但是如今的网站包含大量的图片以及动效,还有视频等等效果,那每次断开通信,又重新执行TCP连接就会增加不必要的开销,为了解决这个问题,于是提出了持久连接,keep-live的方法,只要任意一方没有明确提出断开连接,就会一直保持连接状态,

http1.1是默认持久化连接,http1.0没有标准化

管线化

持久连接使多数请求以管线化方式称为可能,以前发送请求后需要等待并收到响应,才发送下一个请求,管线化技术出现了,就不用等待响应也可以直接发送下一个请求,这也是异步执行的概念,这个效率就更高了,同时增加服务器的带宽快速响应也成为了一个事实

使用cookie进行状态管理

上文提到,http是无状态的,它不会存任何有关状态的数据,比如一个登录状态,明明登录成功了要跳到个人中心页面,结果一直在登录页面,那不是很尴尬,所以为了解决这个问题,引入了cookie技术来管理对应客户端请求的状态管理。

无状态协议的优点: 减少服务器CPU压力以及内存资源的消耗 缺点: 无法获取和控制到当前客户端的请求状态

流程: cookie会根据服务器响应的报文内一个叫做set-cookies首部头信息,并记录是那个客户端发送的,客户端会在请求报文中添加cookie值后传给服务器,服务器会根据当前客户端发送cookie,进行服务器上的记录匹配,得到最新的状态信息