文章目录
HTTP
网络三要素: 网络存在的本质就是获取远程资源
URL: 指示一个资源在网络上的位置 HTML: 一个资源的格式 HTTP: 标识资源怎么在网络上传输
1, 网络模型: 补充
网络是一个非常复杂的系统,不仅仅包含大量的硬件设备、应用程序,还有各种各样不同的协议组成,我们人为的将各种不同的协议按照功能的不同,划分成了不同的层次。最常见的是OSI参考模型和TCP/IP模型。每一层实现各自的功能和协议,并完成与相邻层的接口通信。即某一层通过接口调用下层,并且通过接口提供给更高一层。
-应用层:最靠近用户的一层。给用户直接提供网络服务。常见的应用层协议有HTTP、HTTPS、FTP、SFTP等。 - 传输层:建立端到端的链接。传输层的作用是为上层协议提供端到端的可靠且透明的数据传输服务。TCP、UDP便是属于该层的协议。 - 网络层:利用IP寻址来建立两个节点之间的连接。将发送端的传输层传递过来的数据通过选择合适的路由,准确的传递给接收端的传输层。也称之为IP协议层。 - 链路层:将有差错的物理线路转换成无差错的数据链路,向网络层提供高质量的数据传输服务 - 物理层:最终信号的传递都需要借助于物理层来实现
2, HTTP协议
协议,是在网络通讯过程中协议主要指的是约定着通讯双方在传递信息时应当具有的格式。
HTTP的全称Hyper Text Transfer Protocol(超文本传输协议).超文本指的是超越了普通的文本,不仅仅是文本,还有音视频、图片等;传输指的是通讯双方互相之间进行传递数据;协议指的是互相传递数据时数据的格式。
而HTTP也是互联网资源访问的三要素之一。(Tim Bernes Lee)
WEB浏览器、客户端等和服务器之间的一问一答的通讯过程中必须遵守一定的规则,也就是双方互发信息时,信息具有的格式,叫做HTTP协议。HTTP协议是学习 WEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
2.1, HTTP协议的工作流程
HTTP协议的工作流程
- 1, 域名解析:解析出域名对应的ip地址。具体可以分为如下几个步骤: - 浏览器缓存:浏览器首先查找自身DNS缓存,如果找到则结束,找不到则进入下一个环节 - 操作系统缓存:查找操作系统缓存,找到则结束,找不到则进入下一个环节 - hosts文件:查找hosts文件中的配置信息(note:localhost、127.0.0.1等永远代表的是本机)(C:\Windows\System32\drivers\etc) - DNS服务器:向本地配置的DNS服务器发起域名解析请求;找不到则最终解析失败 - 注意: 域名是一串具有特殊含义的字符。在网络通讯过程中,计算机之间相互识别需要通过ip地址来进行识别,但是ip地址较难记忆,不容易被人记忆。因此设计出了域名。一个特殊含义的字符指代一个特定的ip地址。人在访问时输入域名,需要借助于一系列的措施将域名解析成为ip地址
- 2, TCP三次握手:在大多数的情况下,客户端和服务器之间建立的连接都是TCP连接。因此需要进行TCP三次握手,建立一个可靠的TCP连接。
- 3, HTTP请求:TCP连接建立之后呢,客户端会根据用户输入的地址,给用户生成相应的HTTP请求信息并发送到服务器(HTTP请求报文藉由传输层、网络层、链路层从客户机主机发出,在网络中进行路由中转传输,到达服务器主机)
- 4, HTTP响应:服务器接收到客户端发送过来的信息之后,解析出请求,并且做出响应(HTTP响应报文再藉由传输层、网络层、链路层从服务器主机发出,在网络中中转传输,到达客户端)
- 5, 解析HTML:服务器发出的HTTP响应信息被浏览器接收到之后,浏览器对于HTTP响应信息加以解析
- 6, 渲染页面:浏览器将静态资源文件以及HTML标签等进行渲染,呈现给用户
2.2 HTTP请求
HTTP: 协议, 可以帮我们把一个请求在应用层变成一个HTTP报文格式
客户端发送给服务器的信息,称之为请求信息;服务器返回给客户端的信息称之为响应信息。一般情况下,我们也将发送的信息称之为报文(HTTP报文)。即HTTP请求报文和HTTP响应报文。
发送的HTTP请求一般称之为
HTTP请求报文
,分为请求行
、请求头/消息头
、空行
、请求体/请求正文
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.GET http://www.baidu.com/ HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml; Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: __yjs_duid=1_94c0d6c26a48d04ztHBDp1OrzJxavJbibLH2u7JlFEirZPMlmtowns; 请求正文/请求体
POST http://1.117.106.224:8084/api/mall/addOrder HTTP/1.1 Host: 1.117.105.224:8084 Connection: keep-alive Content-Length: 68 Accept: application/json, text/plain, */* Authorization: Bearer admin User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Content-Type: application/json;charset=UTF-8 Origin: http://1.117.105.224:8085 Referer: http://1.117.105.224:8085/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 {"token":"admin","goodsDetailId":1354,"state":0,"num":1,"amount":50}
2.2.1 请求行
请求行的构成:
请求方法
请求资源
请求协议
GET http://www.cskaoyan.com/ HTTP/1.1
POST http://1.117.105.224:8084/api/mall/addOrder HTTP/1.1
请求方法: 必须记住get和post的区别
- 请求方法,顾名思义就是以何种请求方法向当前的地址发起请求。常见的请求方法有GET和POST两种。GET和POST请求方法主要的区别在于语义上面的不同。 -1, GET主要用来进行查询数据,POST主要用来进行提交数据。这才是GET和POST本质上的区别 -2, 至于请求参数的位置不同,不是GET和POST之间的本质区别,仅仅是浏览器的默认行为。对于浏览器来说,浏览器在发送GET请求时,会将请求参数附着在地址栏,也就是请求报文的请求资源后;发送POST请求时,请求参数会位于请求体中,但是这仅仅是浏览器的行为,不是两者之间的本质区别。 -3, 安全性区别
其它请求方式: 了解:
PUT请求: 上传资源/数据 (eg: 上传到后端服务器一个大文件) DELETE请求: 删除资源/数据 HEAD请求: 获取响应头信息 (一般是用来请求有没有人接收请求, 请求的要求) OPTIONS请求: 获取请求方式/测试链接
如何发送GET或者POST请求?
// 发送GET请求的方式有两种: 1.浏览器地址栏输入地址默认就是get方法 2.form表单方法设置method=get // 发送POST请求的方式:form表单方法设置method=post
请求资源
- 访问两个不同页面时,主要的区别在于请求资源不同。它是一个给目标服务器的重要标识. - 是一个URL
请求协议
- 目前HTTP协议的版本是HTTP/1.1,之前的一个版本是HTTP/1.0。 - 1.0和1.1之间最大的区别在于是否支持长连接。长连接就是在一个TCP连接内发送多个HTTP请求。HTTP/1.1默认支持长连接;HTTP/1.0不支持长连接。所以1.1相较于1.0,网络访问速度会有明显提升(前提是, 在一定时间之内, 向某个域名/ip地址下, 发送了多个http请求)。
2.2.2 请求头
请求头是HTTP请求的客户端要告诉服务端的一些请求信息
Accept: 告诉目标服务器,作为用户想要的资源类型. 浏览器可接受的
MIME类型
写法为(大类型)/(小类型)
。 MIME就是使用一种大类型/小类型的方式将互联网上面的资源进行分类。比如text/html,text/txt,image/jpeg,image/png,video/mp4,video/mp3等。因为客户端和服务器在相互通讯时,需要知晓对方传递的资源类型。Accept-Charset: 浏览器通过这个头告诉服务器,它(浏览器)支持哪种字符集。
Accept-Encoding: 浏览器能够进行解码的数据编码方式,比如gzip。请求头是给服务器看的,意思是指如果服务器返回响应时需要对数据进行压缩,设置编码方式,那么应当使用客户端可以支持的编码方式。
Accept-Language: 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到,可以在浏览器中进行设置; eg: https://www.google.com/search?q=123
Host: 初始URL中的主机和端口。
Host: www.cskaoyan.com ( 这句话, 代表找一个叫Host的主机 , 在这 主机 != 服务器/电脑; 虚拟的主机)
- Referer: 包含一个URL,用户从该URL代表的页面出发访问当前的请求 (防盗链);
比如用户直接访问B页面,以及通过访问A页面,进而跳转至B页面,这两种方式都进入到B页面,那么两种方式在HTTP请求报文中有没有区别呢?(eg: http://www.cskaoyan.com/forum-280-1.html )
Content-Type: 一般就是MIME类型,因为服务器和客户端在相互传递数据时,需要让对方知晓资源的类型,是文本文件或者是二进制文件等。
Content-Length: 表示请求消息正文的长度。也就是请求体的长度
If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT 时间标识
服务器利用这个头与服务器的文件进行比对,如果一致,则告诉浏览器从缓存中直接读取文件
User-Agent: 浏览器类型
Connection: 表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 )
Cookie: 这是最重要的请求头信息之一
Date: Mon, 22 Aug 2023 01:55:39 GMT请求时间GMT
2.2.3 空行
仅做标识使用: 标识用来区分请求头从哪结束, 标识请求正文从哪开始
2.2.4 请求正文/请求体
请求体中一般用来传输客户端需要传递给服务器的数据信息等。该部分可以大量的存放数据,比如当客户端需要提交一个文件到服务器时, 比如用户需要传输给服务器一些安全保密的信息,那么就可以将文件的数据放置在请求体中。
2.3 HTTP响应
服务器发送的HTTP响应一般称之为HTTP
响应报文
,分为响应行
、响应头
、空行
、响应体
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.HTTP/1.1 200 OK Date: Mon, 06 Mar 2023 13:21:40 GMT Content-Type: text/html; charset=gbk Content-Length: 7111 Connection: keep-alive Set-Cookie: cZBD_2132_lastact=1678108900%09forum.php%09; expires=Tue, 07-Mar-2023 13:21:40 GMT; Max-Age=86400; path=/ Vary: Accept-Encoding Content-Encoding: gzip YJS-ID: c39171ed0b3336b2-140 Server: yunjiasu ? 韂鸖W桛9蠶?;柩?僐?癞_k3;揑エVw#5H轁?B鍙q让?3?丶尡?c懒@釺jf抣矙<v2轞Jj瞎凞?└?u奉=鬓餅筝s谓倴?ut縫笅I?s睇鱱0>0鴽HG0刭萆?6b?N?CRd.v?緮aū`0
HTTP/1.1 200 Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers Access-Control-Allow-Origin: * Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Tue, 10 Oct 2023 07:09:32 GMT a {"code":0} 0
2.3.1 响应行
//协议 状态码 原因短语
HTTP/1.1 200 OK
版本协议: HTTP/1.1
状态码: 比较常见的: 200 400段 500段
-100: 100段 (相当于废弃状态) -200: 正常(请求响应成功) -301、302、307 重定向 (http://bing.com/) -404 未找到(资源不存在) (对于我们Java程序员: 404出现一般是配置性问题) -500 服务器内部错误(我们服务器开发的代码有问题)
原因短语(可选的, 不一定有)
-成功或者失败. (不重要,从语法上可以随意写)
2.3.2 响应头
- Location: http://www.cskaoyan.com/指示新的资源的位置。要搭配着重定向状态码一起使用。指引浏览器往改地址再次发起请求。
- Server: apache tomcat 指示服务器的类型
- Content-Encoding: gzip 服务器发送的数据采用的编码类型
- Content-Length: 80 告诉浏览器正文的长度。响应体的长度。
- Content-Language: zh-cn服务发送的文本的语言
- Content-Type: text/html; 服务器发送的内容的MIME类型
- Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT文件的最后修改时间
- Refresh: 1;url=http://www.cskaoyan.com指示客户端刷新频率。单位是秒
- Content-Disposition: attachment; filename=aaa.zip指示客户端保存文件
- Set-Cookie: SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie: 非常重要
- Cache-Control: no-cache (1.1)
- Connection: close/Keep-Alive
- Date: Tue, 11 Jul 2000 18:23:51 GMT
2.3.3 空行
标识使用
2.3.4 响应体/响应正文
也叫作响应正文。可以是文本数据也可以是二进制类型数据。其中响应头中Content-Type指示了该资源的类型,比如文本类型资源时,Content-Type:text/html;图片资源时Content-Type:image/png;Content-Length指示了响应体的长度。
2.4 HTTPS: 了解
HTTP协议具有非常优秀的一面,但是也有很多不足之处,具体体现如下:
- 通讯使用明文(未加密),内容可能会被窃听
- 不验证通讯方的身份,可能遭遇伪装
- 无法验证报文的完整性,内容可能被篡改
HTTPS分别引入了"“加密算法”“、”“证书”“、”“完整性保障”"来解决对应的问题
3, 抓包: 重中之重
抓包: 就是通过分析用户发起的所有请求, 获得一些关键信息
// 哪些关键信息 // 1, 请求有没有发 // 2, 请求发走了, 有没有返回: 200? 404? 300? 500? // 3, 请求的url对不对: ip地址 和 端口 , 是不是我想要发往的地址 // 服务器内部路劲对不对 // 4, 请求方式: 是否正确, 请求是get, 要求接收的服务器也是get; 或者都是post // 5, 检查请求的参数是否正确: 参数单词拼写问题. 数据类型对不对. 数据格式构成是否正确 // 6, 请求正常返回200: 检验返回的参数是否正确 // 7, 整体前后端请求顺序和逻辑是否正确
-
使用Fiddler进行抓包
fiddler安装完毕之后,无需做任何设置,打开软件,便可以将网络行为记录下来。需要特别注意的是浏览器不可以开启代理。fiddler默认情况下只可以抓取http协议的请求及响应报文,无法抓取到HTTPS协议。
使用chrome浏览器进行抓包
浏览器会根据用户输入的地址发送HTTP请求,同时,响应也是被浏览器解析渲染,所以,浏览器肯定可以得知请求报文和响应报文的格式,浏览器的开发者工具可以让开发者看到请求报文和响应报文的信息