http协议简介
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
http url
:
http://host[":"port][abs_path]
http请求头
http请求由请求行,消息报头,请求正文三部分构成。
访问baidu.com
,用burpsuite抓包,request headers
如下:
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
请求正文实例:
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响应也由三部分组成,包括状态行,消息报头,响应正文。
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协议的特点
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接。 - 无状态:
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
的通信内容。属于通信加密,即在整个通信线路中加密。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )
HTTPS
采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
下图是混合加密机制:
- 浏览器将自己支持的一套加密规则发送给网站。
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
- 获得网站证书之后浏览器要做以下工作:
(a). 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
(b). 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码(接下来通信的密钥),并用证书中提供的公钥加密(共享密钥加密)。
(c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。 - 网站接收浏览器发来的数据之后要做以下的操作:
(a). 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
(b). 使用密码加密一段握手消息,发送给浏览器。
https的缺点
- 加密解密过程复杂,导致访问速度慢
- 加密需要认向证机构付费
- 整个页面的请求都要使用HTTPS