Web服务器一些机制

news/2024/8/31 10:03:56

1 通信协议

1.1 HTTP/HTTPS

         HTTP是HyperTextTransfer Protocol(超文本传输协议)的缩写。HTTP协议是用于从Web服务器传输超文本到本地浏览器的协议,它能使浏览器更加高效,使网络传输减少,保证计算机正确快速地传输超文本文档。

          HTTP是一个应用层协议,它由请求和响应组成,是一个标准的B/S模型。同时,它也是一个无状态的协议,即同一个客户端上,此次请求与上一次请求是没有对应关系的。

         而HTTPS简单地说就是HTTP的安全版。如图1.1所示,如果在TCP协议上加一层SSL或TLS协议,就构成HTTPS协议了。SSL/TLS协议提供了加解密的机制,所以它比HTTP明文传输更安全。从图1中可以看出,HTTP可以直接进入TCP传输层,也可以在TCP层上加一层SSL/TLS层,这样就先经过SSL/TLS再进入TCP传输层。这两种方式便是HTTP与HTTPS。一般HTTP的端口号为80,而HTTPS的端口号为443

           

                                     图 1 .1

          简单地说,SSL/TLS协议层主要的职责就是借助下层协议的信道安全地协商出一份加密密钥,并且用此密钥来加密HTTP请求响应报文。 它解决了了以下三个安全性方面的议题。

  • 提供验证服务,验证本次会话实体身份的合法性
  • 提供加密服务,强加密机制能保证通信过程中的消息不会被破译
  • 提供放篡改服务,利用Hash算法对消息进行签名,通过验证签名保证通信内容不被篡改

         在理解HTTPS工作原理前,先了解一些加密解密算法与Hash算法。

  •  对称加密:密钥只有一个,加密、解密都是这个密码,加解密速度快,典型的对称加密算法有DES、AES、RC4等
  • 非对称加密:密钥成对出现,分别为公钥与私钥,从公钥无法推知私钥,反之,从私钥也不能推知公钥。加密、解密使用不同的密钥,公钥加密需要私钥解密,反之,私钥加密需要公钥解密。非对称加密速度较慢,典型的非对称加密算法有RSA、DSA、DSS等
  • Hash算法,这是一种不可逆的算法,它常用于验证数据的完整性。

图1.2 详细描述了HTTPS完成一次通信要做哪些事情。

                                                                        图 2 

  1. 浏览器(客户端)向服务器的443端口发送请求,请求携带了浏览器支持的加密算法和哈希算法。
  2. 服务器收到请求,选择一组浏览器支持的加密算法和哈希算法
  3. 服务器将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的(如:赛门铁克),也可以是自制的
  4. 浏览器进入数字证书认证环节,这一部分是浏览器内置的TSL完成的:                                                                                       4.1 首先浏览器会从内置的证书列表(CA证书列表)中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书不是由权威机构颁发的,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥(机构生成证书时会有)。         4.2 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证后,浏览器就可以安全使用证书中的网站公钥了。                                                                                                                                                                                           4.3 浏览器生成一个随机数R(对称密钥),并使用网站公钥对R进行加密。
  5. 浏览器将加密的R传送给服务器。
  6. 服务器用自己的私钥解密得到R     
  7. 服务器以R为密钥使用了对称加密算法加密网页内容并传输给浏览器
  8. 浏览器以R为密钥使用之前约定好的解密算法获取网页内容     

备注 1:前 5 步其实就是 HTTPS 的握手过程,这个过程主要是认证服务端证书(内置的公钥)的合法性。因为非对称加密计算量较大,整个通信过程只会用到一次非对称加密算法(主要是用来保护传输客户端生成的用于对称加密的随机数私钥)。后续内容的加解密都是通过一开始约定好的对称加密算法进行的。 

备注 2:SSL/TLS 是 HTTPS 安全性的核心模块,TLS 的前身是 SSL,TLS1.0 就是 SSL3.1,TLS1.1 是 SSL3.2,TLS1.2 则是 SSL3.3。 SSL/TLS 是建立在 TCP 协议之上,因而也是应用层级别的协议。其包括 TLS Record Protocol 和 TLS Handshaking Protocols 两个模块,后者负责握手过程中的身份认证,前者则保证数据传输过程中的完整性和私密性。

备注3:CA是数字证书管理机构,SSL证书是数字证书的一种,CA签发SSL证书,https是SSL证书的一种表现形式。服务器端部署了SSL证书,浏览器端才会显示HTTPS,HTTPS=HTTP+SSL /TLS(数字证书绑定了公钥及其持有者的真实身份)

1.2 HTTP请求/响应模型

         从某种意义上来说,HTTP协议永远都是由客户端发起请求,由服务器进行响应并发送回响应报文。

 一个HTTP请求与响应一般如图1.3所示:

                         

     通常,一个HTTP请求/响应的工作流程大概可以用以下4步来概括。

  1. 客户端浏览器先要与服务器建立连接,即通过三次握手建立连接。在浏览器上最常见的场景就是单机一个链接,这就触发了连接的建立
  2. 连接建立后,客户端浏览器发送一个请求到服务器,这个过程其实是组装请求报文的过程,详细的报文格式与解析后面再讲。
  3. 服务器端接收到请求报文后,对报文进行解析,组装成一定格式的响应报文,返回给客户端
  4. 客户端浏览器接收到响应报文后,通过浏览器内核对其进行解析,按照一定的外观进行显示,然后与服务器断开连接(四次挥手)。

2. 套接字通信

       套接字通信是应用层与TCP/IP协议族通信的中间抽象层,它是一组接口。应用层通过调用这些接口发送和接收数据。

      一般这种抽象层由操作系统提供或者由JVM自己实现。使用套接字通信可以简单地实现应用程序在网络上的通信。一台机器上的应用向套接字中写入信息,另外一台相连的机器能读取到。

      TCP/IP协议族中有两种套接字类型,分别是流套接字和数据报套接字,分别对应TCP协议和UDP协议。

      一个TCP/IP套接字由一个互联网地址、一个协议及一个端口号唯一确定(Socket=Ip address+ TCP/UDP + port)。 


http://www.niftyadmin.cn/n/2776857.html

相关文章

点击流日志分析架构

2019独角兽企业重金招聘Python工程师标准>>> 整体流程设计 1、通过日志收集系统将数据获取并存放到某个存储介质中,本例可以使用kafka 2、Storm程序从kafka中消费数据数据,逐条消费的日志 3、Storm程序从数据库中加载产品人员配置的任务信息 …

java字符串hash算法_Hash算法大全(java实现)

packagecom.conan;/*** Hash算法大全* 推荐使用FNV1算法** algorithm None*authorGoodzzp 2006-11-20* lastEdit Goodzzp 2006-11-20* editDetail Create*/publicclassHashAlgorithms {/*** 加法hash**paramkey* 字符串*paramprime* 一个质数*returnhash…

MyBatis事务隔离级别

一般数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。 √: 可能出现 : 不会出现 脏读 不可重复读 幻读 说明Read uncommitted √ √…

java json和map相互转化

2019独角兽企业重金招聘Python工程师标准>>> java使用json要导入如下这些包: commons-beanutils-1.7.0.jar commons-lang-2.1.jar ezmorph-1.0.2.jar json-lib-1.1-jdk15.jar commons-logging-1.0.4.jar commons-collections.jar commons-collections…

获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成。如果我们不希…

java timertask 定时_java任务调度之Timer定时器

定时器相信大家都不陌生,平时使用定时器就像使用闹钟一样,我们可以在固定的时间做某件事,也可以在固定的时间段重复做某件事,今天就来分析一下java中自带的定时任务器Timer。一、Timer基本使用在Java中为我们提供了Timer来实现定时…

Spring源码分析之一:spring容器启动以及获取Bean实例所做的事

一般手动启动spring容器和获取Bean实例我们会写如下代码: BeanFactory bf new XmlBeanFactory(new ClassPathResource("testBean.xml",getClass())); MyTestBean bean (MyTestBean) bf.getBean("myTestBean"); 或者是 ApplicationContext…

java web 加载dll_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

相信很多做Java的朋友都有过用Java调用JNI实现调用C或C方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢。今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章。在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来…