详解HTTP

http协议简介

HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。

http url

代码语言:javascript
复制
http://host[":"port][abs_path]

http请求头

http请求由请求行,消息报头,请求正文三部分构成。

访问baidu.com,用burpsuite抓包,request headers如下:

代码语言:javascript
复制
GET /home/other/data/weatherInfo?city=%E4%B9%9D%E6%B1%9F&indextype=manht&_req_seqid=0xaa4e1afd0028b863&asyn=1&t=1660183623070&sid= HTTP/1.1
Accept: text/plain, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BIDUPSID=119642CD178BFA21589E1CB22D5CA9A7; PSTM=1659494222; BAIDUID=119642CD178BFA2112CD19D23E02A3D4:FG=1; BD_UPN=12314753; BA_HECTOR=008ka121a1208h2l2h8m58dv1hf7bh617; ZFY=sJnijftb:Bjr6fSMibAhSFO1sZ:AqUSVSzic:C; BDUSS_BFESS=i1DcM2toQ0h-Q093Skc5YlkybmlYUnkteVlSZ1lpcPeHRqSUFBQUFBJCQAAAAAAAAAAAEAAAAXz79~tPLG37j2urrX1tXmxNEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOu82KzrvNiT; BDRCVFR[5ig7pqb-tu6]=mk3SLVN4HKm; BD_HOME=1; H_PS_PSSID=
Host: www.baidu.com
Referer: https://www.baidu.com/?tn=49055317_36_hao_pg
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
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
X-Requested-With: XMLHttpRequest
sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"

请求行

GET / HTTP/1.1 方法是GET,协议版本http1.1

方法

作用

HEAD

类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头

POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。

GET

请求指定的页面信息,并返回实体主体。

PUT

从客户端向服务器传送的数据取代指定的文档的内容。

DELETE

请求服务器删除指定的页面。

CONNECT

HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

OPTIONS

允许客户端查看服务器的性能。

TRACE

回显服务器收到的请求,主要用于测试或诊断。

PATCH

是对 PUT 方法的补充,用来对已知资源进行局部更新 。

消息报头

Header

解释

Accept

指定客户端能接收的内容类型

Accept-Charset

浏览器可以接收的字符编码集

Accept-Encoding

指定浏览器可以支持的web服务器返回内容压缩编码类型

Accept-Language

浏览器可接收的语言

Accept-Ranges

可以请求网页实体的一个或者多个子范围字段

Authorization

HTTP授权的授权证书类型

Cache-Control

指定请求和响应遵循的缓存机制

Connection

表示是否需要持久连接

Cookie

cookie

Content-Length

请求的内容长度

Content-Type

请求的与实体对应的MIME信息

User-Agent

初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具

Resource

由URI标识的网络数据对象或服务

Message

HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输

Entity

数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容

Client

一个为发送请求目的而建立连接的应用程序

请求正文

只有POST请求才有请求正文,GET方式并没有请求正文。

POST请求正文实例:

代码语言:javascript
复制
POST / HTTP1.1
Host: www.wrox.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=c

http响应头

HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。

代码语言:javascript
复制
HTTP/1.1 200 OK
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 11 Aug 2022 02:07:03 GMT
Expires: Thu, 11 Aug 2022 02:07:03 GMT
Server: BWS/1.0
Vary: Accept-Encoding
Transfer-Encoding: chunked

状态行由三部分组成,包括http协议的版本,状态码以及对应状态码的文本描述。

状态码由三位数字表示,

1xx指示信息 - 表示请求已接收,继续处理

2xx成功 - 表示请求已被成功接收、理解、接受

3xx重定向 - 要完成请求必须进行更进一步的操作

4xx客户端错误 - 请求有语法错误或请求无法实现

5xx服务器端错误 - 服务器未能实现合法的请求

HTTP 状态码详解

http协议的特点

  1. 支持客户/服务器模式
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GETHEADPOST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过Connection: Keep-Alive实现长连接。
  5. 无状态HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http协议的工作原理

连接web服务器

一个http客户端,通常是浏览器,与web服务器的http端口建立一个TCP套接字连接。

发送http请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、消息报头和请求正文组成。

返回http响应

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行,消息报头,响应正文组成。

释放TCP连接

connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;

connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。

解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

http与https

http的缺点

  • 通信使用明文(不加密),内容可能会被窃听

  • 不验证通信方的身份,因此有可能遭遇伪装

  • 无法证明报文的完整性,所以有可能已遭篡改

https

HTTP 协议中没有加密机制,但可以通 过和 SSL(Secure Socket Layer, 安全套接层 )或 TLS(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。属于通信加密,即在整个通信线路中加密。

代码语言:javascript
复制
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )

HTTPS 采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。

下图是混合加密机制:

  1. 浏览器将自己支持的一套加密规则发送给网站。
  2. 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
  3. 获得网站证书之后浏览器要做以下工作:
    (a). 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
    (b). 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码(接下来通信的密钥),并用证书中提供的公钥加密(共享密钥加密)。
    (c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
  4. 网站接收浏览器发来的数据之后要做以下的操作:
    (a). 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
    (b). 使用密码加密一段握手消息,发送给浏览器。

https的缺点

  1. 加密解密过程复杂,导致访问速度慢
  2. 加密需要认向证机构付费
  3. 整个页面的请求都要使用HTTPS