目录
🚩DNS应用层协议(域名解析系统)
使用IP地址,来描述设备在网络上的位置,这种不适合进行宣传,比如https://www.csdn.net/
引入了”域名“这样的方式来解决上述问题(域名就是单词,表示了实际意义)。
需要有一套自动的系统,把域名翻译成IP地址(域名和IP想象成一组键值对)
假如的IP地址是192.168.1.0 对应的域名是 www.xxx.com。是属于一组键值对关系。
最早的域名解析系统,是通过一个简单的文件来实现的。hosts文件
#表示注释 127.0.0.1(value) localhost(key)
大概率都是注释的,hosts文件来维护域名和ip的映射关系,非常的不方便,于是就有大佬搭建了一套DNS系统(一组服务器),把上述的这样的映射关系,保存到这个服务器中。
如果你想要访问某个域名,就先给这个DNS服务器发起请求,查询一下当前域名对应的ip,然后再访问目标网站。后续域名的更新,只需要更新这一组指定的服务器即可,不需要修改每个用户电脑的hosts。
全世界,无时无刻都有很多设备需要进行DNS请求,这一组DNS服务器,能抗住怎么高的请求量嘛?
一个服务器硬件资源是有限的(cpu,内存,硬盘,网络带宽...)
服务器处理每个请求,肯定都是要消耗一定资源的,单位时间内,请求太多,消耗的总资源超过了机器本身的资源上限,机器就挂了。
这种所谓的”高并发“问题,核心思路:
1.开源
搭建DNS系统的大佬们,就开始号召各个网络运营商,你们都可以自己搭建一组”DNS镜像服务器“,镜像服务器的数据,都从他们这边来同步,此时用户就会优先访问离自己最近的镜像服务器。
2.节流
让请求量减少,让每个上网的设备,搞本地缓存,我的电脑1min之内要访问10次www.xxx.com,只是让第一次请求DNS即可,把请求得到的结果保存到本地,后面9次请求都是用第一次的结果即可。(域名的变换,没有那么频繁)
DNS服务器存取域名服务器,它可以解析出所输入域名代表的IP地址
🚩HTTP协议
HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议.
HTTP最新的版本应该是HTTP/3.0,目前大规模使用的版本HTTP/1.1
使用HTTP协议的场景:
- 1.浏览器打开网站(基本上)
- 2.手机APP访问对应的服务器(大概率)
前面的TCP/IP/UDP和这些不同,HTTP报文格式,要分两个部分来看待。(请求和响应)
HTTP协议,是一种”一问一答“结构模型的协议,请求和响应的协议格式,是有差异的。
- 一问一答(访问网站)
- 多问一答(上传文件)
- 一问多答(下载文件)
- 多问多答(串流/远程桌面)
- 当我们在浏览器中输入一个csdn搜索的”网址"(URL)时,浏览器就给csdn的服务器发送了一个HTTP请求,csdn的服务器返回一个HTTP响应。
- 这个响应结果被浏览器解析之后,就展示成我们看到的页面内容(这个过程中浏览器可能会给服务器发送多个HTTP请求,服务器会对应返回多个响应,这些响应里就包含了页面HTML,CSS,JS,图片,字体等信息)
所谓“超文本”的含义,就是传输的内容不仅仅是文本(比如html,css这个就是文本),还可以是一些其他的资源,比如图片,视频,音频等二进制的数据)
🎈理解 "应用层协议"
如何使用这个数据,我买了一个床刷子,我可以使用床刷子来刷鞋,刷衣服,等等。
我们已经学过 TCP/IP , 已经知道目前数据能从客户端进程经过路径选择跨网络传送到服务器端进程[ IP+Port ].可是,仅仅把数据从 A 点传送到 B 点就完了吗?这就好比,在淘宝上买了一部手机,卖家 [ 客户端 ] 把手机通过顺丰 [ 传送 + 路径选择 ] 送到买家 [服务器 ] 手里就完了吗?当然不是,买家还要使用这款产品,还要在使用之后,给卖家打分评论。我们把数据从 A 端传送到 B 端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节!这层协议叫做应用层协议。而应用是有不同的场景的,所以应用层协议是有不同种类的,其中经典协议之一的HTTP 就是其中的佼佼者 .再回到我们刚刚说的买手机的例子,顺丰相当于 TCP/IP 的功能,那么买回来的手机都附带了说明书【产品介绍,使用介绍,注意事项等】,而该说明书指导用户该如何使用手机【虽然我们都不看,但是父母辈有部分是有看说明书的习惯的:)】,此时的说明书可以理解为用户层协议
🎈理解 HTTP 协议的工作过程
🎈HTTP 协议格式
👩🏻💻抓包工具的使用
Fiddler把网卡上经过的数据,获取到,并显示出来。(专门抓HTTP的抓包工具)
- 左侧窗口显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
- 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
- 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开
可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果
fiddler打开之后,是一个左右结构的程序,左侧有一个列表,列出了抓到的包有哪些,右侧则是包的详情,点击某个包。新安装的fiddler需要手动开启HTTPS功能,并且安装证书(否则只能抓http),当前互联网环境上,HTTPS为主,纯HTTP非常少见了。
👩🏻💻抓包工具的原理
Fiddler本质上是一个“代理”,可能会和其他的代理软件冲突
有件事,你需要做,又不想亲自做,就可以指挥别人来做,我想吃辣条,我就可以指派弟弟来做。
弟弟代理的是“客户端”,也称为“正向代理”,超市老板的儿子,代理的是“服务器”,也叫做“反向代理”。
在上述代理的过程中,代理程序就可以获取到请求和响应的详细内容了。
一个网页打开的时候,往往不只是和服务器进行一次操作,大概率是多次操作。
raw原始的,关注,请求的最原始的数据格式。
HTTP协议是文本格式的协议(协议里的内容都是字符串),TCP/UDP/IP...都是二进制格式的协议。
HTTP响应也是文本的,直接查看,往往能看到二进制的数据(压缩后的)
HTTP响应经常会被压缩,压缩之后,体积变小,传输的时候,节省网络带宽。
解压缩之后,可以看到,响应的数据其实html,浏览器上显示的网页,就是html,往往都是浏览器先请求对应的服务器,从服务器这边拿到的页面数据(html)
👩🏻💻HTTP报头的请求和响应
🎓请求
1.首行:
HTTP请求的第一行,有三个部分信息,三个部分使用 空格 分割。
- 1>GET HTTP请求的 "方法"
- 2>URL 唯一资源定位符,描述了一个资源在网络上的位置
- 3>版本号 HTTP/1.1
2.请求头(header):
是一个键值对结构的数据(有很多键值对),每个键值对都是独占一行的,键和值之间使用:来区分,键值对之间用,来区分,这里的键值对都是属于”标准规定“的。
3.空行:
请求头的结束标志
4.正文:
有的HTTP请求有,有的没有。这里是没有的。空行后没有内容。
🎓响应
1.首行
- 1>版本号 HTTP/1.1
- 2>状态码(200)描述了请求的结果
- 3>状态码描述(OK)
2.响应头(header)
也是键值对结构(有多个键值对),每个键值对独占一行,键和值之间使用 : 来区分,键值对之间用,区分开 键值对也是”标准规定的。
3.空行
响应头的结束标记
4.正文(body)
正文头里面的内容可能会比较长,可能是多种格式, HTML,CSS,JS,XML,图片,字体, 视频,音频.....
👩🏻💻HTTP 请求 (Request)
🎓认识URL
💻URL 基本格式
平时我们俗称的 " 网址 " 其实就是说的 URL (Uniform Resource Locator 统一资源定位符 ).互联网上的每个文件都有一个唯一的 URL ,它包含的信息指出文件的位置以及浏览器应该怎么处理它 . URL 的详细规则由 因特网标准 RFC1738 进行了约定 ( https://datatracker.ietf.org/doc/html/rfc1738 )
- https : 协议方案名. 常见的有 http 和 https, 也有其他的类型. (例如访问 mysql 时用的 jdbc:mysql )
- @www.example.jp 服务器地址:可以是IP地址,也可以是域名
- 80 服务器端口号 :通过ip地址,只是描述了网络资源在哪个主机上(一个主机可能有很多服务器程序,使用端口号来区分是哪个程序) url中的端口号有时可以省略,对应http请求,端口号省略,默认是访问80端口(浏览器给一个默认值),对于https请求,端口号省略,默认是访问443端口。
- ?uid=1#ch1 :查询字符串(query string):是一种键值对结构的数据,以?开头的,键值对之间使用&来分割,键和值之间使用=来分割,一个url中的query string里包含N个键值对,甚至更长。querty string中的键值对都是程序猿“自定义”的,不像header中的键值对是标准规定的,
举个例子:
我跟同学说我要在 xx学校第6食堂,吃第18窗口。
http://xx学校第6食堂/18/螺蛳粉/原味/?香菜=不要&辣椒=微辣;
- xx学校第6食堂就是 服务器地址
- 18 服务器端口号
- 螺蛳粉/原味 自定义的
- ?香菜=不要&辣椒=微辣 query string对这次请求进行了补充说明
💻关于 URL encode
对于query string来说,如果value部分要包含一些特殊符号的话,往往需要进行urlencode操作。
像 / ? : 等这样的字符 , 已经被 url 当做特殊意义理解了 . 因此这些字符不能随意出现 .比如 , 某个参数中需要带有这些特殊字符 , 就必须先对特殊字符进行转义 .一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成 , 虽然在 URL 中没有特殊含义 , 但是仍然需要进行转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号 .转义的规则如下 : 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式例如 :"+" 被转义成了 "%2B"urldecode 就是 urlencode 的逆过程 ;中文,汉字,也需要转义
🎓认识方法(method)
💻 GET 方法和POST 方法
GET 是最常用的 HTTP 方法 . 常用于获取服务器上的某个资源 .在浏览器中直接输入 URL, 此时浏览器就会发送出一个 GET 请求 .另外 , HTML 中的 link, img, script 等标签 , 也会触发 GET 请求POST 方法也是一种常见的方法 . 多用于提交用户输入的数据给服务器 ( 例如登陆页面 ).通过 HTML 中的 form 标签可以构造 POST 请求 , 或者使用 JavaScript 的 ajax 也可以构造 POST 请求 . 在xx教务系统的登陆页面 , 输入用户名 , 密码 , 验证码之后 , 点击登陆 , 就可以看到 POST 请求 .
GET 请求的特点
- 首行的第一部分为 GET
- URL 的 query string 可以为空, 也可以不为空.
- header 部分有若干个键值对结构.
- body 部分为空.
POST 请求的特点
- 首行的第一部分为 POST
- URL 的 query string 一般为空 (也可以不为空)
- header 部分有若干个键值对结构.
- body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由header 中的 Content-Length 指定.
GET请求,通常会把要传给服务器的数据,加到url的query string中POST请求,通常把传给服务器的数据,加到body中
💻POST和GET方法的区别
1.有人说GET和POST没有本质的区别。这是正确的,虽然没有本质的区别,但是在使用习惯上,还是存在一些差异的
- GET经常是把传递给服务器的数据放到query string中,POST则是经常放到body中(使用习惯上最大的差异)——但是情况不是绝对的,GET也可以使用body,POST也可以使用query string。使用的前提是客户端/服务器都得按照一样的方式来处理代码)
- 语义上差异(虽然语义上HTTP的使用是比较混乱的,但是相比之下,GET和POST是比较明确的(GET大多数是来获取数据的,POST大多数是用来提交数据(登录+上传)
2.GET请求传递数据不安全,POST请求传递数据更安全 这是错误的说法
- 依据是:如果使用get请求来实现登录,点击登录的时候,就会把用户名和密码放到urL中,进一步的显示到浏览器地址栏中(那么就会被别人看见),相比之下,POST则是在body中,不会在界面中显示出来,所以更安全。其实这里安全只是针对计算机小白来说的,对于黑客获取的成本并不高(下载一个fiddler即可),安全是你传递的数据,不容易被黑客获取,或者被黑客获取到之后,不容易被破解。
这个密码,是属于一抓包拿到了(拿到抓包结果,成本并不高的),但是这个密码是加密的,及时拿到了,也没法破解。此时的安全性和post无关,关键在于加密。
3.GET只能给服务器传输 文本数据,POST可以给服务器传输文本和二进制数据 这也是错误的说法。
1>GET也不是不能使用body(body中式可以直接放二进制的)
2>GET也可以把二进制数据进行base64转码,放到url的query string中
1>GET请求是幂等的,POST请求不是幂等的 [不够准确,但是也不是完全错]
幂等就是 相当于 吃进去的是草,挤出来的是奶,如果任何时候吃草,挤出来的都是奶,就是幂等的,如果吃草之后,不同时候挤出来的东西不一样,就不是幂等的。(就比如你搜索https://www.baidu.com每次搜出来都是百度的页面这就是幂等,如果下一次出现的不是百度的页面那么说明不是幂等的)
GET和POST具体是否是幂等,取决于代码的实现。GET是否幂等,也不绝对,只不过RFC标准文档上建议GET请求实现成幂等的。
比如一个广告搜索,广告数据就是通过GET请求获取的,这些GET请求涉及的时候一定是不幂等的,这里出哪些广告,广告的顺序,背后涉及到一系列复杂的逻辑。
2>GET请求可以被浏览器缓存,POST不可以被缓存(幂等性的延续,如果请求是幂等,自然就可以缓存)
3>GET请求可以被浏览器收藏夹收藏,POST不能(收藏的时候可能会丢失body)
🎓认识header
header里面的关键字比较多,我们主要挑重要的说。
💻Host
表示服务器主机的地址和端口 .这个信息在url中也是存在的,比如,在使用代理的情况下,Host的内容可能和url中的内容不同的。💻Content-Length
表示 body 中的数据长度 .💻Content-Type
表示请求的 body 中的数据格式 .(请求里有body,才会有这两个属性,通常情况下GET请求没有body,POST请求有body。由于TCP涉及到粘包我呢提,HTTP在传输中是基于TCP的,使用同一个TCP连接,传输多个HTTP数据包,此时,就会使多个HTTP数据包在TCP接收缓冲区挨在一起,接收方解析的时候,就需要能够清楚HTTP数据包之间的边界。
- 对于GET这种没有body的请求,直接使用空行(分隔符)(有俩个空行)
- 对于POST这种有body的请求,就结合 空行 和Content-Length (一个空行之后有一个body)
body中的格式,可以选择的方式是非常多的
请求:
- 1.json
- 2.form 表单的格式
- 3.form-data的格式
响应:
- 1.html
- 2.css
- 3.js
- 4.json
- 5.图片
💻User-Agent (简称 UA)
前面是操作系统版本,后面是浏览器版本,UA描述你使用啥设备上网。现在浏览器的差异不是很大了,UA现在主要用来区分PC端还是移动端。做这样的区分,一般只是为了进行统计,而不会返回不同版本的页面,现在前端开发者,有“响应式网页”编程技术,同一个html很好的兼容不同的设备。UA中记录了浏览器的版本,哪个版本的浏览器都支持哪些特性,是容易获取的,网站开发者就可以看看UA里的内容。
💻Referer
Referer描述了当前页面是从哪个页面跳转来的。
如果直接在地址栏输入url(或者点击收藏夹中的按钮)都是没有Referer
💻Cookie
每个不同的域名下都可以有不同的 Cookie, 不同网站之间的 Cookie 并不冲突
浏览器的数据来自于服务器,浏览器后续的操作,也是要提交给服务器的。服务器这边管理了一个网站的各种核心数据,但是程序运行过程中,也会有一些数据,需要在浏览器这边存储的,并且后续请求的时候数据可能需要再发给服务器。(上次登陆时间,上次访问时间,用户的身份信息,累计访问次数....)这些临时性数据存储在浏览器比较合适的。
实际上更容易想到的是,把这样的数据直接存储到本地文件中,但是实际上是不可行的,浏览器为了考虑到安全性,禁止网页直接访问你的电脑文件系统,网页代码中也就无法直接生成一个硬盘的文件来存储数据了。
为了保证安全性,又能进行存储数据 ,于是引入了Cookie(也是按照硬盘文件的方式保存的,但是浏览器把操作文件给封装了)网页只能往Cookie存储键值对。
- Cookie往往是从服务器返回的数据(也可以是页面自己生成的)
- Cookie存储到浏览器所在主机的硬盘上,并且按照域名为维度来存储的饿(每个域名下可以存自己的Cookie,彼此之间不影响)
- Cookie是按照键值对的形式来组织的,这里的键值对也都是程序员自定义的(和query stirng差不多)
后续再请求这个服务器的时候,就会把Cookie中的内容自动代入到请求中,发给服务器,服务器通过Cookie的内容做一些逻辑上的处理。
键值对之间使用 ;分割,键和值之间使用=分割。
这些内容就是浏览器本地存储的cookie,都会再后续请求服务器的时候,把这些内容给代入到请求中,传给服务器。
👩🏻💻HTTP响应
🎓认识 "状态码" (status code)
💻200 OK
这是一个最常见的状态码 , 表示 访问成功
💻404 Not Found
没有找到资源.
浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存在, 那么就会出现 404 ,例如, 在浏览器中输入 www.sogou.com/index.html , 此时就在尝试访问 sogou 上的 /index.html 这个资源. 如果输入正确, 则可以正确访问到. 但是如果输入错误, 比如www.sogou.com/index2.html , 就会 看到 404 这样的响应.💻3xx表示重定向
请求中访问的是A这样的地址,响应返回一个重定向报文,告诉你应该要访问B地址。
很多时候,页面跳转就可以通过重定向来实现,还有的时候,某个网站,服务器迁移了(IP/域名改变了),就可以给旧的地址挂一个重定向响应,访问旧地址的用户就自动跳转到新地址上去了。
💻403 Forbidden
表示访问的资源没有权限。
💻5xx
表示服务器出错了,看到这个说明服务器挂了。
👩🏻💻构造HTTP请求
构造HTTP请求的简单方法是,用第三方工具 ,图形化界面。POSTMAN
自己的感受永远置顶。