HTTP
HTTP3.0!=Web3.0
Web3.0=》区块链圈子里造出的一个名词是对于未来的一种美好憧憬短时间之内(20年之内)很难到达~
HTTP3.0,则是基于UDP协议实现的.(人家在应用层实现了一套可靠传输机制)
应用场景:
1.网页->服务器之间的交互 =》虽然HTTP作用很大,应用很广,但是实际开发中,不一定
2.手机app->服务器之间的交互 是真正直接使用HTTP更大的概率是使用HTTPS
HTTP是典型的“一问一答”这种模式的协议。
多问一答 上传大文件的时候
一问多答 下载大文件的时候
多问多答 远程桌面/游戏串流
抓包工具:能够把网络上传输的HTTP数据获取到,并且显示出来
代理,可以分成两种角色
1)正向代理 帮客户端跑腿的
2)反向代理 帮服务器跑腿的
超市儿子为反向代理
自己儿子为正向代理
HTTP抓包工具,种类很多。
1)浏览器(chrome内置了抓包工具
2) Wireshark 老牌的知名的抓包工具
3))Fiddler也是一个老牌的抓包工具。
这些结果,都是浏览器打开bing网页的时候给bing发送的http/https的请求数据.
蓝色的,服务器返回的是HTML
数据黑色的,返回的是普通的数据
HTTP请求报文
一个HTTP请求报文,分成4个部分
1)首行
三部分:
a)请求的方法GET
b)请求的URL(请求的对方的网址)
c)版本号
HTTP/1.1
2)请求头(header)
每一行一个键值对,键值对的方式,通过:来分隔键值对
最终是一个空行。
3)空行
最后一个header后面,存在一个空行.类似链表,使用null作为结尾
4)正文body
http的body相当于tcp/ip等协议的载荷一样.
可以是完整的html,也可以是完整的css/js,也可以是json数据,也可以是图片,也可以是文件,也可以是字体..(可以放任何你想传输的数据)
json结构的数据~~这个数据就包含了客户端(浏览器)要给服务器传输的一些必要数据~~
HTTP响应
HTTP响应这里大概也是有4个部分的
1)响应的首行
HTTP/1.1200OK
a)版本号 HTTP/1.1
b)状态码 200
c)状态码描述 OK
2)响应的报头header
3)空行
4)正文
正文中本来就是保存啥都可以
有空行,没有空行都行,都是表示“内容"
这些空行没有特定含义
只有HTTP数据包中的第一个空行,才是header的结标记.
小结:
HTTP协议,请求格式/响应格式重点掌握的.(开发+面试重点)
调试程序,抓包工具,HTTP协议报文的理解,都是非常常用的技能。
这里蕴含了服务器端口号,默认的https的端口号是443
http的端口号是80
这个端口是服务器的端口这个端口是目的端口~服务器这边自己决定的端口
登录信息(认证):上古时期的方式现在都没有人这么进行登录了.
服务器地址:要访问的服务器是哪个,IP地址/域名
带层次的文件路径:描述了要访问服务器的哪个资源个服务器可以提供很多资源供外界访问比如,web服务器(网站),就可能会包含很多就可以通过这里的路径区分不同的网页了,
片段标识符:区分页面中的不同部分的(文档类网站)目录/导航。
查询字符串:可以完成一个页面内的网页跳转。
结合IP确定主机
结合端口号确定主机上的程序==》结合上述三个部分就可以确定互联网上的唯一一个资源了.
结合路径确定程序里的哪个资源。
小知识:
查询字符串,就是一些“参数通过参数,把一些客户端想传给服务器的数据告知过去。
查询字符串也是键值对结构
bddn=9027558936136805
&brnd=6014570413749830
&query=%CF%CA%BB%A8%CE%C4%B0%B8
&lxoq=xianhua
使用&来进行键值对之间的分割
使用=来来进行键和值之间的分割。
软件开发中存在一个基本原则:
写代码的时候,写的越自由,越不受限制,就是越危险的!!!
自由/灵活是贬义词,是坏事,是引起问题的主要原因之一.
不自由(死板)是褒义词,是好事,可以让你代码出现问题的可能性变小。
框架
把相似的东西,提取出来,使用更通用的代码,提前写好,对于一些不通用,专用的部分,再在上述代码体系下,"挖出一些空间”让程序员往里头填写一些具体的业务逻辑。
urlencode
url中,存在很多特殊含义的符号
:/?=&d等特殊字符。
但是在query string 的value部分,一旦也包含这些符号,这样url就会出现问题。
所以要通过%这样的特殊字符来表示文字的转换。
encode 就是针对value的转义。
用utf8/gbk
恰好某个字节,就和某个特殊字号ascii值重复了,此时就可能导致解析的时候出现了问题。
遇到需要转码的符号,就显示出这个字符原始的编码的十六进制在这个基础上,加上%.
解析url的时候,见到带%就知道特殊的转码后的数据了,就可以很容易和前面特殊符号区分开~~
如果是汉字,就把utf8编码结果,每个字节前面加上%,按照16进制的方式来表示
解析的时候遇到%就知道是转码的数据把%去掉,就可以很方便的还原回,原始的数据内容了,
构造http请求,一定要把需要转码的部分,进行urlencode
认识方法
HTTP请求首行里,包含了方法
GET POST
描述了要干啥
GET语义从服务器获取某个数据 ==》使用习惯上的差别.但是,GET t也可以 有 POST语义往服务器发送/提交某个数据 bodyPOSTt也可以有query string
网络上大部分请求都是GET==>通过querystring告诉服务器要搜索啥服务器返回搜索结果完整网页
1.登录
2.上传文件
PUT:也是用来给服务器提交数据的.和POST非常类似
DELETE:和GET更类似,没有body,使用用querystring
上述这些HTTP请求,都是如何构造的呢?
1.在浏览器地址栏直接输入url,此时就是GET请求
2.网页html中可能有一些特殊的标签
3.表单:html中的特殊的标签form
4.通过js构造 如使用原生的ajaxapi/jquery的ajaxapi/一些第三方库axios,fetch等,
面试题:
GET和POST有啥差别
盖棺定论,GET和POST,从本质讲,没啥差别~~
GET的应用场景,使用POST也可以
POST的应用场景,GET也可以.
从使用习惯的角度来说,还是有区别的~
1)GET从语义上来说,通常用来"获取数据
POST从语义上说,通常用来:"提交数据
2) GET传递数据的时候,通常使用querystring
POST传递数据的时候,通常使用body
3) 服务器对于GET请求的设计,经常是设计成“幂等”的
而POST请求的设计,则不要求“幂等”。
幂等就是恒定,每次进行浏览器搜索的时候,返回的都是同样的数据,同样的图片
非幂等就是随机出现数据,每次进入都不一样,当然每个人同一时间进入也不相同。
4)GET请求的结果可以被缓存,可以被浏览器收藏夹收藏,POST一般不行
缓存就是从一个网站获取图片,下次再次打开网站的时候就不会从数据中读取了。
存在问题的说法:
1)POST比GET更安全
就拿登录来说,提交登录请求这一下,如果使用GET,GET把参数放到URL中,URL会显示到浏览器地址栏/
POST请求也一样不安全,因为在地址栏都能看到,所以要进行加密处理。
通过js代码来加密,然后构造http请求,发送出去等待响应,响应就会告诉浏览器,是登录成功,还是失败,如果失败,给出提示
如果成功,跳转到网站主页..
黑客要想窃取到你的数据
要么黑了你的电脑,在你的电脑程序上偷偷搞个抓包的东西要么是黑了你电脑对应的路由器(比如运营商的路由器)在这上面搞抓包程序.….
2)GET传输的数据量比较有限,比较短.POST传输的数据量比较长,没有限制
HTTP标准中,明确说了一句话,针对GET的URL的长度是不做任何限制的实践中,是可以构造一个很长的URL的.
3)GET只能传输文本数据,,POST可以传输文本,也能传输二进制
GET:url的querystring中提供了urlencode机制二进制数据,也是可以进行encode得到转义,并进行传输的
PST:虽然post可以直接传二进制很多时候,也是转义了之后通过文本的方式来传的
认识请求“报头”(header)
header中的键值对,都是标准规定的内容
Host:请求对应的主机的ip和端口这俩值,一般情况下是一样的~
这俩值,一般情况下是一样的~
Content-Length描述了body的长度=》一旦有body就需要知道body到底是多长,才能知道一个完 整的http请求。
上述和粘包问题类似:
HTTP=》TCP
1)分隔符 GET请求,没有body,通过空行
2)长度 POST请求,有body,通过空行找到body开始通过Content-Length找到body的结束位置
TCP的效率是存在上限的(特别是在流量控制&拥塞控制)。
改为UDP之后,就可以按照更高效的方式来传输信息。
Content-Type是body的数据类型=》通过HTTP协议传输的数据,有很多种类。
请求的Content-Type