Http学习笔记(7月9号)

作者信息

作者:黄钰朝
邮箱:kobe524348@gmail.com
日期:2019年7月9日

前言

今天的学习内容是http原理,主要是从网络分层开始,学习一些与http相关的网络协议的知识,接下来就是http的工作原理了,其实我感觉没有什么新奇的,之前学jsp和servlet,加上为了做考核并且有训练营的培训,还学了很多前端的知识,学了ajax,也用js原生的xhr发送过http请求,在阿里云上部署自己的项目时,分别用了域名和ip发请求,也碰到了跨域拦截的问题,找了点教程也解决了。所以这些http请求响应,http首部,http方法,http状态码,cookie和session,都感觉是见怪不怪了。然而下午的时候突然加了作业,里面的问题感觉还是没研究清楚,就又去学了同源策略和跨域访问,Range头部的应用,还有HTTPS中的加密原理和证书。

一.基础网络原理

1.1 网络分层模型

http协议是一种网络协议,建立于计算机网络体系之上,因此在学习http协议之前,先了解一波网络的分层结构。主要有两种网络分层模型,OSI模型和TCP/IP模型。OSI模型一共分为七层,TCP/IP模型和OSI模型类似,但是只分为四层。

1.1.1 OSI模型(Open System Interconnection Reference Model,开放式系统互联通信参考模型)
层数分层包含的协议
7应用层例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP
6表示层例如XDR、ASN.1、SMB、AFP、NCP
5会话层例如ASAP、TLS、SSH、ISO 8327 / CCITT X.225、RPC、NetBIOS、ASP、Winsock、BSD sockets
4传输层例如TCP、UDP、RTP、SCTP、SPX、ATP、IL
3网络层例如IP、ICMP、IGMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、 X.25
2数据链路层例如以太网、令牌环、HDLC、帧中继、ISDN、ATM、IEEE 802.11、FDDI、PPP
1物理层例如线路、无线电、光纤、信鸽

可以看到,http就处于第七层,应用层,依赖于下面的TCP等传输层进行传输。

1.1.2 TCP/IP模型

下面这个表展示了OSI模型和TCP/IP模型的关系,其中TCP/IP模型的最下面两层(数据链路层和物理层),通常合起来称为网络接口层,因此这个模型有四层模型,也有五层模型的分法。

OSI中的层功能TCP/IP协议族
应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
表示层数据格式化,代码转换,数据加密没有协议
会话层解除或建立与别的接点的联系没有协议
传输层提供端对端的接口TCP,UDP
网络层为数据包选择路由IP,ICMP,OSPF,EIGRP,IGMP
数据链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,MTU
物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2

TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。

从下图可以清楚地看到,http包装的数据经过TCP/IP模型的传输过程。从发送端开始,逐层添加首部信息,而在接受端,逐层根据头部信息,找到下一层,并且去掉当前层的头部信息,达到精确传输http数据的目的。
在这里插入图片描述

1.2 与http相关的协议:TCP,IP,DNS

1.2.1 TCP (确保通信的可靠性)

TCP协议通过提供字节流服务来确保http数据被准确无误地发送到目标地址。也就是通过将数据分割为数据包,使用三次握手等等手段确保每个数据包到达指定的地址。

1.2.2 IP(负责寻址)

IP是网际协议,属于分层结构中的网络层,在TCP封装的基础上,通过IP协议,才能确定从一台主机到另一台主机的路径。

1.2.3 DNS (负责域名解析)

DNS负责解析IP地址和域名之间的对应关系

1.3 URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)

URL是一种URI,URI标识一个互联网资源,并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。

URI是用来标识网上的资源的
URI分为URL和URN这两大类。
URL与URN的不同之处在于前者不仅标识资源,而且还指出了访问资源的方式。比如采用何种协议(http,ftp…),而URN则没有。

简单理解:链接
格式如下:
在这里插入图片描述

二.http原理

2.1 通过“请求-响应”传输数据

http属于应用层协议,是为了实现某一场景下的应用需求,早期时是为了传输网页。传输数据时,需要两台计算机,一台作为客户端,发送“请求”,一台作为服务器,接受”请求“,并返回”响应“。这就是”请求-响应“的通信方式。

“请求”中通过一个URI,告诉服务器所要请求的资源。

请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段
和内容实体构成的。

在这里插入图片描述

2.2 http方法

http方法有很多,但是常用的,我感觉是GET和POST。还有黑客常用OPTIONS测试服务器支持的http方法

The DELETE Method
HTTP提供了一个与PUT方法对应的DELETE方法。一个DELETE请求将需要从Web服务器删除的内容指定为请求行中的资源部分。

DELETE方法唯一有趣的地方在于当你接收了一个标识为200OK的响应的时候,那并不意味着指定的资源已经被删除了。那仅仅说明服务器接收到了删除资源的命令。这一例外允许了出于安全考虑的人为的干预

序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。
9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新

2.3 持久连接(长连接)

