应用层协议是用于精确定义不同主机件通信的规则,传输层提供端到端的数据逻辑传输,应用层则规定了具体的数据格式类型。
常用的应用层协议:超文本传输协议HTTP,域名系统DNS,FTP文件传输协议,SMTP电子邮件传输协议,POP3邮件读取协议,SNMP简单网络管理协议,Telnet远程中断协议;
应用层的协议应规定下内容:
1、应用进程间交换的报文类型,如请求报文或响应报文;
2、各种报文段类型的语法;
3、字段的含义,即报文段中的内容;
4、进程发送报文的规则以及响应报文规则;
DNS:Doming Name System域名系统,方便的从域名中解析出IP地址;它的主要内容是规定了域名结构,为三级域名二级域名顶级域名每个域名用”.“隔开,如mail.cctv.com;常用的顶级域名分为NTLD,GTLD,事实上具体实现域名系统的是域名服务器:根域名服务器,顶级域名服务器,本地域名服务器,权限域名服务器。
FTP文件传输协议,提供交互式的访问,允许客户指定文件类型与格式,允许文件读取,基于TCP;使用客户服务器的模式,一个FTP服务器可以为多个客户服务,主要由一个主进程和多个从属进程实现。
SMTP:简单邮件传输协议,SMTP规定了在两个相互通信的SMTP进程应如何交换信息;
POP3:邮件读取协议,常用于接受电子邮件;
HTTP协议定义了浏览器如何向万维网请求万维网文档,以及服务器怎样把数据传输给浏览器。它是一个面向事务的应用层协议。
万维网:一个大规模的联机式的信息储藏所。在各个万维网的站点存储着信息,通过站点间的访问实现信息的获取。工作流程,建立连接,请求响应,释放连接。
上述连接均为TCP连接,而请求与响应的规则则由HTTP实现;
HTTP使用TCP来保证数据的可靠,所以自身不用考虑传输过程问题;
HTTP协议是无状态的,即两次相同的访问之间是独立的,没有状态记录,这种特性简化了服务器的设计,使服务器能轻易支持大量并发的HTTP请求。
HTTP1.0 的缺点:每请求一个文档会有更多资源上的的消耗,因为需要先建立TCP连接,所以几乎两倍于RTT Round-Trip Time,。另外一点是每一次请求都要重新建立连接,这种短链接也会浪费很多资源。
HTTP1.1的改进:使用了长连接(persisitent connetion),这种连接在发送响应后的一段时间里仍然保持连接,使后续的相同端发送不在需要建立连接。这种持续连接主要由两种工作方式:非流水线方式和流水线方式:
在客户端收到前一个响应后才能发送下一个请求,或者客户收到HTTP响应报文前就可以发送的两种形式。
开始行:用于区分报文类型,在请求报文中是请求行;
首部行:用来说明浏览器,服务器,或报文主体的一些信息;
实体主体:
请求报文特点:请求行中只有方法(POST/GET/…),URL,HTTP版本号;
常见请求方法:OPTION 请求选项信息,如预检请求
GET:请求URL标志的信息
POST:携带数据形式的请求
HEAD:请求读取URL标志信息的首部
响应报文特点:状态行:版本、状态码、状态码简介
5类状态码:
1xx:通知信息,如正在请求处理中
2xx:成功,已接受
3xx:重定向,还需再进行进一步的行动
4xx:客户请求出错,如404找不到页面400请求错误
5xx:服务器出错,
Https:Https是http加上SSL外壳。通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,
利用SSL/TLS建立安全信道,加密数据包。HTTPS使用的主要目的是提供身份认证,数据交换的隐私和完整性;
1、首先在内容上:采用混合加密技术;
2、验证身份:通过证书认证客户端访问的服务器签名;
3、保证数据的完整性:防止传输的内容被中间人篡改;
数据加密过程:
1、发送方的数据使用对称加密生成密钥对对传输的数据进行加密,
2、然后使用非对称加密的公钥对于上述密钥在进行加密,这个公钥是数字证书中的。
3、发送方数据的hash单项加密后得到数字摘要,再用私钥加密,得到加密后的数字签名;
4、最后一共由发送方发出了三类文件:加密文件,加密数字签名,加密后的秘密密钥;
解密过程:
1、接受方通过发送方的公钥对于数字签名进行解密得到数字摘要1;
2、接收方通过非对称的私钥解密堆成加密的密钥;
3、通过上面解密的私钥对于原文进行解密得到原文;
4、使用单项hash加密对于原文进行加密得到数字摘要2;
5、比对数字摘要1和2的到文档内容是否相同;
数字摘要:通过单项加密的算法对原文进行加密,
将需要加密的明文摘要程一串密钥,不同明文摘要的密文结果不同,同种加密一定一致。
数字签名技术:数字签名建立在公钥加密体制的基础上,是公钥加密技术的一类应用,
即公钥加密加数字摘要结合起来的。
公钥在数字证书中,由CA机构颁发,证书中包含有一对公司钥和所有者识别信息,
数字证书保存再服务端,具有身份验证和数据加密传输的功能。
http与https的区别:
数据上:http明文传输信息;https则是加密传输。
连接上:http连接是无状态的,即数据包的发送传输接受都是相互独立的,不会记录每次连接信息。https是http+ssl协议构建的加密传输、身份认证协议;且需要CA证书;
https因为保证了安全也相对留下一些问题:
HTTPS的问题:
SSL证书需要购买申请,功能越强大的证书费用越高
SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,
HTTPS连接缓存不如HTTP高效,流量成本高。
HTTPS连接服务器端资源占用高很多,支持访客多的网站需要投入更大的成本。
HTTPS协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。
比较好的方式是采用分而治之,类似12306网站的主页使用HTTP协议,
有关于用户信息等方面使用HTTPS。
相对于1.1主要做了以下改动:
http1.0和http2.0的区别:
新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷
,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。
基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。
一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,
接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
header压缩,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,
既避免了重复header的传输,又减小了需要传输的大小。
服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。
基于TCP协议和TLS协议的HTTP2.0在真正发送数据包之前需要花费一些时间来完成握手和加密协商,完成之后才可以真正传输业务数据。
HTTP2.0的问题:尽管再应用层上做了很多改进,但是由于TCP的问题,为了提高效率,HTTP3.0舍弃了TCP。具体原因:
建立连接时间长:批评3次握手。。。。。
队头阻塞:HTTP2使用的单TCP连接复用,在同一个连接上可能有多个并行传输,但是由于TCP的可靠传输和有序传输,如果说有数据包丢包了,会导致后续的其他包都受影响。比如,有多个报文端,如果中途有一个分组没能到达接收端,那么后续分组必须保存在接收端的TCP缓冲区上,等待丢失分组重发并到达接收端。
http3.0采用了 QUIC协议;
QUIC其实是Quick UDP Internet Connections的缩写,快速UDP互联网连接。基于UDP主体将TCP的重要功能转移到用户空间来实现,从而绕开内核实现用户态的TCP协议,但是真正实现起来还是非常复杂的。
HTTP2.0协议的多路复用机制解决了应用层的队头阻塞问题,但是在传输层仍然存在队头阻塞问题。
QUIC协议是基于UDP协议实现的,在一条链接上可以有多个流,流与流之间是互不影响的,当一个流出现丢包影响范围非常小,从而解决队头阻塞问题。
使用QUIC协议的客户端和服务端要使用1RTT进行密钥交换,使用的交换算法是DH(Diffie-Hellman)迪菲-赫尔曼算法。
首次连接:
算法流程:
1、客户端对于首次连接的服务端先发送client hello请求。
2、服务端生成一个素数p和一个整数g,同时生成一个随机数 (笔误-此处应该是Ks_pri)为私钥,然后计算出公钥 = mod p,服务端将,p,g三个元素打包称为config,后续发送给客户端。
3、客户端随机生成一个自己的私钥,再从config中读取g和p,计算客户端公钥 = mod p。
4、客户端使用自己的私钥和服务端发来的config中读取的服务端公钥,生成后续数据加密用的密钥K = mod p。
5、客户端使用密钥K加密业务数据,并追加自己的公钥,都传递给服务端。
6、服务端根据自己的私钥和客户端公钥生成客户端加密用的密钥K = mod p。
7、为了保证数据安全,上述生成的密钥K只会生成使用1次,后续服务端会按照相同的规则生成一套全新的公钥和私钥,并使用这组公私钥生成新的密钥M。
8、服务端将新公钥和新密钥M加密的数据发给客户端,客户端根据新的服务端公钥和自己原来的私钥计算出本次的密钥M,进行解密。
9、之后的客户端和服务端数据交互都使用密钥M来完成,密钥K只使用1次。
非首次连接
前面提到客户端和服务端首次连接时服务端传递了config包,里面包含了服务端公钥和两个随机数,客户端会将config存储下来,后续再连接时可以直接使用,从而跳过这个1RTT,实现0RTT的业务数据交互。
参考: https://baijiahao.baidu.com/s?id=1677802258258817086&wfr=spider&for=pc