一、HTTP协议介绍
基本介绍:
HTTP:全称超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
HTTP是一种应用层协议,是基于TCP/IP通信协议来传输数据的,其中HTTP1.0、HTTP1.1、HTTP2.0均为TCP实现,HTTP3.0基于UDP实现。现主流使用HTTP1.0和HTTP3.0。
协议:为了使数据在网络上从源头到达目的地,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。就像是两个人传递纸条通过互相指定的暗号,如果发送天亮了,表示可以打游戏了等等。
注意:当我们访问一些网页时,是显示通过HTTPS来进行通信的,并且当下大多数的网页都是通过HTTPS来进行通信的,因为HTTPS在HTTP的基础上做了一个加密的工作。
二、HTTP协议的工作过程
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个HTTP请求,对应的服务器收到这个请求后,经过计算处理,就会返回一个HTTP响应。并且当我们访问一个网站时,可能涉及不止一次的HTTP请求和响应的交互过程。
基础术语:
客户端:主动发起网络请求的一端
服务端:被动接收网络请求的一端
请求:客户端给服务端发送的数据
响应:服务端给客户端返回的数据
HTTP协议的重要特点:一发一收,一问一答
https://i-blog.csdnimg.cn/direct/741d26602bb44cd6ae5b310708dc85b5.png" width="561" />
注意:网络编程中,除了一发一收之外,还有其他的模式
多发一收:例如上传大文件
一发多收:例如看直播时,搜索一个词条可以得到多个视频源
多发多收:例如串流
三、Fiddler抓包工具介绍
抓包工具的使用:
当我们访问一个网站时,可能涉及不止一次的HTTP请求和响应的交互,为此为了更加清楚的了解我们访问一个网站时HTTP请求/协议是怎么交互的,由于HTTP是一个文本格式的协议,就可以通过以下两种方式:
方式一:通过F12打开浏览器的开发者工具,点击Network标签页,然后刷新页面。显示的每一条记录都是一次HTTP请求/响应
https://i-blog.csdnimg.cn/direct/54c2a11fec0f4f90b3dae237dda1ff5a.png" width="1905" />
方式二:抓包工具,这里以Fiddler为例,它能够直接读取你电脑上网卡的信息,网卡上有什么数据流动,它都能够感知到并且显示出来。
Fiddler使用方式:
打开Fiddler,然后打开你要访问的网站,访问该网站的HTTP请求和响应就会显示在Fiddler上
https://i-blog.csdnimg.cn/direct/7cc17a1e7f584d5b887972d6030cd6b0.png" width="1905" />
当我们选择好我们要查看的HTTP/HTTPS请求和响应时,右上栏就会显示具体的请求报文内容,右下角就会显示具体的响应报文内容。
请求和响应的详细数据,可以通过右下角的view in Notepad键通过记事本打开
为了方便我们抓取我们自己想查看的抓包结果,可以通过ctrl+a全选左侧的抓包结果,ctrl+x删除选中的所有抓包结果,再进行网页的刷新就行
相应的正文往往是被显示在浏览器上,最常见的响应格式就是html,很多网站返回的html是压缩过的(因为压缩过后,网络传输的数据量就变更少了,即节省了网络带宽),所以需要进行解压缩decode
https://i-blog.csdnimg.cn/direct/24ed48697d5b448ea8789fac09c3aff9.png" width="969" />
注意:直接安装的Fiddler是无法抓取HTTPS的请求的,需要配置才能够抓取。
抓包结果:
接下来我们抓取搜狗首页的HTTP请求,抓取到的结果如下
完整的HTTP请求:
https://i-blog.csdnimg.cn/direct/6b70d2a2239f45a29793092f854e42a9.png" width="1906" />
完整的HTTP响应:
https://i-blog.csdnimg.cn/direct/3bc0027a96754f83ac4038ccaf25508e.png" width="1906" />
抓包工具原理:
Fiddler之所以能够获取到这些HTTP请求的详细情况,主要是因为此处的Fiddler相当于一个代理程序。
代理,也可以理解为中介或代购,就比如你想通过中介去租房或者买房,你会将你的需求告诉给中介,中介就会去徐州那好哦房源并将找到的结果的详细情况反映给你。
上述我们通过Fiddler来抓取搜狗首页的HTTP请求时,首选我们会访问sogo.cn,即把HTTP请求发送给Fiddler,Fiddler再把请求转发给搜狗的服务器,当搜狗的服务器返回数据时,Fiddler就会先拿到返回数据,再把数据给浏览器。
https://i-blog.csdnimg.cn/direct/6bd009d4575d496e8e2623d443de2f76.png" width="956" />
四、HTTP协议格式总览
HTTP请求格式:
https://i-blog.csdnimg.cn/direct/d6eab00699df4cf3b1c9f939c3dfed12.png" width="1759" />
HTTP响应格式:
https://i-blog.csdnimg.cn/direct/55a54d7243fb454e9765480df56df7a0.png" width="1754" />
注意:为什么HTTP报文中要存在空行呢?
因为HTTP协议并没有规定报头部分的键值对有多少个,使用空行就相当于是报文的结束标记或报文和正文之间的分隔符
五、HTTP请求
URL 基本介绍
平时我们俗称的”网址“,其实就是 URL(Uniform Resource Locator),翻译为统一资源定位符
互连网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
URL 基本格式
URL 的标准格式如下:
协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
URLencode介绍
当我们用搜狗搜索时,通过抓包,我们会得到下面这个URL
GET https://www.sogou.com/web?query=%E8%9B%8B%E7%B3%95&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1129&sst0=1646360982664&lkt=0%2C0%2C0&sugsuv=003B56A6DA4C2A82610BB3A8CFD5D583&sugtime=1646360982664 HTTP/1.1
需要URLencode的原因:
这是因为像 /、?、: 等这样的字符,已经被 url 当做特殊意义理解了,因此这些字符不能随意出现。如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义,即 urlencode
一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义,但是仍然需要进行转义,否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号
认识方法
HTTP中的方法,就是HTTP请求报文中的首行的第一个部分。
https://i-blog.csdnimg.cn/direct/eece1dd40888476391da1a22c3b7078d.png" width="1346" />
GET请求示例:
https://i-blog.csdnimg.cn/direct/16cd21b187f24157b5bf56494cba7c36.png" width="1907" />
POST方法:
POST方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)。
POST请求示例:
https://i-blog.csdnimg.cn/direct/9f996350808a4075a40e541e1d3189f9.png" width="1907" />
经典面试题
GET和POST区别:
GET 习惯上用于从服务器获取数据;POST 习惯上是客户端给服务器提交数据
幂等是什么?
一个 HTTP 方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说,幂等的方法不应该具有副作用。
关于GET请求的URL长度问题的误解:
网上有一种错误的解释: GET 请求的长度是存在上限的,这个上限有被说成 1024kb、2048kb 等等,并且 GET 请求存在上限的原因是 URL 的长度存在上限
RFC 2616 标准正确的解释: HTTP 协议由 RFC 2616 标准定义,该标准中明确说明 "Hypertext Transfer Protocol -- HTTP/1.1," does not specify any requirement for URL length,即没有对 URL 的长度有任何限制
URL 的长度取决因素: 实际上 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现。在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的
注意:GET不仅可以传输文本数据,也可以传输二进制数据
Cookie
Cookie是什么?
Cookie 是浏览器提供的一种让程序员在本地存储数据的能力
为什么需要Cookie?
如果没有 Cookie,直接将要存储的数据保存在客户端浏览器所在的主机的硬盘上,那么就会出现很大的安全风险,比如当你不小心打开某个不安全的网站,该网站就可以在你的硬盘上写一个病毒程序,那么你的电脑就挂了!因此浏览器为了保证安全性,就禁止网页中的代码访问主机的硬盘(无法在 JS 中读写文件),因此也就失去了持久化存储的能力,故 Cookie 就很重要!
Cookie里面存储的是什么?
Cookie 中存储了一个字符串,是键值对结构的,键值对之间使用 ;
分割,键和值之间使用 =
分割
Cookie来自哪里,如何往Cookie中存储数据?
Cookie 这个数据可能是客户端(网页)自行通过 JS 写入的,也可能来自于服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据。
Cookie 在浏览器这边是按照域名维度来存储的,例如我们打开 CSDN 的首页,点击网址栏左边的一把小锁就能找到 Cookie,我们就可以看到打开这个网页时,系统按照不同域名设置了 Cookie。
https://i-blog.csdnimg.cn/direct/dab81e7230cc4144954f113836866205.png" width="1138" />
每一组都是中都存储了 Cookie,我们点开 csdn.net
这组的 Cookie 就能看到具体的数据
https://i-blog.csdnimg.cn/direct/b6add1e45dbc4196a75314a9892b3642.png" width="546" />
Cookie要到哪里去?
Cookie 字段会在后续的请求中,把浏览器本地存储的这些键值对再发送回服务器
https://i-blog.csdnimg.cn/direct/95f8d5e052124d8c9cc9344d9c1956ad.png" width="655" />
Cookie 的一个经典应用就是保持客户端的登录状态
https://i-blog.csdnimg.cn/direct/f6920d8766194a0a9fc2b5e311222d53.png" width="654" />
六、HTTP响应
状态码
200 OK 表示访问成功
404 NOT FOUND 表示没有找到资源
5xx 表示服务器内部出现错误
3xx 表示临时重定向
1xx 表示连接中间状态