之前的http协议中,每次http通信之后都断开TCP连接,这样每次都要重新连接,很慢,这就是短连接,后来改成了持久连接在http/1.1 中默认使用长连接,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。 显然这样做的好处在于提高访问的速度,减少延迟。(因为一个网页往往包含很多http请求,每次都建立TCP连接的话,挺慢的)

在报文中,可以看到响应的首部信息中connection一项为keep-alive
在这里插入图片描述

2.4 长连接和Websocket的区别

Websocket是本身一直保持连接,服务器可以主动向客户端发送内容的。但是长连接只是底层的TCP连接一直保持,只有在客户端发出一个请求时,服务器才发送一个响应,如果服务器主动向客户端发一个响应,那客户端是没法接收的。http只能是 “一发一收”

2.5 管线化

在持久连接出现之后,访问速度得到提升,但是更猛的是管线化技术,因为在这之前的http通信都是一个请求得到响应之后,再发下一个,而管线化技术,其实就是发完一个请求,不用等响应,可以直接发下一个请求。

2.6 Cookie技术

http协议还有一个特点是,它是无状态协议,http协议本身并不记录历史连接, 因此服务器不会知道这个连接和之前的连接有什么关联,因此就有了Cookie技术来达到记录的目的。

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

PS:cookie相当于服务器在客户端第一次连接时给那个客户端加的一个标记,用来在下次连接时识别那个客户端。关于cookie和session的细节,我在学jsp的时候学过,这里不多废话了。

三.http报文中的信息

3.1 报文结构

http报文包括请求报文和响应报文。结构如下:
在这里插入图片描述
PS:http请求和响应中的首部非常多,这里不做摘录,用到的时候再查吧。。。

3.2 首部Range的应用

首部Range可以指定获取指定资源的一部分数据。比如:

  • Range: bytes=5001-10000 表示只请求该资源的5001-10000字节的数据

可用于多线程下载。

四.同源策略和CORS跨域

4.1 浏览器的同源策略

什么是同源策略?

  • 同源策略是Netscape提出的一个著名的安全策略;
  • 同源策略是浏览器最核心最基础的安全策略;
  • 现在所有的可支持javascript的浏览器都会使用这个策略;
  • web构建在同源策略基础之上,浏览器对非同源脚本的限制措施是对同源策略的具体实现;

同源策略,就是浏览器在运行一个网页时,要求网页中的js脚本所发出的http请求中的协议,域名,端口三者和当前页面的一致。有一个不一致,就是跨域。比如:

1) 域名不同 (域名访问和ip访问也造成跨域)
http://www.example.com (117.34.1.1)
http://117.34.1.1
http://www.example.com
http://www.case.com

2) 子域名不同
http://www.example.com
http://e.example.com

3) 端口不同
http://www.example.com(:80)
http://www.example.com:8080

4) 协议不同
http://www.example.com
https://www.example.com

为什么要使用同源策略?

因为服务器没法限制客户端向它发送请求,为了保证这些请求不是恶意请求,只能要求这些请求的来源网页是同源的,也就是说,伪造的支付宝网页的来源和支付宝服务器的域名不一样,那这个伪造网页中的脚本向支付宝服务器发送的请求就是跨域的,而同源策略,就阻止了这种跨域请求,保证了安全。

4.2 CORS跨域请求

虽然同源策略提高了安全性,但是很多时候我们还是有一些正当的跨域请求的需要,比如一个网页中引用另一个网站的图片,这样的跨域请求不构成安全威胁,应该被允许。为了满足跨域访问的需要,就可以使用CORS(跨域资源共享)。

其实有几种方式可以实现跨域:
1) JSONP跨域
2) iFrame跨域
3) 协议跨域 (跨域资源访问CORS)

CORS具体实现的方式就是浏览器在发送跨域请求时在请求时写入当前网页的来源(Origin首部),服务器根据这个信息,判断决定是否允许这个来源的网页发起跨域访问。

PS:实际上,要分为简单请求和非简单请求来分别处理,两种请求的发送方式不太一样。区别在于,如果是简单请求,在一次请求中可以完成权限校验和资源访问,如果是非简单请求,要发两次请求,第一次是“预检“,通过后再请求资源,具体可以参考:https://yq.aliyun.com/articles/69313

五.HTTPS的原理

HTTPS其实也是HTTP,只是套上了SSL加密这个外壳,所以提高了安全性。

5.1 共享密钥加密

共享密钥加密就是最容易想到的加密方式,发送方将数据加密,然后把数据和密钥一起发给接收方,接收方使用密钥进行解密 。看起来似乎还可以,但是问题在于如果传输过程中别人获取到了密钥,一样可以解密。

等于说用锁把包裹锁住了,但是把钥匙放在包裹上发送出去,这样就必须保证钥匙的安全

5.2 公开密钥加密

公开密钥加密采取的是公开密钥和私有密钥结合的方式,而且有意思的是,加密方要采取接收方的公开密钥加密,接收方得到加密数据之后,再使用自己的私有密钥解密,这样,私有密钥掌握在接收方手里,不用担心密钥在传输过程中泄露。

