HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
http url
:
http://host[":"port][abs_path]
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/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
:服务器端错误 - 服务器未能实现合法的请求
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。Content-Type
加以标记。Connection: Keep-Alive
实现长连接。HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。一个http客户端,通常是浏览器,与web服务器的http端口建立一个TCP套接字连接。
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、消息报头和请求正文组成。
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行,消息报头,响应正文组成。
若connection
模式为close
,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;
若connection
模式为keepalive
,则该连接会保持一段时间,在该时间内可以继续接收请求。
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP
协议中没有加密机制,但可以通 过和 SSL
(Secure Socket Layer, 安全套接层 )或 TLS
(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP
的通信内容。属于通信加密,即在整个通信线路中加密。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )
HTTPS
采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
下图是混合加密机制: