HTTP协议

版本的使用还与软件库的配套有关

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 永久重定向,一一映射关系,浏览器会缓存新地址

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值