HTTP与HTTPS协议

目录

什么是HTTP协议:

HTTP报文格式

HTTP请求与响应:

请求的首行:

方法:

URL:

版本号:

header:

Host:

Content-Type与Content-Length:

User-Agent(UA):

Referer:

Cookie:

响应的首行:

如何构造HTTP请求:

HTTPS:

通讯过程:


什么是HTTP协议:

HTTP协议是一个应用层协议,通常的应用层协议需要程序猿自定义,也可以基于一些现有的协议,在此基础上进行定制,HTTP协议就是如此,其可定制性非常高

HTTP报文格式

HTTP请求与响应:

请求的首行:

方法:

HTTP方法描述了这个HTTP请求,想要干什么,HTTP协议有很多方法,不同的方法表示不同的语义

方法有很多,但常用的就只有GET 和POST

GET的是从服务器获取一部分东西,而POST是给服务器什么东西,大部分的请求的方法都是GET,一些登录,上传文件的时候会使用POST,剩下的方法很少使用

GET与POST本质上没有什么不同,只是语义不同导致的使用习惯不同,也就是说一般使用POST的场景也可以换成GET

因为使用习惯的不同:

a.GET通常是被设计成幂等的,而POST则没有要求

b.GET一般将携带的数据放到URL中,body(正文)为空,POST一般有body

c.GET因为是幂等的,所以是可缓存的,POST则不是

d.GET请求可以被浏览器收藏,POST则不能

幂等:可以理解为一个问题有固定的答案,比如1+1=?其结果一定是2,这就是幂等的,现在是几点?这个问题答案不固定,就不是幂等的,幂等可缓存的原因就是其有固定答案,比如第一次问5!是几?经计算结果是120,因为该问题答案固定为120,那么下一次回答5!是几?的时候就无需计算,因为已经记住了5!一定是120.

缓存:缓存就是把问题的结果保存下来,缓存可以存在于服务器也可以存在于客户端,比如一个客户端问服务器5!是几?经过第一次计算后,客户端和服务器都保存了120这个结果,此时如果另一个客户端问服务器5!是几?那么服务器就不经过计算,直接把120递给客户端

URL:

URL是唯一资源定位符,描述了网络上唯一一个资源.(URL并不只存在于HTTP)

其中最常见的就是协议方案名,服务器地址,端口号,文件路径和查询字符串

版本号:

目前最新的版本是HTTP/3.0,但目前最广泛使用的是1.1版本

header:

Host:

这个属性描述了当前请求最终要访问的服务器是谁,这并不和URL冲突,URL是当前要访问的服务器,在大部分情况下Host与URL描述的是同一服务器,但在通过"代理"的情况下,Host与URL会由差别(Host不仅仅写IP地址,也可以写端口号)

Content-Type与Content-Length:

这两个属性都与body有关,如果是一个body为空的get请求,那么header中就不会有这两个属性

Content-Type:描述body的数据格式

Content-Length:描述body的长度(单位字节)

Content-Type其实还有一些其他的写法,如application/x-www-form-urlencoded,在HTML标签form表单提交数据的时候会生成这种格式的body,此时的body的格式就和URL内的query String格式是一样的键值对之间用&分割,键值之间用=分割

以上两种写法是Content-Type作为请求的时候最常用,最多见的,如果Content-Type作为响应,其还有许多其他常见写法:

如:text/html text/css /application/javascript application/jpg application/png 等等

注意在响应中如果规定了格式却没有返回一个body,可能会出现一些错误,比如规定返回格式是application/json;charset=utf8但却没有返回一个json那么就可能导致出现问题

User-Agent(UA):

UA的主要作用就是表述浏览器和系统分别是什么版本

UA的作用主要发挥在2000年之前,那时候浏览器功能参差不齐,电脑也少见,不同的浏览器之间有支持图片的,有支持音频的,有只支持文字的,而UA的作用就是区分这些东西,方便网页开发人员,如果某浏览器只支持文字,那就只推送文字.....

现在的浏览器功能都差不多,没什么特别大的差别,现在UA的最重要的用途就是区分/PC/手机/平板....根据屏幕大小的不同,页面布局也会有所不同

但是实际上CSS3提供的媒体查询功能更适合这项工作,其可以根据浏览器窗口的大小设置不同的样式,这叫响应式布局

Referer:

描述当前这个页面,从哪个页面跳转出来,如果从地址栏直接输入URL,那么这时候的请求是没有Referer的

Cookie:

Cookie是一个由键值对组成的字符串,键值对之间用;分割,键值之间用=分割

Cookie的本质是浏览器存储在本地的一些用户自定义数据的关键机制,关于Cookie内部的键值对,是由服务器开发人员自定义指定的,外人一般看不懂

