HTTP协议(超文本传输协议)
->最常见的应用层协议,主要是基于传输层的TCP协议传输,在日常生活中,当我们访问一个URL(网址),浏览器会给服务器发送一个HTTP请求,服务器也会返回一个HTTP响应,
超文本:指的是传输内容不仅仅是文本,还可以是字符串,图片,声音,视频等。
HTTP协议的工作过程
当我们在浏览器中搜索东西时,此时浏览器会给服务器发送一个HTTP请求,等到对方服务器接收到了之后,也会发出一个HTTP会响应
但在实际生活中,可能不会只涉及到一次HTTP请求,这时我们可以用抓包工具获取一下:
如:打开搜狗网页,利用抓包工具,可以看到很多个搜狗请求。
抓包工具的使用方法
下载网址:https://www.telerik.com/fiddler
傻瓜式安装
界面说明
- 左边窗口显示了HTTPS 的响应和请求,可以点击产看详情
- 右边是请求和响应的内容,点击Raw标签可以查看更加详细的格式和内容
- 请求和响应的详细内容可以通过右下角的 view in Notepad在记事本中打开查看。
抓包工具的原理
fidder相当于一个代理,时浏览器和服务器的中间商,当浏览器想要浏览某个网站的时候,当发起请求的时候,会经过fidder然后fidder再转发给服务器,服务器收到请求的时候,会向fidder返回一个响应,再由fidder返回给浏览器。
一个抓包结果:
一个HTTP请求:
POST http://functional.events.data.microsoft.com/OneCollector/1.0/ HTTP/1.1
Host: functional.events.data.microsoft.com
Connection: keep-alive
Content-Length: 872
APIKey: 70109aa3567b40e3bb8ac9e67a07b58a-b00e4868-b511-4be4-90dd-6370c812f0af-7167
Client-Id: NO_AUTH
Content-Type: application/bond-compact-binary
Expect: 100-continue
SDK-Version: EVT-Windows-C++-No-3.5.131.1
Tickets: "10001"="p:t=GwBWAbuEBAAU2qcZHJoKGNizGOeyqM4OaIoSZ0MOZgAAEBPA9aY2/hlK3aBkP8w/02sgAXRFSQAMX8/4DzbIU9yANRCrxKiOkU6Z1WFbnPA0DdXIJjtkJczy5DlJU1pHSMYsDROCbwU5lwEPQ5/Y+KeIvnlO6dhbB+GJ/Vdz8RstePfC9Jc3U8dji4tOOhuWcGl/vJHTlHdKDRYCePiVNLOhYCtPaXAdH4CXmdSW4JdTrON+a64MNCAb7fKEJzQeQPqvDZMI2EORk1Z0WE5NJ4vBsRdmwTec5Espt6/gvpsXoQsrkMDJGUZdvJxFpZB6qN3exLGAzmV2roDDiMSScKAlgihIf0QGwhqJMMvpZRVqveRaV9hGHORGjQKWzx/pi1iB+Z5mjt0TX51wqUGdXwLqtflW6p/rHYQYUULdyhhVpoLw9sRZ3XffwyH8ODvppQWMZlIB&p="
Upload-Time: 1694763620486
Sec-Fetch-Site: none
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: empty
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76
Accept-Encoding: gzip, deflate, br
)3.0I?Microsoft.WebBrowser.Personalization.SAN.BrowserWindowLostFocusq Ǥ "o:70109aa3567b40e3bb8ac9e67a07b58a @
K
10001iLENOVO 82FF
I&r:5583e9e7-0841-441c-b278-83aa01747291 Windows.Desktop
Windows Desktop ,10.0.22621.1.amd64fre.ni_release.220506-1250
fW:00069af996c969854ab80e587bcafd00f62900000904!0000da39a3ee5e6b4b0d3255bfef95601890afd80709!msedge.exe %2023/09/06:23:01:17!3eb911!msedge.exe
I Unmeteredi Unknown
)EVT-Windows-C++-No-3.5.131.1I$9619159E-CC4F-443E-B0F1-FD5F459AF0B8q $6A0395FF-E484-44E5-9D61-F38B7747F195 !
i+08:00 %
<custom F
-
AppInfo.ETag Channel0 ConnectionTypeiWiFi CorrelationGuidi$678308bf-330e-498f-a93d-ad3b9f2a2cd2 EventInfo.Level0 TabId0 ܊
Timestampi2023-09-15T07:40:18.476Z muidi 19EAB5F4CB3E6A79026BA79ECA746B85
pop_sample0 Y@ utc_flags0 @
HTTP请求协议格式
- 首行:[方法]+[URL]+[版本号]
- Header:请求的属性,冒号分割的键值对;每一组属性之间使用\n分隔;遇到空行表示header部分结束。
- body:空行后的内容就是body,body允许空字符串,如果body存在会有一个Content-Length属性来时表示body的长度
- host:表示服务器主机的地址和端口号
- Content-Length:表示的是body的长度
- Content-type:表示的是body的数据格式
- User-Agent:
- 表示浏览器/操作系统的属性
- Referer:表示这个页面从哪里跳转过来的
- Cookie:存储了一个字符串,有着身份识别的功能
HTTP请求方法:
方法 | 解释 | 支持版本 |
GET | 获取资源 | 1.1/1.0 |
POST | 传输实体主体 | 1.1/1.0 |
PUT | 传输文件 | 1.1/1.0 |
HEAD | 获取报文首部 | 1.1/1.0 |
DELETE | 删除文件 | 1.1/1.0 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立资源之间的连接 | 1.0 |
UNLINE | 断开连接关系 | 1.0 |
1.GET方法:
较为常用的方法,常用于获取服务器的资源,在浏览器直接输入URL就是一个GET方法
像浏览器中直接搜索搜狗页面利用fidder抓包结果:
GET https://www.sogou.com/ HTTP/1.1
Host: www.sogou.com
Connection: keep-alive
sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"
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/116.0.0.0 Safari/537.36 Edg/116.0.1938.76
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.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://cn.bing.com/
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: ssuid=5814782282; ABTEST=4|1694668509|v17; IPLOC=CN6101; SUID=F728126F7810870A00000000650296DD; cuid=AAF1QbtIRwAAAAqHS1ArxwEANgg=; SUV=1694668511693255; browerV=3; osV=1
特点:
- 首行第一部分位GET
- URL的query string 可以为空也可以不为空
- header中有若干个键值对
- body为空
2.POST:
对用于提交用户输入的是数据给服务器,登录上传的操作都用的是POST
利用fidder抓包:
POST https://gitee.com/graphql HTTP/1.1
Host: gitee.com
Connection: keep-alive
Content-Length: 105
sec-ch-ua: "Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"
content-type: application/json
baggage: sentry-environment=beta,sentry-release=v0.14.16-community,sentry-transaction=%2F,sentry-public_key=e16c11f0b46847e9a344ce684682dde4,sentry-trace_id=6dbf4f93621e45af9bc2cdca892adfce,sentry-sample_rate=1
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76
sentry-trace: 6dbf4f93621e45af9bc2cdca892adfce-944c27fc9c45fa29-1
sec-ch-ua-platform: "Windows"
Accept: */*
Origin: https://gitee.com
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://gitee.com/
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: user_locale=zh-CN; oschina_new_user=false; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22%22%7D%7D; yp_riddler_id=963761db-0dd5-4796-8730-81359ab1f23b; Serve_State=true; slide_id=10; remote_way=http; tz=Asia%2FShanghai; Hm_lvt_24f17767262929947cc3631f99bfd274=1693995342,1694173196,1694175366,1694177592; BEC=1f1759df3ccd099821dcf0da6feb0357; csrf_token=W91h7jQD7BdKOf1XmV9Dm%2BI74Tc%2BK51n9y3puxQg9Mz7CXBxJLfKdOve%2FOoqZVt%2F3zMcvU8GzndiCad4RUfEjQ%3D%3D; user_return_to_0=%2F; Hm_lpvt_24f17767262929947cc3631f99bfd274=1694764813; gitee_user=true; gitee-session-n=YjBHaUZwWmx2WUJYeTJNU0tRb1dTQ2l2U0ozaUw4ZVFJekk0MFAwTWtmV3dacHFHeUJwZUQ5eHpQVFViTG9xOVRzZGhVMTBQcklmNUdqZDRPNENUQzdOUmg4NVptcjFLeDBPVEZ6VVZmY0IvcUUwWklQWkJ3OElRY05FMHZkS1BXUk83OHVja1VTMVptUGRJZm5lWk1pVnhXWlpMNGJoTnBIUHJCdk5salpFeGwrL1JhaDg1SHhnR05rUXpVb2sxOENjU3RCaTl2cjRmYlh0ZW1uLzF2eTFLWXNsTVhGRk9lZ0RnY3dRZTVZSFozakNiQlgwWURmYnNUczZNVXdXVjA4M1dQcUZpNW9MT0pxdm9HcEMxVHFzbTBDTW45blJkN1BPbThSOC82MXkyTmRxZlJpSWFzY0RhOWkxaGs2blE1WVBUQWVjd0JQUzBIVzdkU0JUSUFwRHc5VWl2VkFYMHowRG1BZ2J0ZTVYUHRGMnhRSWVNaTZwblpvSmdPSkoxbDBISERvdktyVmc4NWRLei9oNVJubld5ei9iYXZPdkRIOHZUSk1VcFB3U0YzTklGVkR0eFBtdXBWa1B6ck1SYTBEc1FlZUtSTjVuUE1iZGdyVzFJTVV2TGQ0VEU5YmJzc3A4OC94bUJXcXFjR1RubkhLZnZXTno4RThBK2pwa0sra015U2ZQaUpSRmFlZU5pV1g2V21aTThHMktoNEpOR25FTlI0WEpML09uSU5zVUhKc3FMQThIOGhsWHFFcVJXSHVDYVB6ZmMwSDBMODN3VDRCZDhNMC8wVVM5L3ZCWUh0bWM4MlNCTDdobFdwbmpyWkRteElzTWhRQWZraWsrN2NITUFPbFpGUXBmekJWU1U0WFNYZjhHcVZCZC8vR1ZSS0VzZllPWVlld1k9LS1uRHBZdE0zQzBicm5lQnljZVpOa3dnPT0%3D--9f8285592cc821a9451300d323f524b6ef984691; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2218a97dacb2fb2a-0be970059e6038-7f5d547e-921600-18a97dacb30b28%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%22183e69c1a6e620-0222341cefa2bb-7b555476-921600-183e69c1a6fe74%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTgzZTY5YzQ3OWM1ZDEtMGMyNWJiOTdjNjIwYmE4LTdiNTU1NDc2LTkyMTYwMC0xODNlNjljNDc5ZGU1ZiJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D
{"query":"\n query queryVersion {\n wkv {\n version\n }\n}\n ","operationName":"queryVersion"}
特点:
- 首行的方法POST
- URL的Query string一般为空(可以部位空)
- body:空行后的内容就是body,body允许空字符串,如果body存在会有一个Content-Length属性来时表示body的长度
GAT和POST区别
1.GET是把一些自定义的数据放到Query string中,body通常是空的,而POST是把一些自定义的数据放到body中,Query string通常是空的。(会产生一种错觉->post比get更安全,应为Query string中的数据用户看的到,而body中用户看不到,但是这跟安全扯不上半毛钱的关系,应为网络安全是指的数据加密的防止黑客查看到,但body并没有加密的操作,黑客仍可以看到)
2.RFC文档中指出GET是等幂的,而POST是不等幂的,简单来说就是,get得到的回应每次都是一样的,而post是不等幂的,响应传每次都是不一样的。
2.RFC文档中指出GET是可以缓存的,应为是等幂的,每次回想都是一样的,在第一次方位的时候就缓存了,再往后的访问中更加方便,而POST是不等幂的,所以不能缓存。
一个HTTP响应:
HTTP/1.1 200 OK
Content-Length: 9
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
Strict-Transport-Security: max-age=31536000
time-delta-millis: 746
Access-Control-Allow-Headers: time-delta-millis
Access-Control-Allow-Methods: POST
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: time-delta-millis
Date: Fri, 15 Sep 2023 07:40:20 GMT
{"acc":1}
HTTP响应协议的格式:
- 首行:[版本号]+[状态码]+[状态码解释]
- Header:请求的属性,冒号分割的键值对;每一组属性之间使用\n分隔;遇到空行表示header部分结束。
- body:空行后的内容就是body,body允许空字符串,如果body存在会有一个Content-Length属性来时表示body的长度,如果服务器是一个html页面,那么body的内容就是html中的内容
响应的状态码:
200 | ok | 表示访问成功 |
404 | Not Found | 没有找到资源 |
403 | Forbidden | 表示拒绝访问,有些页面需要永辉登录才能查看,如果不登录无法查看 |
405 | Method Not Allowed | 对方的服务器不一定支持所有的方法,等对方服务器无法显示这个方法的时候就会出现这个页面 |
500 | Internal Sever Error | 服务器出现错误 |
504 | Gateway Timeout | 当服务器的负载较大时,服务器处理单条请求的时候消耗的时间就会变长,导致超时 |
302 | Move temporarily | 临时重定向:跳转到其他页面 |
301 | Move Permanently | 永久重定向:后续请求会被直接跳转到一个新的地址 |
报头(header):和请求的格式相同
Content-type:
常见的几种形式:
- text/html:body就是html的内容
- text/css:数据格式就时css
- application/javascript:body数据格式就是js
- application/json:数据格式就是json