本文将会总结HTTP和HTTPS的相关内容
HTTP协议: 一般称为“超文本传输协议”,是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。
HTTP 是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。
HTTP 是一个基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等)。
HTTPS协议: 一般称为“超文本传输安全协议“,是一种透过计算机网络进行安全通信的传输协议。HTTPS是HTTP的一个升级,利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
一个网站页面的获取,可能是不止一次的HTTP的交互过程。可以使用浏览器的开发者模式或者抓包工具Fiddler,Wireshark等进行查看(工具的下载自行百度即可):
下面以CSDN为例,CSDN使用的是HTTPS协议,使用Edge浏览器的F12开发者模式:
使用Fiddler:
下面以CSDN的抓包信息来详细介绍:
请求报文:
GET https://www.csdn.net/?spm=1001.2014.3001.4476 HTTP/1.1
Host: www.csdn.net
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Microsoft Edge";v="102"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.41
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://limestart.cn/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: uuid_tt_dd=10_20726454420-1628668117137-248699; UN=qq_40846862;
\n
来分割。如上:属性Host、属性Connection等。响应报文:
HTTP/1.1 200 OK
Date: Sat, 18 Jun 2022 02:29:14 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: nginx
Vary: Accept-Encoding
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Expires: Sun, 1 Jan 2000 01:00:00 GMT
Pragma: must-revalidate, no-cache, private
Cache-Control: no-cache
Set-Cookie: oschina_new_user=false; path=/; expires=Wed, 18 Jun 2042 02:29:14 -0000
Set-Cookie: gitee-session-n=QUFXd0Z5VHttpOnly
X-Request-Id: 18083e3271132e5ee64b664e851f6225
X-Runtime: 0.164380
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self' https://*.gitee.com
Content-Encoding: gzip
ad6
? 斫{{G??蟬久D仌哼M飕1&!?淦r魩fF襚I#4?熐$
\n
来分割。如上:属性Date、属性Content-Type等。注: 报文中的空行相当于报头(Header)结束的标志。HTTP 在传输层依赖 TCP 协议,TCP 是面向字节流的。如果没有这个空行,就会出现 “粘包问题”。
URL 是一个网页地址。
全称是统一资源定位器(Uniform Resource Locators)
URL可以由字母组成,如"csdn.com",或互联网协议(IP)地址:192.68.20.50。大多数人进入网站使用网站域名来访问,因为名字比数字更容易记住。
下面简单来说明:
scheme://host.domain:port/path/filename
举个简单的示例,以我的上一篇排序算法博客的URL为例:
https://blog.csdn.net/qq_40846862/article/details/125110221?spm=1001.2014.3001.5501
&
分隔。键和值之间使用=
分隔。像/ ? :
等这样的字符,已经被URL当做特殊意义理解了。因此这些字符不能随意出现。
当某个参数中带有这些特殊字符时,必须先对特殊字符进行转义。(中文字符虽然没有特殊含义,但也需要转义)
转义规则: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
下面的例子中?
被转义为了%3F
。
工具: 转义工具https://tool.chinaz.com/Tools/urlencode.aspx
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
以下是在地址栏输入www.csdn.com
的结果:
GET 请求的特点:
注: GET请求中的URL没有限制,但是实际的URL长度取决于浏览器和HTTP服务器。
form
标签可以构造 POST 请求, 或者使用JavaScript 的 ajax
也可以构造 POST 请求。Content-Type
指定。 body 的长度由header 中的 Content-Length
指定。GET | POST | |
---|---|---|
请求发起方式 | 在URL中发送 | 在HTTP 消息主体中发送 |
缓存 | 可被缓存 | 不可被缓存 |
书签 | 可收藏为书签 | 不可收藏为书签 |
历史记录 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
幂等性 | 幂等 | 非幂等 |
安全性: 关于安全性的讨论,从表面上看GET比POST是安全的,因为GET的内容在URL中发送,比HTTP消息主体中的内容更易获得。但安全性主要还是取决于传输敏感信息时的加密情况。
传输数数据量: 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少, 完全取决于不同浏览器和不同服务器之间的实现区别。
传输数据类型: GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数据进行 url encode。
注: 如果多次请求得到的结果一样, 就视为请求是幂等的。
header 的整体的格式也是 “键值对” 结构
每个键值对占一行。键和值之间使用;
分割。
属性名 | 内容 |
---|---|
Host | 表示服务器主机的地址和端口 |
Content-Length | 表示 body 中的数据长度 |
Content-Type | 表示请求的 body 中的数据格式 |
User-Agent (简称 UA) | 表示浏览器/操作系统的属性 |
Referer | 表示这个页面是从哪个页面跳转过来的 |
Cookie | Cookie 中存储了一个字符串, 这个数据可能是客户端(网页)自行通过 JS 写入的, 也可能来自于服务器(服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据) |
常见的选项:
application/x-www-form-urlencoded: form
title=test&content=hello
multipart/form-data: form
enctyped="multipart/form-data"
。 通常用于提交图片/文件。body 格式为:Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
其中----WebKitFormBoundaryrGKCBY7qhFd3TrwA
为分隔符。
application/json
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16
a861fa2bddfdcd15"}
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.41
其中:Windows NT 10.0; Win64; x64
表示操作系统信息
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.41
表示浏览器信息
如果是直接在浏览器输入URL或者通过收藏夹访问是没有Referer
通过这个字段可以实现“身份标识”的作用。
每个不同的域名下可以拥有不同的Cookie,不同的网站之间的Cookie不冲突。
移除存在的Cookie
通过抓包可以看到响应中包含了三个Set-Cookie属性。
其中第三个。里面包含了一个 gitee-session-n
这样的属性, 属性值是一串很长的加
密之后的信息。这个信息就是用户当前登陆的身份标识。也称为 “令牌(token)”。
可以看到访问别的界面也会带有这个属性
进入网站主页,登录账号,访问网站其他页面的流程:
正文中的内容格式和 header 中的 Content-Type
密切相关
有三种常见情况:
application/x-www-form-urlencoded
multipart/form-data
application/json
请求的正文中是请求携带的数据,常用的是表单格式、图片、视频等文件格式。
Content-Type
标识了body中数据的格式,Content-Length
标识了body的字节长度。通过这两个参数来帮助服务器解析body中的数据。
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。
常见的HTTP状态码:
这里大家最熟悉的应该就是404 Not Found了吧,被神秘力量攻击了,网页不存在的时候见到最多的就是它了,心脏骤停的感觉。
下面是状态的一个分类,一共分为5类。
分类 | 分类描述 |
---|---|
100-199 | 信息响应,服务器收到请求,需要请求者继续执行操作 |
200–299 | 成功响应,操作被成功接收并处理 |
300–399 | 重定向,需要进一步的操作以完成请求 |
400–499 | 客户端错误,请求包含语法错误或无法完成请求 |
500–599 | 服务器错误,服务器在处理请求的过程中发生了错误 |
响应报头的基本格式和请求报头的格式基本一致。属性的含义也与请求中一致。
响应中的 Content-Type
常见取值有以下几种:
text/html
: body 数据格式是 HTMLtext/css
: body 数据格式是 CSSapplication/javascript
:body 数据格式是 JavaScripapplication/json
:body 数据格式是 JSON正文的具体格式取决于 Content-Type。观察上面几个抓包结果中的响应部分。
下面报文中body内容都很长,所以下面展示的只截取了部分。
text/html
HTTP/1.1 200 OK
Server: openresty
Date: Sat, 18 Jun 2022 07:23:08 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
X-Response-Time: 344
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-readtime: 344
Strict-Transport-Security: max-age=31536000
Content-Length: 530219
CSDN - 专业开发者社区
……
text/css
HTTP/1.1 200 OK
Date: Sat, 18 Jun 2022 07:23:08 GMT
Content-Type: text/css
Connection: keep-alive
Server: openresty
Last-Modified: Tue, 18 Jan 2022 11:03:16 GMT
Vary: Accept-Encoding
ETag: W/"61e69e74-1305"
X-Ser: BC72_dx-lt-yd-shandong-jinan-5-cache-8, BC41_lt-shan3xi-xian-15-cache-3
Cache-Control: max-age=31536000
Access-Control-Allow-Origin: *
Content-Length: 4869
#csdn-userTooltip img{vertical-align:middle}#csdn-userTooltip{position
……
application/javascript
HTTP/1.1 200 OK
Cache-Control: max-age=0, must-revalidate
Content-Length: 56740
Content-Type: application/javascript
Date: Sat, 18 Jun 2022 07:23:08 GMT
Etag: 61153fb5c2f88ed1b4d76e4be4600cb9
Server: apache
Strict-Transport-Security: max-age=172800
(function(){var h={},mt={},c={id:"6bcd52f51e9b3dce32bec4a3997715ac",dm:["csdn
……
application/json
HTTP/1.1 200 OK
Server: openresty
Date: Sat, 18 Jun 2022 07:23:09 GMT
Content-Type: application/json
Connection: keep-alive
Keep-Alive: timeout=20
Set-Cookie: uuid_tt_dd=10_19089526960-1655536989129-157544; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Set-Cookie: dc_session_id=10_1655536989129.143001; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Access-Control-Allow-Origin: https://www.csdn.net
Access-Control-Allow-Credentials: true
Content-Length: 8895
{"code":200,"data":{"ext":{"utm_medium":"distribute.pc_search_hot_word.none-task-hot_word-alirecmd-1-不知名白帽-null
……
HTTPS协议是基于HTTP协议的一种更安全的协议。
HTTPS协议默认工作在443端口,工作流程如下: