1.URL:
- URL 就是浏览器地址栏里的网址
- URL:唯一资源定位符(用这个来找到网络上的资源),尽管是在HTTP这一节内容中介绍URL,但是url不是HTTP独有的,很多其他协议也可以使用。
URL重要的部分:
1. IP地址+端口号
2. 带层次的路径
3. 查询字符串
- 在URL中,会将特殊的字符进行转义(这里转移的范围不仅仅是特殊符号还有汉字)这个过程就是url encode(编码)。转义的规则是将需要转义的字符转为16进制,一个字节带一个%,一个汉字就有3个%。例如:c++ 转义为c%2B%2B;大碗扒饭 转义为%E5%A4%A7%E7%A2%97%E6%89%92%E9%A5%AD。
- 和url encode(编码)相反的就是url decode(解码),解码也就是编码的逆过程。
2.HTTP协议:
- HTTP是应用层的典型的协议 !http协议是前后端交互的桥梁!
- 在浏览器中输入一个网址,稍等片刻就看到了网页;这个过程就是http和服务器进行了通信。
- 学习阶段,主要学习的就是HTTP报文格式,此处的报文格式描述了http请求是啥样的,响应是啥样的
- http这个协议属于最典型的“一问一答”模型的协议。http也是一个文本格式的协议。
2.1抓包工具(这里用fiddler):
- 我们需要借助到“抓包工具”来捕获请求交互的详细情况,借助抓包工具来分析HTTP协议格式 。
- 什么是抓包工具呢,这是个特殊的软件相当于一个代理程序,浏览器给服务器发送的请求就会经过这个代理程序,进一步就能分析出请求和响应的结果如何。
- 举个例子:我是个懒人,有天很想喝可乐,于是就让我弟弟下楼给我买。他不乐意,我说你去买可乐我就给你money买包辣条,我弟弟就去买了。至于怎么买的和老板之间如何交易的我不知道,但是我弟知道。抓包工具的作用就是借助我弟来知道浏览器和服务器之间具体的交互细节。
- 代理一共分为俩种,正向代理和反向代理。正向代理是和客户端服务紧密,服务器不知道真实的客户端是啥;反向代理是和服务器紧密,客户端不知道真实的服务器是啥。上面的例子里我弟弟就是个正向代理。
2.2请求和响应的格式:
- 请求报文,构造一个http请求本质上就是往一个TCP socket中,按照下列格式来写入数据即可。
请求的格式:
1.首行: 方法+URL+版本号
2.header: 这里是按行组织的键值对(有固定的含义),
每一行是一个键值对(键和值之间使用:来分割)
3.空行: (意味着header结束了)
4.body: 正文部分(json或其他格式)
- 响应报文,
响应的格式:
1.首行: 版本号+状态码+状态码描述
2.header: 这里是按行组织的键值对(有固定的含义),
每一行是一个键值对(键和值之间使用:来分割)
3.空行: (意味着header结束了)
4.body: 正文部分(json、html、css、js、图片......)
2.3方法的介绍:
- 方法是可以理解为请求想干嘛!最常见的请求就是GET(获取资源)和POST(传输)。
- 构造出GET请求:a).浏览器地址栏直接输入URL,此时就会触发GET请求。 b).html中的link、a、img、script标签也会触发GET请求,href/src都会引用一个外部资源, 本质上就是浏览器会重新发送一个GET请求来从服务器拿到对应的数据。 c).form表单(html中的form标签,可以构造出GET请求)。 d).ajax 。 e).使用第三方工具(postman)。
- “缓存”:一个浏览器加载出一个页面,往往需要经过多重HTTP请求的交互。浏览器在加载页面的时候往往要加载这个页面依赖的很多其他资源(这样会消耗很多时间),为了提高页面加载的效率,浏览器就会将加载过的一些资源保存在本地的磁盘上(下一次在访问同一个网页,就不必重新从网络加载而是直接读取硬盘即可)。
- GET请求的URL长度是没有限制的,也可以有长度的上限这取决于具体的代码实现。
- GET请求的特点:
1.首行的方法为GET
2.首行的URL中query string可以为空也可以不为空
如果需要给服务器传递一些参数,往往是通过query string传过去的
3.header部分有若干个键值对结构
4.body部分通常为空
- 构造出POST请求:a).form表单。b).ajax。c).使用第三方工具(postman)。
- POST请求的特点:
1.首行的方法为POST
2.首行的URL中通常没有query string
3.header部分有若干个键值对结构
4.body通常是有的,格式有多种
如果需要给服务器传递一些信息,往往是通过body传过去的
- 【经典面试题】说说GET和POST的区别:第1步,先盖棺定论;GET和POST没有本质区别,使用GET实现的场景基本上也可以使用POST,使用POST实现的场景基本上也可以使用GET。第2步,再来说细节上的区别;1.语义的不同: GET是从服务器上获取数据,POST是往服务器上发送个数据。2.使用习惯的不同: 给服务器传递数据时,GET通常放在首行url的query string中,而POST则放在body中。3.GET请求建议实现成“幂等”的,POST一般则不要求实现成“幂等” 。啥是幂等?大概就是输入是确定的,输出结果也就是确定的了,这就是幂等!4.在幂等的基础之上,GET请求结果是被缓存的,POST一般不会被缓存,如果当前的GET是幂等的,那就不用处理,让浏览器缓存就行 如果当前的GET不是幂等的,就需要通过特殊技巧不让浏览器缓存 (典型的技巧就是让每次GET请求的URL都不同)。
- 关于POST比GET更安全这种说法,首先这种说法是错误的!依据是GET把参数以query string的形式放到url里直接就显示到地址栏里了,被人直接看见了不安全;POST是把参数放到body中,body也可以被拿到,例如我们使用的抓包工具fiddler。因此GET和POST都不安全。
2.4请求报头(header):
- 请求头header的键值对都是标准规定的有特定的含义,也可以存放自定义的键值对。下面介绍一些常见的键值对。
- Host:表示服务器的 ip+端口号;例如:
- Host中的端口可以忽略不写,忽略就表示默认值(http默认80,https默认443)。
- 首行的URL不也有服务器的ip和端口号嘛,为什么还要再header里面搞一个Host呢?因为事实上这俩个的ip和端口号不一定完全一样,比如请求时经过代理来访问的时候可能就不一样了。
- Content-Length:表示body的长度;Content-Type表示body中的数据格式。这俩个字段不一定会有,但是如果有一个就会有另外一个,同时出现!请求中有body,则一定有这俩个字段。
- HTTP协议3.0之前的版本在传输层是基于TCP的,TCP是面向字节流的就会有粘包问题。解决粘包问题的方法有约定一个分隔符或者是约定报文的长度。
- Contenet-Type表示请求的body的数据格式,常见有以下三种:
- User-Agent(简称UA):观察发现UA主要包含的信息就是操作系统信息和浏览器的信息。因此UA描述了用户使用什么设备进行上网。
- Referer:表示从哪个页面跳转过来的(上级页面是啥),是一个可有可无的字段。需要注意的是:如果直接从浏览器的地址栏里输入URL或者是从收藏夹里打开页面都是没有referer的。referer可以用来实现点击计费(cpc广告)。
- Cookie:是浏览器在本地存储数据(存放到硬盘上)的一种机制,cookie是请求头中的一个重要字段。每个Cookie都是一个键值对。cookie和query string一样都是程序员自定制的。
- Cookie是按照域名维度来组织的,不同的域名下有不同的Cookie,一个网站发起的http请求可能是来自于多个域名的。
- Cookie不是缓存,是持久化存储数据的手段,浏览器自动帮你存储,这个存储是保存到硬盘上的;而缓存的数据不一定是持久化的(也可以在内存里缓存);缓存的数据是用来提高访问速度的!
- Cookie这里的键值对都是简单的字符串,只能存放一些简单的信息,例如:上次访问页面的时间,当前网页的访问次数,当前访问页面的身份信息(身份标识,id)等。
- Cookie从哪里来?Cookie是存在浏览器的本地,来源是服务器。上图中的这些Cookie都是浏览器访问了服务器之后由服务器返回的,在服务器返回的响应报文中,可以在响应header中包含一个或多个Set-Cookie这样的资源,浏览器看到这些Set-Cookie就会把这样的数据保存在浏览器本地。
- Cookie到哪里去?来自于服务器,存储于浏览器,还要再返回到服务器。当浏览器保存了Cookie之后下次浏览器访问同一个网站,就会把之前本地存储的cookie再通过http请求header中的cookie给带回去。如果达到了过期时间,Cookie也会自动的被清除掉。
- 为什么要有这个一来一回,绕圈的过程呢?服务器要服务的客户端是很多的,这些不同的客户端应该要有不同的数据、只有返回了,服务器才知道客户端的详细情况。
- Cookie典型的应用场景,在客户端维持登陆状态。在某个网站上登陆成功之后,浏览器就会记住当前登录用户的身份信息,然后在接下来的访问网站的其他页面,服务器也能知道是谁在登录。
- 如果不维持登录场景,那你总不能每次打开一个B站网页都要重新登录吧?!
- 举个例子:去医院看病的过程就和Cookie的登录认证的过程是一样的。
2.5状态码:
- http响应首行的状态码是一个数字,这个数字描述了当前这次请求的”状态“(成功、失败、失败的原因)。状态码都是有明确规定的,下面介绍几次常见的。
- 200 OK:标识访问成功
- 404 Not Found:常见的错误,意思是请求的路径url写错了。如果你想访问的资源服务器上没有,此时就会返回404。
- 403 Forbidden:访问没有权限,拒绝访问。404和403本质上都是客户端有问题出错了,都是4开头。
- 500 Internal Server Error:服务器内部错误,意味着服务器内部出bug了。
- 504 Gateway Timeout:访问超时了。500和504都是服务器这边出的问题,都是5开头。
- 302 :重定向。某个网站域名更新了,访问旧的域名就跳转到新的域名上(过渡阶段就可以使用重定向)。
2.6响应报头(header):
- 响应报头的基本格式和请求报头的格式基本上是一致的。
- 在响应中的Content-Type常见取值有这几种:
text/html -> body的数据格式是html
text/css -> body的数据格式是css
application/javascript -> body的数据格式是javascript
application/json -> body的数据格式是json
- 响应的基本格式取决于响应header中的content-type。
2.7构造http请求:
- 都是基于前端(围绕浏览器)来构造HTTP请求。
- 只要是可以操作网络的(能够进行socket编程的)就一定可以构造出http请求(往一个tcp socket 里写一个符合http协议格式的字符串)。
- 有这几种构造方法:
1.浏览器自己构造的(地址栏里写url,构造出get请求);
点击a标签也会构造出get请求;
img、link、script也会构造出get请求。
2.form
3.ajax
4.postman就属于一个专门用来构造http请求的第三方工具
3.HTTPS协议:
- 为了反制运营商的劫持保护网络上传输的数据安全,HTTPS就被大规模普及了。
- HTTPS也是一个应用层的协议,是在HTTP协议的基础上引入了一个加密层,来保护用户传输的信息安全。
- 明文:要传递的原始信息;密文:加密过后的信息;密钥:密文使用密钥就可以得到明文。
- 加密的方式有很多种,整体分为俩类:对称加密和非对称加密。对称加密是加密和解密使用同一个密钥,非对称加密是加密和解密使用不同的密钥。
- 对称加密:加密最简单的做法就是对称加密,最简单的对称加密就是按位异或,a^b^b = a。一个服务器要给很多客户端提供服务,这些客户端使用的是不同的密钥;典型的做法就是每个客户端在建立连接之初先生成密钥,然后进行通信的时候先把自己的密钥发送给服务器。
- 客户端发送的密钥也不能是明文传输,否则被黑客拿到,后面的加密过程也就是形同虚设了。那我们是不是还要对密钥进行加密,这样一直套娃下去???
- 为了解决上述的问题,就引入了非对称加密。让服务器生成一对非对称密钥,加密使用一个密钥,解密使用另一个密钥,这俩是成对的,知道一个无法推测出下一个。
- 非对称加密是让服务器生成一对非对称的密钥,一个是公开的任何人都可以拿到(公钥);一个是私密的只有服务器自己知道(私钥)。客户端就可以先从服务器拿到服务器的公钥,然后使用这个公钥对自己生成的对称密钥进行加密;由于外界只知道公钥,私钥只有服务器才有(黑客拿不到),只有服务器可以使用私钥对上述的请求进行解密了。
- 既然都引入了非对称加密,为啥还要对称加密呢?对称加密开销成本较低,非对称加密开销成本大。
- 上述非对称加密的情况,黑客还是有办法入侵的,通过”中间人攻击“。先举个例子:上学的时候,我喜欢一个妹子,但是害羞腼腆不好意思主动约妹子看电影,于是就找了另外一个妹子让她帮我给心仪的妹子捎个话,本来心仪的妹子就答应去看电影了,但是捎话的妹子十分嫉妒于是就和你说心仪的妹子拒绝了,我只能留下一个孤独的背影…...
- 中间人攻击:
- 中间人攻击的关键就是要能够证明当前这个公钥是服务器自己的公钥,而不是伪造的。为此引入了”证书“。
- 上面说的这一套https的对称加密+非对称加密+证书,这套流程不是HTTPS独有的,这套机制属于一个专门的协议 SSL / TLS(不同的叫法)(HTTPS = HTTP + SSL)。
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹
如果对您有帮助的话,
不要忘记点赞+关注哦,蟹蟹