HTTP和HTTPS协议学习

平时开发中只要是一个上线的app基本都有网络请求,虽然现在许多开源库都已经帮助我们更加容易的访问网络,但是我们也需要去了解网络访问的原理,这样我们后期去定制我们自己的框架就有许多的帮助。同时面试也喜欢问HTTP或者HTTPS相关知识,为了面试的时候不懵逼,也为了以后更好的理解HTTP或者HTTPS原理,所以下面就总结下它们的相关知识。

1. HTTP


HTTP协议(HyperText Transfer Protocol),又称超文本传输协议,由于其简介,快速的方式,比较适用于分布式媒体信息系统。一般我们请求服务器资源测试的时候就是用的HTTP协议,但是它的底层还是TCP/IP协议。它的主要特点如下:

1 .支持C/S(客户/服务器)模式
2 .简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。HTTP常见请求方法有GET,HEAD,POST,每种方法规定了客户与服务器联系的类型不同。由于HTTP服务器的程序规模小,因而通信速率很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式节传输省时间。
无状态:HTTP协议是无状态协议,无状态协议是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,而另一方面,在服务器不需要先前信息时它的应答速度就较快。

HTTP URL的格式如下:

http://host[' ':port] [ abs_path ]

http表示要通过HTTP协议来定位网络资源; host表示合法的Internet主机域名或者IP地址; port指定一个端口号,为空则使用默认端口80; abs_path指定请求资源的URI。HTTP有两种报文,分别是请求报文和响应报文。

2. HTTP请求报文


HTTP请求报文由请求行、请求报头、空行和实体4个部分组成

在这里插入图片描述

  • 请求行

请求行由请求方法、URL字段和HTTP协议组成,格式如下:

Method Request-URI HTTP-Version CRLF

其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)

HTTP请求方法有8种GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS。在移动开发中常用的就是GET和POST了。

1.)GET:请求获取Request-URI所标识的资源。
2.)POST:在Request-URI所标识的资源后附加新的数据,一般用于向服务器提交数据。
3.)HEAD:请求获取由Request-URI所标识的资源的响应消息报头。
4.)PUT:请求服务器存储一个资源,并用Request-URI作为其标识。
5.)DELETE:请求服务器删除Request-URI所标识的资源
6.)TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
7.)CONNECT:HTTP1.1协议中预留给能够将连接改为管道方式的代理服务器。
8.)OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

  • .请求报头

在请求行之后会有0个或者多个请求报头,每个请求报头都包含一个名字和一个值,它们之间用英文冒号’:'分割。

  • .请求实体

请求数据不在GET方法中使用,而在POST方法中使用。POST方法适用于需要客户填写表单的场合,关于请求数据相关最常用的报头是Content-Type和Content-Length。

3. HTTP响应报文


响应报文的一般格式如下:

在这里插入图片描述

HTTP的响应报文由状态行、响应报头(首部行)、响应正文组成。

  • .状态行

状态行的一般格式如下

HTTP-Version Status-Code Reason-Phrase CRLF

其中HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应码;Reason-Phrase表示状态码的文本描述。

状态码由3位数字组成,第一个数字定义了响应的类别,且有以下5种可能取值。

  • 100~199:指示信息,收到请求,需要请求者继续执行操作。
  • 200~299:请求成功,请求已被成功接收并处理。
  • 300~399:重定向,要完成请求必须进行更进一步的操作。
  • 400~499:客户端错误,请求有语法错误或请求无法实现。
  • 500~599:服务器错误,服务器不能实现合法的请求。

常见的状态码:

  • 200 OK:客户端请求成功。
  • 204 No Content:表示请求已成功处理,但是没有内容返回。
  • 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
  • 302 Found:临时重定向,表示请求的资源临时搬到了其他位置。
  • 303 See Other:表示请求资源存在另一个URI,应使用GET定向获取请求资源
  • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
  • 401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 500 Internal Server Error:服务器内部错误,无法完成请求。
  • 503 Server Unavailable: 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

tip: 面试同花顺的时候面试官问我304状态码是什么意思,没答上来,后来回去查了资料,有如下解释:客户端有缓冲的文档并发出了一个条件性的请求。服务器告诉客户端,原来缓冲的文档还可以继续使用。 这个是配合缓存一起使用的。

4. HTTP的消息报头


HTTP的消息报头还是很多的,都是由键值对组成的,每行一对,关键字和值用英文冒号’ : ',这里列举一些比较常见的:

通用报头既可以出现在请求报头中,也可以出现在响应报头中
Date表示消息产生的日期
Connection允许发送指定连接的选项。比如选项是连续的;或者指定的’Close’选项,通知服务器,在响应完成后,关闭连接
Cache-Control用于指定缓存指定,缓存指令是单向的,且是独立的
请求报头请求报头通知服务器关于客户端请求的信息
Host请求的主机名,允许多个域名同处于一个IP地址上
User-Agent发送请求的浏览器类型,操作系统类型
Accept客户端可识别的内容标签列表,用于指定客户端接收那些类型的信息
Accept-Encoding客户端可以识别的内容编码
Accept-Language浏览器所支持的语言类型
Connection允许客户端和服务器指定与请求/响应连接的相关选项。比如这时候为Keep-Alive则表示保持连接
Transfer-Encoding告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
响应报头用于服务器传递自身信息的响应
Location用于重定向接收者到一个新的位置,常用在更换域名
Server包含服务器用来处理请求的系统信息,与User-Agent请求报头是对应的
实体报头用于定义被传送资源的信息,其既可以用于请求,也可以用于响应。请求和响应消息都可以传送一个实体。
Content-Type发送给接收者的实体正文的媒体类型
Content-Length实体正文的长度
Content-Language描述资源所用的语言
Content-Encoding实体报头被用作媒体类型的修饰符。它的值指示了已经被应用到实体正文的附加内容的编码
Last-Modified实体报头用于指示资源的最后修改日期和时间
Expires实体报头给出响应日期和时间

tip: 面试同花顺时候,面试官问我有没有用过http的缓存机制,当时没答上来,于是网上查了一些博客,觉得这篇写得好!彻底弄懂HTTP缓存机制及原理

5. HTTPS


HTTPS:基于安全套接字的超文本传输协议,它由HTTP+SSL组成

为什么要用HTTPS:
超文本传输协议 (HTTP) 是一个用来通过互联网传输和接收信息的协议。HTTP 使用请求/响应的过程,信息可以在服务器间快速、轻松而且精确的进行传输。当你访问 Web 页面的时候你就是在使用 HTTP 协议,但 HTTP 是不安全的,可以轻松对窃听你跟 Web 服务器之间的数据传输。在很多情况下,客户和服务器之间传输的是敏感歇息,需要防止未经授权的访问。为了满足这个要求,[网景公司(Netscape)]推出了HTTPS,也就是基于安全套接字层的 HTTP 协议。

tip: 面试经常喜欢问HTTPS和HTTP区别,以及与SSL证书连接过程

6. HTTPS与HTTP区别


相同点:

  • 大多数情况下,HTTP 和 HTTPS 是相同的,因为都是采用同一个基础的协议,作为 HTTP 或 HTTPS 客户端——浏览器,设立一个连接到 Web 服务器指定的端口。当服务器接收到请求,它会返回一个状态码以及消息,这个回应可能是请求信息、或者指示某个错误发送的错误信息。系统使用统一资源定位器 URI 模式,因此资源可以被唯一指定。而 HTTPS 和 HTTP 唯一不同的只是一个协议头(https)的说明,其他都是一样的。

不同点:

  • HTTP的URL以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头
  • HTTP是不安全的,而 HTTPS 是安全的
  • HTTP标准端口是80 ,而 HTTPS 的标准端口是443
  • 在OSI网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层
  • HTTP无需加密,而HTTPS 对传输的数据进行加密
  • HTTP无需证书,而HTTPS 需要认证证书

因为HTTPS需要一个证书认证的过程,所以它的通信效率比HTTP低

7. HTTPS如何与SSL建立连接


1 . 客户端第一次向服务器发送信息,服务端会生成一对非对称密钥,然后将公钥放到一个SSL证书中,证书中包含证书的发布机构、证书的有效期、公钥、证书的所有者,证书里面的私钥会将公钥进行签名,然后这个歌证书会被发送给客户端
2 . 客户端在收到证书之后,会对证书的真伪进行校验,客户端会从操作系统中查找内置的受信任的证书发布机构CA,将这个CA去和服务器传送过来的证书发布机构CA对比,用于校验是否是合法机构颁发。
3.客户端信任了服务器的SSL证书,然后就拿操作系统CA的公钥对签名进行解密,接着客户端就会用hash计算去计算证书的hash值,然后对服务器里面的签名进行对比,对比一致就认为证书是服务器发过来的证书。
4.此时客户端就和SSL建立了连接,可以使用SSL证书里面的公钥。进行后续的加密操作
5.拿到服务器公钥之后,客户端就会产生一个随机的对称加密的密钥,然后用公钥进行加密,然后将这个加密之后的密钥传给服务端,服务端收到加密之后的密钥之后,然后用私钥进行解密,此时客户端的对称加密密钥就传给服务端了。
6.后续信息传递过程就会使用对称密钥对信息加密处理。

我认为之所以要用对称加密的原因是对称加密在性能上要优于非对称加密, 但是安全性低于非对称加密。所以客户端将密钥传给服务器的时候,要用公钥对它进行加密,防止密钥在传给服务端的时候,被拦截了。对称密钥传给服务器之后,就可以使用对称密钥对信息加解密了。

8. HTTPS用在什么地方。


银行网站、支付网关、购物网站、登录页、电子邮件以及一些企业部门的网站应该使用 HTTPS。

9. 参考


1.https://www.jianshu.com/p/064f04d85507
2.Android进阶之光
3.https://zhuanlan.zhihu.com/p/27395037?utm_source=com.alibaba.android.rimet&utm_medium=social&utm_oi=590828097742311424
4.https://blog.csdn.net/whatday/article/details/38147103
5.https://juejin.im/post/5bcecb9a5188255c2f42586c
6.https://blog.csdn.net/abcd1101/article/details/71512809

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值