这些键值对是通过浏览器的一些api写入特定的文件中,对硬盘没有完全的掌控权,不同的网站都由自己专门一块地方存放cookie(cookie是通过以域名为维度进行存储的)

Cookie哪里来:

从服务器来,我们通过浏览器访问服务器的时候,服务器会在HTTP响应中通过Set-Cookie键值对将Cookie的键值对返回给浏览器,浏览器收到这个数据后,就会在本地进行存储

Cookie去哪:

浏览器会在下次请求的时候把Cookie带给服务器,其在服务器才会发生作用,存在本地相当于一个钥匙而服务器内的数据就相当于宝藏,我们需要钥匙才能打开宝箱

Cookie的作用:

Cookie本身就是程序猿自定义的,其作用有许多,最典型的就是用于身份识别,比如一个服务器面对许多客户端,有的客户端是游客,有的是普通用户,有的是VIP,而服务器识别这些客户端的身份就得需要这些客户端手里的Cookie,也就是这些客户端Cookie存储了他们不同的身份

响应的首行:

HTTP中的状态码有很多:

其中最常见的只有几个:

200 OK:表示请求成功

404 Not Found:表示要访问的资源不存在(很多网站会自制404界面,变得更好看)

403 Forbidden:访问被拒绝(即没有权限)

500 Internal Sever Error:服务器内部错误,互联网上比较少见,写代码的时候常见,通常发生在没有catch到抛出的异常

504 Gateway Timeout:服务器访问超时,也就是浏览器发送请求后迟迟没有收到服务器的响应

302 Move temporaily:临时重定向,也就是当前网站的URL临时换成了其他的URL,下次不确定是否要重定向

301 Moved Permanently:永久重定向,当前网站的URL永久换成了另一个URL

418 I'm a teapot:一个特殊的状态码,不在实际开发中使用,这是一个乐子彩蛋,意思是我是一个茶壶,没有实际意义,只是用于整蛊

这些状态码的分类要记住,面试问到HTTP的话,基本必考

如何构造HTTP请求:

1.通过在浏览器地址栏内直接输入一个URL可以直接构造一个GET请求

2.HTML中的一些特殊标签也会触发GET请求,比如 link script img a等,比如浏览器会根据img的src向服务器发送GET请求,当然如果是本地链接,那就不会由请求

3.通过form表单构造请求:

form只支持GET和POST

4.ajax:

ajax(Asynchronous Javascript And XML)当前最主流的前后端交互方式之一

Asynchronous是异步的意思,与其相对的是同步,(同步与互斥synchronized是另一组概念)

同步:请求的发起者自行获取响应

异步:请求发起者不关心结果,结果由被请求者计算后推送给请求发起者

有一点需要注意的是ajax的跨域问题:

只有运行ajax页面的域名和ajax要访问的域名一样,才能正常使用ajax,这是出于安全的考虑,防止a网站访问b网站的数据,这是 ajax自身的限制, form没有这个问题

还有一点需要注意的是,如果响应是一个 302响应,也就是在后端设置了重定向,那么ajax是不会自动跳转的,需要使用js手动跳转,当然这种情况下更推荐使用form表单, 其会自动跳转

 <script>
        jQuery.ajax({
            url:"https://www.sogou.com",//设置URL,Host会根据其自动设置
            type:"post",//发送方法
            data:"这是body",//body
            contentType: "text/plain",// body的数据格式
            success: function(body){
                //请求成功时调用的回调函数
                //这种操作类似于C的传递函数指针,Java的lambda表达式等,属于回调函数
                //这个执行过程就是异步,收到响应后,浏览器会把body喂给这个代码
                console.log(body);
            }
        });
    </script>

5.除了上述,所有能操纵网络的语言都可以构造HTTP请求.

HTTPS:

HTTPS协议就是在HTTP协议的基础上对header和body进行加密

可以简单理解为HTTPS = HTTP + SSL/TLS

加密:将明文转换成密文;解密:将密文转换成明文

对称加密:只有一个密钥key,明文 + key => 密文;密文 + key => 明文

非对称加密:需要两个密钥,公钥(pub),私钥(pri)

明文 + pub => 密文;密文 + pri =>明文

or 明文 + pri => 密文 ; 密文 + pub => 明文

通讯过程:

整体式使用对称加密的,只是在传输key的时候需要用到非对称加密,对称加密比非对称加密效率更高,如果按照以上流程的话,第三方只知道pub,所以是安全的,但第三方也有其他方法:中间人攻击:

为了防止中间人攻击, 也就是让客户端信任服务器公钥,需要引入"证书":

上图流程被称作SSL或者TLS协议

如果是使用HTTP协议,就可以不申请证书,但是现在几乎所有的浏览器对于使用HTTP的服务器都会由告警,也就是提示风险,访问的人自然也就少了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值