版本的使用还与软件库的配套有关
http是典型的"一问一答"这种模式的协议,请求和响应是一一对应的
一问一答,多问一答(上传大文件的时候),一问多答(下载大文件的时候),多问多答(远程桌面/游戏串流)
UDP/TCP完全支持上述四种问答模式
抓包工具fiddler
如果进一步理解HTTP报文协议格式,需要用到"抓包工具"=>能够把HTTP的数据获取到,并且显示出来,
在官网下载即可
抓包工具相当于一个代理程序,代理不等于抓包工具,其他代理程序还有别的用途(浏览器插件/加速器)
代理可分为两种:正向代理,帮助服务器跑腿的,反向代理:帮助客户端跑腿的
HTTP协议
HTTP本身是一个"文本"格式的协议,本质上,一个HTTP的数据包,就是按照HTTP协议的格式,构造成字符串,写入到TCP的socket中,TCP/IP基本结构是 报头+载荷
一个HTTP的请求报文分成四部分
1)首行:包含三部分
a)请求的方法
b)请求的URL地址(请求对方的网址)
c)版本号:
这三个部分之间,使用空格来进行区分
2)请求头(header)
header本身是一个键值对的结构,每一行是一个键值对,键和值使用:分割
3)空行,在header结束之后有一个空行,类似于链表中的null,
4)正文body,可选的,有些情况下有,有些情况下没有,HTTP中的body相当于TCP/IP等协议中的载荷一样
一个HTTP的响应报文分成四部分
1)响应的首行
a)版本号
b)状态码
c)状态码的表示
2)响应的报头header
3)空行
4)正文body
认识HTTP的请求
1)认识URL:平时我们所说的网址就是URL(统一资源定位符)
1)协议方案:当前使用的是那个协议,常见的是http和https
2)登录信息(认证):已经被淘汰了
3)服务器地址:要访问的服务器是那个IP地址/域名
4)服务器端口号:http默认是80,https默认是443,一般都不写,如果服务器端口号不是默认的则需要写
5)带层次的文件路径:描述了要访问服务器的那个资源,可以通过这个路径来区分不同的网页
这个路径,表示视频,通过AV号或者BV号来区分不同的视频
6)查询字符串(query string):下面这个图片,前面会有个?,以q开头的就是query查询字符串,通过一些参数,把这些参数传给服务器进行查询,查询字符串也是键值对的结构,使用&来分割键值对,使用=来分割键和值
7)片段标识符:区分页面中的不同部分目录/导航
关于URL的encode
像/ ? :等这样的字符,已经被url当作特殊的意义理解了,因此这些字符不能随便出现,可能会使人们在解读的时候造成歧义,如果在某个参数当中有这些特殊字符,就需要先对这些特殊字符进行转移,例如c++的++,就会把+转义成ASICC所对应的值在前面加上%,如果是汉字的话会根据编码方式UTF8/GBK编码方式,来进行转化
HTTP的方法
HTTP首行里包含方法,方法也可以理解为语义,表示了这个方法描述了什么事情,常用的方法就是GET和POST,
GET:通常不会搭配body,通过query string来传输数据,本身是用来从服务器获取数据
POST:通常是搭配query string不会搭配body来进行使用,它是往服务器发送数据/提交数据
上述这两个方法的语义并不是绝对的,只是一般习惯
网络上的请求大部分都是GET,
通过query string来告诉服务器要搜索啥,通过query string包含了参数
服务器返回搜索结果完整网页
POST比GET少很多了
1)登录
这个URL中没有参数
2)上传的文件
1)PUT方法与POST方法类似,也是用来给服务器提交数据的
3)DELETE与GET方法类似,通过query string来传输数据,没有body
HTTP请求是如何构造的?
GET:1)在浏览器中输入URL,此时就是HTTP请求
2)html中可能会有一些特殊的标签,img/a/link标签可能带有一个URL属性的值,解析到这些标签可能也会根据URL构造出HTTP请求
3)表单,html的特殊标签
4)通过js构造
POST:1)表单
2)js
剩下的请求:只有通过js来进行构造
经典的面试题:POST和GET的区别
POST和GET本质上没有区别,GET的应用场景,POST也可应用,POST的应用场景,GET也可应用
使用习惯上来说有区别:1)POST从语义上来说是提交数据,GET从语义上来说是获取数据
2)GET传递数据的时候,通常使用query string,POST传递数据的时候通常使用body
3)服务器对于GET请求的设计,通常是"幂等"(可以理解成,每次点击页面,显示的结果都是一样的就是幂等),而POST的请求通常是不幂等
4)GET请求的结果可以被缓存(一个网站,通过GET获取到的图片,把这些获取到的图片缓存在硬盘当中,下次访问直接读取硬盘,不需要在请求网络,节省网络资源),可以被浏览器收藏夹收藏,POST一般不行
常见的错误说法:
1)POST比GET更安全
说法来源:GET会将用户信息暴露在URL参数当中,实际是错误的,这些参数都是进过加密的
2)GET传输的数据比较有限,比较短,POST传输的数据比较长,没有限制
说法来源:在以前IE浏览器对URL的长度有限制(超出一定长度就会有错误),但是在HTTP标准中,明确说了一句话,GET中的URL的长度没有明确的限制
3)GET只能传输文本数据,POST即可传输文本数据,也可传输二进制数据
解析:GET也可传输二进制数据,GET中有URL encode可以把二进制数据转化成转义字符,在进行转发
认识请求报头(header)
这是标准规定的,header的整体格式也是键值对结构,
HOST:表示服务器主机的地址和端口,一般情况下,Host与URL中的域名结果是一样的
以下两个字段是有body必须存在的字段
Content-Length:表示body中的数据长度,知道了body有多长,才知道一个完整的HTTP请求,解决了粘包问题,分隔符:GET中没有body用空行表示,长度:POST中有body,通过空行,找到body开始,通过Content-Length算出body的结束位置
Content-Type:表示body中的数据格式,通过HTTP传输的协议类型有很多种,图片,视频,音频,字体,html,json,css等这些不同的数据,浏览器/服务器有不同的处理方式
User-Agent:表示浏览器/操作系统的属性
UA的信息主要有两部分:1)浏览器版本,2)操作系统版本
UA的作用主要是:区分当前设备是电脑还是手机,如果是电脑,返回一个比较大的页面,如果是手机返回一个比较小的页面,但是如果是手机/电脑两个版本不同的页面需要维护两套代码,所有有了新技术响应式布局,通过这个技术代码能够自适应的根据设备的尺寸进行调整
Referer:表示当前页面是从那个页面中跳转过来的,如果是在地址栏中直接搜URL/收藏夹中直接点击跳转,则没有这个
Cookie:这个存储的都是键值对形式的内容,与query string类似都是由开发者自定义设计的,这里存储的键值对,都是保存在客户端的硬盘上持久化保存,默认情况下,网页不能直接访问用户的硬盘,有的网站,必须需要存储客户端的信息,此时浏览器就给网页提供了Cookie机制,浏览器对硬盘的操作,做了特殊的封装,相当于提供了一个/一组特殊的文件,只能往这个文件中写,必须是键值对.
Cookie就是浏览器提供给网页的一种能够持久化存储数据的机制,浏览器会针对不同的网站(按照域名),每个网站都有一份自己的Cookie文件,
一个没有用过的浏览器,第一次访问某个网站的时候,这个网站对应的Cookie都是空着的,网站的服务器会返回一些HTTP响应,这些HTTP响应中包含Set-Cookier这样的header,把这些键值对保存在浏览器的cookie当中
当Cookie保存到浏览器之后,下次在浏览器访问该网站的时候,就会在请求header中,把之前保存的Cookie的值都给代入进去,还要在返回给服务器,cookie的数据本身来自于服务器,一个服务器对应多个客户端
Cookie是什么:是浏览器本地存储数据的一种机制(不是唯一的,只是典型的一种)
Cookie是怎么存储的:按照不同的域名,分别存储在硬盘上,不同的域名Cookie之间互不干扰,键值对文本存储都是用户自定义
Cookie是从哪里来:从服务器来,服务器的HTTP响应header中可以填写Set-Cookie字段,会带一些键值对
Cookie到哪里去:到服务器去,通过HTTP请求的header中的Cookie字段,把信息传输给服务器
关于HTTP响应
状态码解析
1)200:OK响应成功
2)404:NOT FOUND 没有找到资源
3)403:Forbidden 拒绝访问
4)405:Method Not Allowed 服务器不支持当前方法
5)500 Internal Server Error 服务器内部出现错误
6)504 Gateway Timeout 服务器访问超时
7)302 Move temporarily 临时重定向
8)301 Moved Permanently 永久重定向,一一映射关系,浏览器会缓存新地址