相当于是接收方事先把自己的锁公开出来,但是钥匙自己留着,发送方用接收方的锁把包裹锁住发送出去,接收方收到后用自己的钥匙打开。

5.3 HTTPS的加密策略

上面的两种加密方式,各有利弊,公开密钥加密更安全,但是速度更慢。所以HTTPS采取的是混合加密策略。

方法是这样:先用更安全的公开密钥加密把要共享的密钥发送过去,然后之后的数据就使用共享密钥加密,因为第一次使用公开密钥把钥匙发过去了,所以后面的传输只需要发送加密的数据,所以也非常安全。这样既兼顾安全,又能提高速度

5.4 公开密钥的认证

前面提到的公开密钥加密似乎非常安全,但是仍然存在问题。一个问题是发送方不可能事先知道所有接收方的公开密钥,所以得再要进行加密数据传输的时候,让接收方先把自己的公开密钥发送过来,而在发送的过程中,无法确定公开密钥是否被替换,一旦被别人用自己的公钥替换,那么替换者使用自己的私钥,就可以解密数据。为了确认接收到的公钥是可信的,HTTPS使用了证书认证的方式。

这里利用到公钥和密钥的一个特点:互补性。公钥和密钥是成对出现,并且互补的。
即公钥加密的内容,只有私钥能够解密,而私钥加密的内容,只有公钥可以解密。
PS:具体原理参考RSA加密算法

先讨论一个简单的情况:服务器证书。
因为服务器一般属于公司,有固定的域名,而且,一般是客户端主动连接到服务器,客户端可以事先认识"服务器”,也就是知道服务器的域名。服务器证书就是服务器向客户端发送自己的证书,让客户端确保拿到服务器真实的公钥。

首先要提到一种确认数据没有被篡改的验证方式:数字签名
先假设客户端已经拥有服务器正确无误的公钥,那么首先服务器把要发送的内容做一次摘要(hash算法),然后用自己的私钥对这个摘要加密(这就是数字签名),再把加密后的摘要和内容一起发送给客户端,那么客户端只要用服务器的公钥,把摘要解密,再和自己使用hash算法对内容做的摘要比较,如果两次做的摘要相同,那么这个内容没有被修改过。
这里的要点是,因为客户端已经有了可靠的服务器公钥,而且客户端只会使用这个可靠的公钥对摘要进行解密,所以只要配合一个摘要算法,就能确保发送的内容没有被篡改过。
PS:不了解信息摘要的参考hash算法和MD5摘要

有了数字签名,我们可以确保发送的内容没有被篡改,只需要一个条件,客户端事先知道一个可靠的公钥,那么可以有一种安全的方式让客户端得到一个可靠的公钥:在发布时就在浏览器里面植入一个可信的公钥,这个公钥就是认证公司的公钥(CA公钥)。到了这个时候,我们就可以使用数字证书安全地传输服务器的公钥了。

所谓的数字证书,就是把服务器的公钥和服务器的信息(我自己简单理解为域名)写在一起,做成一个证书。那么只要这个证书安全地发送给客户端(也就是不被篡改),客户端就能从证书里面得到这个服务器真实的公钥。那么如何安全地发送证书?其实到这里就很简单了,因为数字证书是由服务器向认证公司申请的,证书是经过认证公司的数字签名的,也就是说,由认证公司的公钥,配合数字签名的摘要算法,可以确保这个证书没有被篡改。如果客户端确认了服务器发送的证书没有被篡改,那么只要证书上的服务器信息是客户端正在访问的域名,就可以确认这个公钥就是这个域名的服务器的公钥。这就实现了公钥认证的过程

与之对应的,也有客户端证书,但是客户端证书比较难搞,首先客户端一般是普通用户使用的,普通用户要学会申请证书,不太容易,而且申请证书也是要钱的,想必很多人不会去搞这个,而且,即使你的电脑上安装了证书,也无法确保这个请求是你本人发送的,因为别人也可以使用你的电脑乱搞!所以一般是银行的网上银行会使用客户端证书来通信。

六.总结

早上看完一遍《图解HTTP》,感觉内容不多,没有新鲜感,一个早上,没学到多少新的东西。下午有了作业,才发现自己忽略了很多细节,没抓住重点,比如http方法,之前只用过GET和POST,觉得其他的没怎么见过可能用处也不大吧,也就没仔细看,但是作业中要求描述同源策略和CORS跨域,就发现OPTIONS方法的用处。还有关于http头部信息那部分,觉得太多了,认为知道这个概念就行,具体每个头部的作用没有细看,但是到了作业上,又用到了Range头部实现多线程下载,断点续传等等,非常有用。HTTPS的内容,一开始就只是知道是加密的,现在学了具体的加密原理,自己把整个加密的过程和原理描述出来,颇费脑力,但是挺有意思的。虽然是中途被加了需求,感觉压力增加,但是相比早上没抓住重点的学习,效率上还是高了不少。websocket和长连接的区别,还是在导师启发下,再去了解的。

七.参考资料

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值