精华内容
下载资源
问答
  • 详解HTTP协议的工作原理
    千次阅读
    2020-02-10 17:47:24

    详解HTTP协议

    1.什么是HTTP协议

    HTTP((HyperText Transfer Protocol)即超文本传输协议。是一个简单的请求-响应协议,它通常运行在TCP之上。运行于应用层。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

    HTTP是一种无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应,连接就被关闭了,在服务器端不保留连接的有关信息(没有记忆)。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。

    2.HTTP协议的工作原理

    工作原理:HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。 WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

    HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
    (1)客户与服务器建立连接;
    (2)客户向服务器提出请求;
    (3)服务器接受请求,并根据请求返回相应的文件作为应答;
    (4)客户与服务器关闭连接。

    客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成干上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。

    HTTP协议的作用原理包括四个步骤(具体):  
    1. 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。

    2. 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:  GET 路径/文件名 HTTP/1.0  文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。

    3. 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。

    4. 关闭连接:客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接

    HTTP协议是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。
    许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理(UA)和源服务器(O)之间通过一个单独的连接来完成。
    当一个或多个中介出现在请求/响应链中时,情况就变得复杂一些。中介有三种:代理(Proxy)、网关(Gateway)和通道(Tunnel)。一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。

    更多相关内容
  • HTTP基本原理

    万次阅读 多人点赞 2018-02-12 15:11:22
    在本节中,我们会详细了解HTTP基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么。了解了这些内容,有助于我们进一步了解爬虫的基本原理。1. URI和URL这里我们先了解一下URI和URL,URI的全称为Uniform...

    在本节中,我们会详细了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么。了解了这些内容,有助于我们进一步了解爬虫的基本原理。

    1. URI和URL

    这里我们先了解一下URI和URL,URI的全称为Uniform Resource Identifier,即统一资源标志符,URL的全称为Universal Resource Locator,即统一资源定位符。

    举例来说,https://github.com/favicon.ico是GitHub的网站图标链接,它是一个URL,也是一个URI。即有这样的一个图标资源,我们用URL/URI来唯一指定了它的访问方式,这其中包括了访问协议https、访问路径(/即根目录)和资源名称favicon.ico。通过这样一个链接,我们便可以从互联网上找到这个资源,这就是URL/URI。

    URL是URI的子集,也就是说每个URL都是URI,但不是每个URI都是URL。那么,怎样的URI不是URL呢?URI还包括一个子类叫作URN,它的全称为Universal Resource Name,即统一资源名称。URN只命名资源而不指定如何定位资源,比如urn:isbn:0451450523指定了一本书的ISBN,可以唯一标识这本书,但是没有指定到哪里定位这本书,这就是URN。URL、URN和URI的关系可以用图2-1表示。


    图2-1 URL、URN和URI关系图

    但是在目前的互联网中,URN用得非常少,所以几乎所有的URI都是URL,一般的网页链接我们既可以称为URL,也可以称为URI,我个人习惯称为URL。

    2.  超文本

    接下来,我们再了解一个概念——超文本,其英文名称叫作hypertext,我们在浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列HTML代码,里面包含了一系列标签,比如img显示图片,p指定显示段落等。浏览器解析这些标签后,便形成了我们平常看到的网页,而网页的源代码HTML就可以称作超文本。

    例如,我们在Chrome浏览器里面打开任意一个页面,如淘宝首页,右击任一地方并选择“检查”项(或者直接按快捷键F12),即可打开浏览器的开发者工具,这时在Elements选项卡即可看到当前网页的源代码,这些源代码都是超文本,如图2-2所示。


    图2-2 源代码

    3. HTTP和HTTPS

    在淘宝的首页https://www.taobao.com/中,URL的开头会有http或https,这就是访问资源需要的协议类型。有时,我们还会看到ftp、sftp、smb开头的URL,它们都是协议类型。在爬虫中,我们抓取的页面通常就是http或https协议的,这里首先了解一下这两个协议的含义。

    HTTP的全称是Hyper Text Transfer Protocol,中文名叫作超文本传输协议。HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。HTTP由万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)共同合作制定的规范,目前广泛使用的是HTTP 1.1版本。

    HTTPS的全称是Hyper Text Transfer Protocol over Secure Socket Layer,是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,简称为HTTPS。

    HTTPS的安全基础是SSL,因此通过它传输的内容都是经过SSL加密的,它的主要作用可以分为两种。

    • 建立一个信息安全通道来保证数据传输的安全。
    • 确认网站的真实性,凡是使用了HTTPS的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过CA机构颁发的安全签章来查询。

    现在越来越多的网站和App都已经向HTTPS方向发展,例如:

    • 苹果公司强制所有iOS App在2017年1月1日前全部改为使用HTTPS加密,否则App就无法在应用商店上架;
    • 谷歌从2017年1月推出的Chrome 56开始,对未进行HTTPS加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”;
    • 腾讯微信小程序的官方需求文档要求后台使用HTTPS请求进行网络通信,不满足条件的域名和协议无法请求。

    而某些网站虽然使用了HTTPS协议,但还是会被浏览器提示不安全,例如我们在Chrome浏览器里面打开12306,链接为:https://www.12306.cn/,这时浏览器就会提示“您的连接不是私密连接”这样的话,如图2-3所示。


    图2-3 12306页面

    这是因为12306的CA证书是中国铁道部自行签发的,而这个证书是不被CA机构信任的,所以这里证书验证就不会通过而提示这样的话,但是实际上它的数据传输依然是经过SSL加密的。如果要爬取这样的站点,就需要设置忽略证书的选项,否则会提示SSL链接错误。

    4. HTTP请求过程

    我们在浏览器中输入一个URL,回车之后便会在浏览器中观察到页面内容。实际上,这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来,模型如图2-4所示。


    图2-4 模型图

    此处客户端即代表我们自己的PC或手机浏览器,服务器即要访问的网站所在的服务器。

    为了更直观地地说明这个过程,这里用Chrome浏览器的开发者模式下的Network监听组件来做下演示,它可以显示访问当前请求网页时发生的所有网络请求和响应。

    打开Chrome浏览器,右击并选择“检查”项,即可打开浏览器的开发者工具。这里访问百度http://www.baidu.com/,输入该URL后回车,观察这个过程中发生了怎样的网络请求。可以看到,在Network页面下方出现了一个个的条目,其中一个条目就代表一次发送请求和接收响应的过程,如图2-5所示。


    图2-5 Network面板

    我们先观察第一个网络请求,即www.baidu.com。

    其中各列的含义如下。

    • 第一列Name:请求的名称,一般会将URL的最后一部分内容当作名称。
    • 第二列Status:响应的状态码,这里显示为200,代表响应是正常的。通过状态码,我们可以判断发送了请求之后是否得到了正常的响应。
    • 第三列Type:请求的文档类型。这里为document,代表我们这次请求的是一个HTML文档,内容就是一些HTML代码。
    • 第四列Initiator:请求源。用来标记请求是由哪个对象或进程发起的。
    • 第五列Size:从服务器下载的文件和请求的资源大小。如果是从缓存中取得的资源,则该列会显示from cache。
    • 第六列Time:发起请求到获取响应所用的总时间。
    • 第七列Waterfall:网络请求的可视化瀑布流。

    点击这个条目,即可看到更详细的信息,如图2-6所示。

    图2-6 详细信息

    首先是General部分,Request URL为请求的URL,Request Method为请求的方法,Status Code为响应状态码,Remote Address为远程服务器的地址和端口,Referrer Policy为Referrer判别策略。

    再继续往下看,可以看到,有Response Headers和Request Headers,这分别代表响应头和请求头。请求头里带有许多请求信息,例如浏览器标识、Cookies、Host等信息,这是请求的一部分,服务器会根据请求头内的信息判断请求是否合法,进而作出对应的响应。图中看到的Response Headers就是响应的一部分,例如其中包含了服务器的类型、文档类型、日期等信息,浏览器接受到响应后,会解析响应内容,进而呈现网页内容。

    下面我们分别来介绍一下请求和响应都包含哪些内容。

    5. 请求

    请求,由客户端向服务端发出,可以分为4部分内容:请求方法(Request Method)、请求的网址(Request URL)、请求头(Request Headers)、请求体(Request Body)。

    (1) 请求方法

    常见的请求方法有两种:GET和POST。

    在浏览器中直接输入URL并回车,这便发起了一个GET请求,请求的参数会直接包含到URL里。例如,在百度中搜索Python,这就是一个GET请求,链接为https://www.baidu.com/s?wd=Python,其中URL中包含了请求的参数信息,这里参数wd表示要搜寻的关键字。POST请求大多在表单提交时发起。比如,对于一个登录表单,输入用户名和密码后,点击“登录”按钮,这通常会发起一个POST请求,其数据通常以表单的形式传输,而不会体现在URL中。

    GET和POST请求方法有如下区别。

    • GET请求中的参数包含在URL里面,数据可以在URL中看到,而POST请求的URL不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
    • GET请求提交的数据最多只有1024字节,而POST方式没有限制。

    一般来说,登录时,需要提交用户名和密码,其中包含了敏感信息,使用GET方式请求的话,密码就会暴露在URL里面,造成密码泄露,所以这里最好以POST方式发送。上传文件时,由于文件内容比较大,也会选用POST方式。

    我们平常遇到的绝大部分请求都是GET或POST请求,另外还有一些请求方法,如GET、HEAD、POST、PUT、DELETE、OPTIONS、CONNECT、TRACE等,我们简单将其总结为表2-1。

    表2-1 其他请求方法

    方法

    描述

    GET

    请求页面,并返回页面内容

    HEAD

    类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头

    POST

    大多用于提交表单或上传文件,数据包含在请求体中

    PUT

    从客户端向服务器传送的数据取代指定文档中的内容

    DELETE

    请求服务器删除指定的页面

    CONNECT

    把服务器当作跳板,让服务器代替客户端访问其他网页

    OPTIONS

    允许客户端查看服务器的性能

    TRACE

    回显服务器收到的请求,主要用于测试或诊断

    本表参考:http://www.runoob.com/http/http-methods.html

    (2) 请求的网址

    请求的网址,即统一资源定位符URL,它可以唯一确定我们想请求的资源。

    (3) 请求头

    请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent等。下面简要说明一些常用的头信息。

    • Accept:请求报头域,用于指定客户端可接受哪些类型的信息。
    • Accept-Language:指定客户端可接受的语言类型。
    • Accept-Encoding:指定客户端可接受的内容编码。
    • Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP 1.1版本开始,请求必须包含此内容。
    • Cookie:也常用复数形式 Cookies,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是Cookies的功劳。Cookies里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookies并将其发送给服务器,服务器通过Cookies识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容。
    • Referer:此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如作来源统计、防盗链处理等。
    • User-Agent:简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别出为爬虫。
    • Content-Type:也叫互联网媒体类型(Internet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型,更多对应关系可以查看此对照表:http://tool.oschina.net/commons

    因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。

    (4) 请求体

    请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。

    例如,这里我登录GitHub时捕获到的请求和响应如图2-7所示。

    图2-7 详细信息

    登录之前,我们填写了用户名和密码信息,提交时这些内容就会以表单数据的形式提交给服务器,此时需要注意Request Headers中指定Content-Type为application/x-www-form-urlencoded。只有设置Content-Type为application/x-www-form-urlencoded,才会以表单数据的形式提交。另外,我们也可以将Content-Type设置为application/json来提交JSON数据,或者设置为multipart/form-data来上传文件。

    表2-2列出了Content-Type和POST提交数据方式的关系。

    表2-2 Content-Type和POST提交数据方式的关系

    Content-Type

    提交数据的方式

    application/x-www-form-urlencoded

    表单数据

    multipart/form-data

    表单文件上传

    application/json

    序列化JSON数据

    text/xml

    XML数据

    在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并了解各种请求库的各个参数设置时使用的是哪种Content-Type,不然可能会导致POST提交后无法正常响应。

    6. 响应

    响应,由服务端返回给客户端,可以分为三部分:响应状态码(Response Status Code)、响应头(Response Headers)和响应体(Response Body)。

    (1) 响应状态码

    响应状态码表示服务器的响应状态,如200代表服务器正常响应,404代表页面未找到,500代表服务器内部发生错误。在爬虫中,我们可以根据状态码来判断服务器响应状态,如状态码为200,则证明成功返回数据,再进行进一步的处理,否则直接忽略。表2-3列出了常见的错误代码及错误原因。

    表2-3 常见的错误代码及错误原因

    状态码

    说明

    详情

    100

    继续

    请求者应当继续提出请求。服务器已收到请求的一部分,正在等待其余部分

    101

    切换协议

    请求者已要求服务器切换协议,服务器已确认并准备切换

    200

    成功

    服务器已成功处理了请求

    201

    已创建

    请求成功并且服务器创建了新的资源

    202

    已接受

    服务器已接受请求,但尚未处理

    203

    非授权信息

    服务器已成功处理了请求,但返回的信息可能来自另一个源

    204

    无内容

    服务器成功处理了请求,但没有返回任何内容

    205

    重置内容

    服务器成功处理了请求,内容被重置

    206

    部分内容

    服务器成功处理了部分请求

    300

    多种选择

    针对请求,服务器可执行多种操作

    301

    永久移动

    请求的网页已永久移动到新位置,即永久重定向

    302

    临时移动

    请求的网页暂时跳转到其他页面,即暂时重定向

    303

    查看其他位置

    如果原来的请求是POST,重定向目标文档应该通过GET提取

    304

    未修改

    此次请求返回的网页未修改,继续使用上次的资源

    305

    使用代理

    请求者应该使用代理访问该网页

    307

    临时重定向

    请求的资源临时从其他位置响应

    400

    错误请求

    服务器无法解析该请求

    401

    未授权

    请求没有进行身份验证或验证未通过

    403

    禁止访问

    服务器拒绝此请求

    404

    未找到

    服务器找不到请求的网页

    405

    方法禁用

    服务器禁用了请求中指定的方法

    406

    不接受

    无法使用请求的内容响应请求的网页

    407

    需要代理授权

    请求者需要使用代理授权

    408

    请求超时

    服务器请求超时

    409

    冲突

    服务器在完成请求时发生冲突

    410

    已删除

    请求的资源已永久删除

    411

    需要有效长度

    服务器不接受不含有效内容长度标头字段的请求

    412

    未满足前提条件

    服务器未满足请求者在请求中设置的其中一个前提条件

    413

    请求实体过大

    请求实体过大,超出服务器的处理能力

    414

    请求URI过长

    请求网址过长,服务器无法处理

    415

    不支持类型

    请求格式不被请求页面支持

    416

    请求范围不符

    页面无法提供请求的范围

    417

    未满足期望值

    服务器未满足期望请求标头字段的要求

    500

    服务器内部错误

    服务器遇到错误,无法完成请求

    501

    未实现

    服务器不具备完成请求的功能

    502

    错误网关

    服务器作为网关或代理,从上游服务器收到无效响应

    503

    服务不可用

    服务器目前无法使用

    504

    网关超时

    服务器作为网关或代理,但是没有及时从上游服务器收到请求

    505

    HTTP版本不支持

    服务器不支持请求中所用的HTTP协议版本

    (2) 响应头

    响应头包含了服务器对请求的应答信息,如Content-Type、Server、Set-Cookie等。下面简要说明一些常用的头信息。

    • Date:标识响应产生的时间。
    • Last-Modified:指定资源的最后修改时间。
    • Content-Encoding:指定响应内容的编码。
    • Server:包含服务器的信息,比如名称、版本号等。
    • Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表返回JavaScript文件,image/jpeg则代表返回图片。
    • Set-Cookie:设置Cookies。响应头中的Set-Cookie告诉浏览器需要将此内容放在Cookies中,下次请求携带Cookies请求。
    • Expires:指定响应的过期时间,可以使代理服务器或浏览器将加载的内容更新到缓存中。如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间。

    (3) 响应体

    最重要的当属响应体的内容了。响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;请求一张图片时,它的响应体就是图片的二进制数据。我们做爬虫请求网页后,要解析的内容就是响应体,如图2-8所示。


    图2-8 响应体内容

    在浏览器开发者工具中点击Preview,就可以看到网页的源代码,也就是响应体的内容,它是解析的目标。

    在做爬虫时,我们主要通过响应体得到网页的源代码、JSON数据等,然后从中做相应内容的提取。

    本节中,我们了解了HTTP的基本原理,大概了解了访问网页时背后的请求和响应过程。本节涉及的知识点需要好好掌握,后面分析网页请求时会经常用到。

    转自:https://cuiqingcai.com/5465.html

    展开全文
  • MyBatis 的基本工作原理

    千次阅读 2020-02-20 17:49:12
    MyBatis 是一款优秀的持久层框架。于原生的 JDBC 相比,MyBatis 避免了几乎所有的 JDBC...1. MyBatis 的基本工作原理 MyBatis 应用的核心 每一个 MyBatis 应用的都是以一个 SqlSessionFactory 的实例为核心的。因为 ...

    博客地址:www.lxiaocode.com

    MyBatis 是一款优秀的持久层框架。于原生的 JDBC 相比,MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的繁琐操作。在开发中是十分常用的框架之一。


    1. MyBatis 的基本工作原理

    MyBatis 应用的核心

    每一个 MyBatis 应用的都是以一个 SqlSessionFactory 的实例为核心的。因为 SqlSessionFactory 实例是通过 SqlSessionFactoryBuilder 和 MyBatis 的配置文件构建出来,所以 SqlSessionFactory 包含了你对 MyBatis 配置的所有信息。

    一个简单的构建 SqlSessionFactory 的例子:

    // MyBatis 配置文件
    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    

    MyBatis 配置文件

    配置文件包含了对 MyBats 系统的核心设置,包括了获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)等等相关配置。

    MyBatis 还有一个特点就是 SQL 语句映射。MyBatis 可以将映射器 Mapper 中的方法与 XML 映射文件中的 SQL 语句构成映射关系。而这些 XML 映射文件也需要在 MyBatis 配置文件进行设置。

    在构建 SqlSessionFactory 时,这些配置会作为 SqlSessionFactoryBuilder 参数传到 SqlSessionFactory 中去,SqlSessionFactory 就会根据这些配置文件构建出专门负责访问数据库的对象。

    一个简单 MyBatis 配置文件例子:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
      <environments default="development">
        <environment id="development">
          <!-- 事务管理器 -->
          <transactionManager type="JDBC"/>
          <!-- 数据源 -->
          <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <!-- XML 映射文件 -->
      <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
      </mappers>
    </configuration>
    

    MyBatis 访问数据库

    因为 SqlSessionFactory 管理着 MyBatis 配置文件的所有信息,所以 SqlSessionFactory 会根据 MyBatis 的配置信息构建出 SqlSession 实例。SqlSession 实例同样会获取到 MyBatis 的配置文件信息,并且通过数据库相关信息,负责与数据库进行连接访问。

    一个简单的 SqlSession 访问数据库的例子:

    try (SqlSession session = sqlSessionFactory.openSession()) {
      Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
    }
    

    SqlSession 实例也可以通过 XML 映射文件信息获取相应的映射器实例,然后使用映射器实例访问数据库。

    一个简单的映射器实例访问数据库的例子:

    try (SqlSession session = sqlSessionFactory.openSession()) {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
      Blog blog = mapper.selectBlog(101);
    }
    

    图解 MyBatis 的基本工作原理

    根据上面讲解作出此图,以便理解:

    mybatis core


    2. MyBatis 组件

    SqlSessionFactoryBuilder

    这个类主要是负责创建 SqlSessionFactory 实例的,一旦 SqlSessionFactory 实例被创建,就再也不需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域就是方法作用域。

    SqlSessionFactory

    因为 SqlSessionFactory 管理着 MyBatis 所有的配置信息,所以它是 MyBatis 应用的核心组件,一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。因此 SqlSessionFactory 的最佳作用域是应用作用域,最简单的就是使用单例模式实现。

    SqlSession

    因为 SqlSession 实例不是线程安全的,所以 SqlSession 不能在应用中共享。每一个线程都需要一个独立的 SqlSession 实例。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。 这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

    映射器实例

    映射器是一些由你创建的、绑定 XML 映射文件中的 SQL 的接口,映射器实例是从 SqlSession 获取的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。 也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。


    参考文献:

    MyBatis 官方文档

    展开全文
  • HTTP详解(1)-工作原理

    万次阅读 多人点赞 2013-03-16 23:24:05
    1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。...在了解HTTP如何工作之前,我...

         

    1. HTTP简介


             HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

             在了解HTTP如何工作之前,我们先了解计算机之间的通信。

    2. 计算机相互之间的通信


            互联网的关键技术就是TCP/IP协议。两台计算机之间的通信是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议:

            TCP : Transmission Control Protocol 传输控制协议和IP: Internet Protocol  网际协议。

    IP:计算机之间的通信

            IP协议是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在internet上标识这台计算机。  IP 负责在因特网上发送和接收数据包。通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每个包路由至它的目的地。

            IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP.

            

    TCP : 应用程序之间的通信

           TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。一些端口号为不同的服务保留,而且这些端口号是众所周知。

           服务或者守护进程:在提供服务的机器上,有程序监听特定端口上的通信流。例如大多数电子邮件通信流出现在端口25上,用于wwww的HTTP通信流出现在80端口上。

           当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信,占用两个计算机之间整个的通信线路。TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。

           TCP/IP 就是TCP 和 IP 两个协议在一起协同工作,有上下层次的关系。

           TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输过程要经IP路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。

    3. HTTP协议所在的协议层


          HTTP是基于TCP协议之上的。在TCP/IP协议参考模型的各层对应的协议如下图,其中HTTP是应用层的协议。

         


     

    4. HTTP请求响应模型


           HTTP由请求和响应构成,是一个标准的客户端服务器模型(B/S)。HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:

       

           HTTP是一个无状态的协议。无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。

    5. HTTP工作过程


         一次HTTP操作称为一个事务,其工作整个过程如下:

         1 ) 、地址解析,

         如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm

         从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
         协议名:http
         主机名:localhost.com
         端口:8080
         对象路径:/index.htm

          在这一步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。


        2)、封装HTTP请求数据包

         把以上部分结合本机自己的信息,封装成一个HTTP请求数据包


         3)封装成TCP包,建立TCP连接(TCP的三次握手)

           在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口

         4)客户机发送请求命令

           建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。

    这里顺便说明个人理解

    URI:  统一资源标识符,用来唯一的标识一个资源,是一种语义上的抽象概念。
    URL :统一资源定位符,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何访问到这个资源

    URI是以一种抽象的,高层次概念定义统一资源标识,标记了一个网络资源,而URL则是具体的资源标识的方式。

    简单比喻 - URI唯一标识一个人(例如身份证), URL定义了如何访问到这个人(例如家庭地址)

         5)服务器响应

         服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

            实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

         6)服务器关闭TCP连接

         一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码

        Connection:keep-alive

       TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    6. HTTP协议栈中各层数据流      


                 首先我们看看客户端请求的时候,数据在各层协议的数据组织如下图:

            

                而服务器解析客户机请求就是反向操作的过程,如下图:

              
           

           客户机发起一次请求的时候:

           客户机会将请求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(二进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点。

           服务器硬件首先收到bit流....... 然后转换成ip数据包。于是通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。

    7. HTTPS实现原理    


            HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。

           SSL:SSL(Secure Socket Layer,安全套接字层),是netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。
           SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
            TLS:TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
    TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1(可简单理解为同一事物不同阶段的不同称呼),它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
     SSL和TLS的主要区别?
    TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。另外,TLS版本号也与SSL的不同(TLS的版本1.0使用的版本号为SSLv3.1).
     

    7.1、加解密算法

    有两种基本的加解密算法类型:

          1)、对称加密(symmetrcic encryption):密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;例如我们使用WinRAR创建一个带密码(口令)的加密压缩包。当你下次要把这个压缩文件解开的时候,你需要输入【同样的】密码。在这个例子中,密码/口令就如同刚才说的“密钥”。

           对称加密主要问题是共享秘钥,除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密。解决这个问题的方案非对称秘钥。

          2)、非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥。一般来说指:加密时使用公钥,解密时使用私钥。

          这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

    7.2、https的单向认证通信过程

    非对称加密很耗时,不可能对实际的数据都非对称加密来传输。HTTPS采用的是处理信息的方式是:结合对称加密+非对称加密这两种方式。我们可以用非对称加密的方式来传输对称加密过程中的密钥,之后我们就可以采取对称加密的方式来传输数据了。

    简单工作过程如下:

    1、客户端请求公钥:服务器用明文的方式给客户端发送自己的公钥(对应的私钥还在服务端手上,没有泄露)。

    2、客户端生成随机数密钥:客户端收到公钥之后,会生成一个随机数密钥(对称加密用的),然后用服务器的公钥对这把随机数密钥进行加密,之后再把随机数密钥传输给服务器。

    3、服务器使用私钥解密随机数密钥:服务器收到随机数密钥之后用私钥解密得到随机数解密,此时,客户端和服务端都拥有了这个随机数密钥,并且它没有被泄露。即使黑客截取了公钥或者加密后的随机数都无法解密(因为公钥加密的随机数只能用私钥解密)

    4、对称加密传输:最后服务器安全得到这把随机数密钥了,而客户端也有同样一把随机数密钥,他们就可以进行对称加密传输数据了。

    过程大致如下:"握手阶段"涉及四次通信,我们一个个来看。需要注意的是,"握手阶段"的所有通信都是明文的。

    1、客户端发出TSL请求(ClientHello):

    由于客户端(如浏览器)对一些加解密算法的支持程度不一样,但是在TLS协议传输过程中必须使用同一套加解密算法才能保证数据能够正常的加解密。在TLS握手阶段,客户端首先要告知服务端,自己支持哪些加密算法,所以客户端需要将本地支持的加密套件(Cipher Suite)的列表传送给服务端。除此之外,客户端还要产生一个随机数,这个随机数一方面需要在客户端保存,另一方面需要传送给服务端,客户端的随机数需要跟服务端产生的随机数结合起来产生后面要讲到的 Master Secret 。

    综上,在这一步,客户端主要向服务器提供以下信息:

    1. 支持TLS/SSL协议版本,比如TLS 1.0版
    2. 一个客户端生成的随机数ClientRnd (第1个随机数),稍后用于生成”对话密钥”
    3. 支持的加密算法,比如RSA公钥加密
    4. 支持的压缩方法

    2、 服务器回应(SeverHello->Server Hello Done)

    server_hello:服务端返回协商的信息结果,包括选择使用的协议版本 version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 ServerRnd等,其中随机数用于后续的密钥协商;
    server_certificates:服务器端配置对应的证书链,用于身份验证与密钥交换;
    server_hello_done:通知客户端 server_hello 信息发送结束;


    从Server Hello到Server Done,有些服务端的实现是每条单独发送,有服务端实现是合并到一起发送。Sever Hello和Server Done都是只有头没有内容的数据。从抓包图中,数据包是分段发送的:

    服务端在接收到客户端的Client Hello之后,服务端需要将自己的证书发送给客户端。这个证书是对于服务端的一种认证。例如,客户端收到了一个来自于称自己是www.aliyun.com的数据,但是如何证明对方是合法的aliyun呢?这就是证书的作用,aliyun的证书可以证明它是aliyun,而不是其他云。证书是需要申请,并由专门的数字证书认证机构(CA)通过非常严格的审核之后颁发的电子证书。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被串改。另外,证书还有个有效期。

    在服务端向客户端发送的证书中没有提供足够的信息(证书公钥)的时候,还可以向客户端发送一个 Server Key Exchange

    此外,对于非常重要的保密数据,服务端还需要对客户端进行验证,以保证数据传送给了安全的合法的客户端。服务端可以向客户端发出 Cerficate Request 消息,要求客户端发送证书对客户端的合法性进行验证。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

    跟客户端一样,服务端也需要产生一个随机数发送给客户端。客户端和服务端都需要使用这两个随机数来产生Master Secret。

    最后服务端会发送一个Server Hello Done消息给客户端,表示Server Hello消息结束了。

    综上,在这一步,服务器的回应包含以下内容:

    1. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信
    2. 一个服务器生成的随机数ServerRnd(第2个随机数),稍后用于生成”对话密钥”
    3. 确认使用的加密算法,比如RSA公钥加密
    4. 服务器证书:证书包含服务器信息:域名/服务地址、公钥、证书的CA

    3、客户端回应(Certificate Verify)

    client_key_exchange+change_cipher_spec+encrypted_handshake_message
    Client Key Exchange:
    如果服务端需要对客户端进行验证,在客户端收到服务端的 Server Hello 消息之后,首先需要向服务端发送客户端的证书,让服务端来验证客户端的合法性。

    Certificate Verify (验证证书的合法性):
    接着,客户端需要对服务端的证书进行检查:颁发证书的机构是否合法、证书中的域名与实际域名不一致、证书已经过期等等。如果是浏览器客户端,若证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

    如果证书没有问题,客户端就会从服务器证书中取出服务器的公钥。然后,向服务器发送下面几项项信息:

    1. 生成随机数(对称秘钥PreMasterSecret ,第3个随机数)::客户端并使用证书带的公钥将 PreMasterSecret 进行加密.  它是客户端使用一些加密算法(例如:RSA, Diffie-Hellman)产生一个48个字节的Key,这个Key叫 PreMaster Secret,很多材料上也被称作 PreMaster Key。
    2. 编码改变通知ChangeCipherSpec: 表示随后的信息都将用双方商定的加密算法和密钥发送
    3. ClientHash 值: 通过之前交换的数据(前面发送的所有内容)生成一个 ClientHash 值,用来供服务器校验。
    4. 客户端握手结束通知,表示客户端的握手阶段已经结束。

    上面第一项的随机数,是整个握手阶段出现的第三个随机数,它是客户端使用一些加密算法(例如:RSA, Diffie-Hellman)产生一个48个字节的Key,这个Key叫 PreMaster Secret,很多材料上也被称作 PreMaster Key。
    此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 ClientRndServerRnd与自己计算产生的 PreMasterSecret ,计算得到协商密钥; 
    enc_key(SessionSecret)=Fuc(ClientRnd, ServerRnd, PreMasterSecret )


    Change Cipher Spec:  

    Change Cipher Spec客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信;
    Change Cipher Spec是一个独立的协议,体现在数据包中就是一个字节的数据,用于告知服务端,客户端已经切换到之前协商好的加密套件(Cipher Suite)的状态,准备使用之前协商好的加密套件加密数据并传输了。

    Encrypted Handshake Message: 

    在Change cipher Spec传输完毕之后,通过之前交换的数据(前面发送的所有内容)生成一个 ClientHash 数据。   客户端会使用之前协商好的加密算法和SessionSecret加密ClientHash 数据传送给服务端,此ClientHash 数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。

    4、服务器的最后回应(Server Finish)

    4.1. 使用自己证书的私钥解密出 PreMasterSecret
    4.2. 生成SessionSecret:服务端根据之前的随机数(ClientRnd ServerRnd,PreMasterSecret )和约定的加密算法,生成用于加密后续传输数据的会话密钥 SessionSecret。

    enc_key=Fuc(ClientRnd, ServerRnd, PreMasterSecret )

    4.3.校验 clientHash (确认不是假的客户端)和密钥SessionSecret正确性:

    计算之前所有接收信息的 hash 值,即为serverHash。然后解密客户端发送encrypted_handshake_message的ClientHash,验证数据和密钥正确性(即serverHash ==ClientHash  是否为true);

    4.4. Change Cipher Spec确认变更编码:  会给客户端发送一个 ChangeCipherSpec,告知客户端已经切换到协商过的加密套件状态,准备使用加密套件和 Session Secret加密数据了。
    4.5. Encrypted Handshake Message Finish信息:服务器也结合所有当前的通信参数信息生成一段Finish消息数据,并采用协商密钥SessionSecret  与算法加密并发送到客户端, 以验证之前通过握手建立起来的加解密通道是否成功。

    5、握手结束
    客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成;

    ==========================================================

    6、数据传输:

    根据之前的握手信息,如果客户端和服务端都能对Finish信息进行正常加解密且消息正确的被验证,则说明握手通道已经建立成功,接下来,双方可以使用上面产生的Session Secret对数据进行加密传输了。

    在这个过程中,有几个关键点:

    • 前两次的随机数(客户端随机数、服务端随机数)是明文传输的
    • 非对称密钥算法只被使用了一次,即客户端使用证书公钥加密 PreMasterSecret,服务端使用证书私钥解密出 PreMasterSecret
    • 应用数据的传输使用的是对称密钥算法,客户端/服务端都使用会话密钥进行加/解密

    在握手阶段,安全与否的关键在于 PreMasterSecret 是否能够被破解,虽然理论上通过 RSA 算法加密是比较安全的,但还是有破解的可能性。最安全的做法是不发送 PreMasterSecret,而是根据一系列参数由客户端和服务端分别计算出 PreMasterSecret,这个算法就是迪菲-赫尔曼密钥交换

    有了PreMasterSecret 以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。至于为什么一定要用三个随机数,来生成"会话密钥",dog250解释得很好:

    "不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。

    对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。

    pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"

    https通信的优点:

    1)客户端产生的密钥只有客户端和服务器端能得到;

    2)加密的数据只有客户端和服务器端才能得到明文;

    3)客户端到服务端的通信是安全的

    7.3、非对称加密算法RSA的加密解密原理

    1、每个用户都有一对私钥和公钥。

    •    私钥用来进行解密和签名,是给自己用的。
    •  公钥由本人公开,用于加密和验证签名,是给别人用的。

    2、当该用户发送文件时,用私钥签名,别人用他给的公钥解密,可以保证该信息是由他发送的。即数字签名。

    3、当该用户接受文件时,别人用他的公钥加密,他用私钥解密,可以保证该信息只能由他看到。即安全传输.

    7.4、数字证书和CA

    数字证书(Digital Certificate)是用来证明公钥(非对称密钥算法中用于加密的密钥)所有者身份的。

    1、数字证书是CA对公钥签名:数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。

    2、数字证书公开的:CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人都可以查询和下载,因此数字证书和公钥一样是公开的。实际上,数字证书就是经过CA认证过的公钥。

    3、如何认证公钥可靠:我们人人都可以自己生成一个公钥,但是这个公钥是否能代表是你的,这个认证的过程需要一个权威机构执行,这个机构就是证书授权中心。

    证书授权中心(Certificate Authority)负责证书颁发。CA 是行业内信得过的组织机构,它具有权威性,由它颁发的证书大家都相信是可靠的。

    一般我们自己也生成HTTPS证书,但是自己生成的HTTPS证书却是不能用的。因为浏览器只会承认受信任CA所签发出来的证书,其他个人自签的HTTPS证书浏览器是不会承认的,一律会显示“此网站不安全”的安全提示。所以不要尝试自己去生成HTTPS证书,需要HTTPS证书我们就去找受信任的CA机构进行申请。

    7.5、CA认证流程

    SSL双向认证步骤:

    1. 服务端申请证书:HTTPS通信双方的服务器端向CA机构申请证书,CA机构是可信的第三方机构,它可以是一个公认的权威的企业,也可以是企业自身。企业内部系统一般都使用企业自身的认证系统。CA机构下发根证书、服务端证书及私钥给申请者;
    2. HTTPS通信双方的客户端向CA机构申请证书,CA机构下发根证书、客户端证书及私钥个申请者;
    3. 客户端向服务器端发起请求,服务端下发服务端证书给客户端。客户端接收到证书后,通过私钥解密证书,并利用服务器端证书中的公钥认证证书信息比较证书里的消息,例如域名和公钥与服务器刚刚发送的相关消息是否一致,如果一致,则客户端认为这个服务器的合法身份;
    4. 客户端发送客户端证书给服务器端,服务端接收到证书后,通过私钥解密证书,获得客户端的证书公钥,并用该公钥认证证书信息,确认客户端是否合法;
    5. 客户端通过随机秘钥加密信息,并发送加密后的信息给服务端。服务器端和客户端协商好加密方案后,客户端会产生一个随机的秘钥,客户端通过协商好的加密方案,加密该随机秘钥,并发送该随机秘钥到服务器端。服务器端接收这个秘钥后,双方通信的所有内容都都通过该随机秘钥加密;

    通过上述介绍,我们得知使用 SSL/TLS 需要做如下准备:

    下面我们针对自建 CA 做一个完整的示例(证书相关使用 Linux 的 openssl 命令,客户端、服务端使用 Golang)。

    • 数字证书:可以找权威的证书授权中心颁发证书(有付费的,也有免费的),也可以自己做 CA,然后自己给自己颁发证书
    • 服务端使用证书,比如配置 NGINX 来使用
    • 客户端使用 SSL/TLS 协议和服务端进行通讯,如果是自己的 CA 颁发的证书,还需要在客户端导入 CA 的根证书

    建立 CA

    • 生成 CA 私钥:openssl genrsa -out ca.key 2048
    • 生成 CA 根证书:openssl req -new -x509 -days 3650-key ca.key -out ca.crt

    颁发证书

    • 生成证书私钥:openssl genrsa -out auto.pem 1024
    • 生成证书公钥:openssl rsa -in auto.pem -out auto.key
    • 生成签名请求:openssl req -new -key auto.pem -out auto.csr,其中的 Common Name 一定要填写客户端访问时的域名,并且不能是 IP
    • CA 签名(颁发)证书:openssl x509 -req -sha256 -in auto.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out auto.crt

    最终我们需要的就是公钥 auto.key 以及证书 auto.crt


     

    7.6、浏览器内置常用证书

    一个重要的问题是,如何安全转交认证机构的公钥是一件很困难的事,因此,大多数浏览器开发商发布版本时,会事先植入常用认证机关的公钥。
    我们可以Google Chrome为例:打开浏览器的设置选项,选择高级,可以看到隐私设置和安全性下面的一些设置,其中管理证书就可以看到谷歌浏览器一些内置证书,如图:

    7.8双向认证

    双向认证和单向认证原理基本差不多,主要区别是除了客户端需要认证服务端以外,服务端对客户端也需要认证。什么场景下需要验证客户端呢?比如一些银行业务,银行会要求客户必须在电脑上插入它们签发的U盾之类的东西,或者安装什么控件,这里就类似客户端证书的概念,没有这个证书的人无法使用银行提供的业务。

    8. HTTP各种长度限制   


    1. URL长度限制

    在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端必须能够处理任何它们所提供服务多能接受的URI,并且能够处理无限长度的URI,如果服务器不能处理过长的URI,那么应该返回414状态码。

    虽然Http协议规定了,但是Web服务器和浏览器对URI都有自己的长度限制。

    服务器的限制:我接触的最多的服务器类型就是Nginx和Tomcat,对于url的长度限制,它们都是通过控制http请求头的长度来进行限制的,nginx的配置参数为large_client_header_buffers,tomcat的请求配置参数为maxHttpHeaderSize,都是可以自己去进行设置。

    浏览器的限制:每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)

    IE : 2803

    Firefox:65536

    Chrome:8182

    Safari:80000

    Opera:190000

    对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。

    2. Post数据的长度限制

    Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http请求头长度的方式来实现。

    3. Cookie的长度限制

    Cookie的长度限制分这么几个方面来总结。

    (1) 浏览器所允许的每个域下的最大cookie数目,没有去自己测试,从网上找到的资料大概是这么个情况

    IE :原先为20个,后来升级为50个

    Firefox: 50个

    Opera:30个

    Chrome:180个

    Safari:无限制

    当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。

    (2) 浏览器所允许的每个Cookie的最大长度

    Firefox和Safari:4079字节

    Opera:4096字节

    IE:4095字节

    (3) 服务器中Http请求头长度的限制。Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。

    4. Html5 LocalStorage

    Html5提供了本地存储机制来供Web应用在客户端存储数据,尽管这个并不属于Http协议的一部分,但是随着Html5的流行,我们可能需要越来越多使用LocalStorage,甚至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道一样多。

    对于LocalStorage的长度限制,同Cookie的限制类似,也是浏览器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:

    Firefox\Chrome\Opera都是允许每个域的最大长度为5MB

    但是这次IE比较大方,允许的最大长度是10MB

    展开全文
  • MVC框架基本工作原理

    千次阅读 2019-04-15 21:23:07
    MVC工作原理 Model 模型层,一般对数据的处理会放在这层 View 视图层,渲染html页面,展示给用户 Controller 控制器层,处理逻辑,调用Model和view的相关方法 单一入口的工作原理 用一个处理程序文件处理...
  • http工作原理和机制

    千次阅读 2018-03-18 11:27:04
    http工作原理和特点博客分类: web 一.http基本原理: HTTP协议的工作原理主要包括四个步骤 图1 HTTP协议工作原理 (1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的...
  • session 的工作原理

    千次阅读 2019-06-24 23:56:39
    session 的工作原理? 1、什么是 session session 是浏览器和服务器会话过程中,服务器分配的一块储存空间。服务器默认为浏览器在cookie中设置sessionid,浏览器在向服务器请求过程中传输 cookie 包含 sessionid ...
  • HTTP和HTTPS的工作原理及区别

    千次阅读 2021-01-30 13:17:49
    一、HTTP和HTTPS的基本概念 HTTP(HyperText Transfer Protocol:超文本传输协议):是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从Web服务器传输超文本到本地...
  • SSD基本工作原理

    千次阅读 多人点赞 2016-02-25 12:11:51
    SSD内部都有垃圾回收机制,它的基本原理是把几个Block中的有效数据(非垃圾数据,上图中的绿色小方块表示的)集中搬到一个新的Block上面去,然后再把这几个Block擦除掉,这样就产生新的可用Block了。 上图中...
  • RFID的基本结构及工作原理

    万次阅读 2019-06-10 09:20:31
    无线射频识别系统的基本工作原理:电子标签进入电磁场后,接收读写器发出的射频信号,无源电子标签或者被动电子标签利用空间中产生的电磁场得到的能量,将被测物体的信息传送出去,读写器读取信息并且进行解码后,...
  • TCP/IP协议的基本工作原理

    万次阅读 2017-10-13 09:23:38
    由于物理原因,处于IDLE状态的TCP连接一端崩溃的时候,TCP有保活机制来判断对端是否仍然工作。这个设计存在争议,也许应用层应该实现该功能。RFC1122中有描述,保活定时器默认是关闭的。下面截取了一些RFC描述。 ...
  • HTTP协议:工作原理

    万次阅读 2017-08-15 19:25:34
    1. HTTP简介  HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。... 在了解HTTP如何工作之前,我们先了
  • MPLS的工作原理

    千次阅读 2020-12-18 22:10:58
    MPLS工作组到目前为止已经把在帧中继、ATM和PPP链路以及IEEE802.3局域网上使用的标记实现了标准化。MPLS在帧中继和ATM上运行的一个好处是它为这些面向连接的技术 带来了IP的任意连通性。目前MPLS的主要发展方向是在...
  • TCP/IP http协议基本概念、原理

    千次阅读 2018-11-21 03:22:14
    http协议中用于OSI会话层的部分:在http1.1中默认是长连接,即http server在处理完http请求,返回response后不会立即断开连接。client可设置connection为false,server返回response后会主动断开连接。request header...
  • 磁力计的基本工作原理

    千次阅读 2017-02-20 09:37:06
    参考文章地址:http://blog.sina.com.cn/s/blog_402c071e0102v8ig.html电子罗盘是一种重要的导航工具,能实时提供移动物体的航向和姿态。随着半导体工艺的进步和手机操作系统的发展,集成了越来越多传感器的智能手机...
  • ARP工作原理

    千次阅读 2019-06-25 11:04:21
    二、ARP协议的工作原理 我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址...
  • HTTP代理服务器的工作原理

    千次阅读 2019-05-29 22:35:49
    ​ 在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器。代理服务器按照其使用...
  • IIS工作原理

    千次阅读 2019-09-09 11:45:19
    当ISAPI(ASP.NET工作进程)运行之后,IIS将请求文件继续转交到ISAPI工作进程 IIS处理流程暂时结束了;后面的处理就交由ISAPI来完成了 原文地址: https://www.jianshu.com/p/aa79a8dcc808  
  • MQTT基础知识以及工作原理(带图)

    千次阅读 2021-12-28 23:32:13
    MQTT物联网通信协议基础知识和工作原理
  • WEB工作原理

    千次阅读 2020-05-31 22:26:51
    一、web的工作原理: 1、用户在浏览器中输入要访问的web站点地址或在已打开的站点点击超链接。 2、由dns进行域名解析,找到服务器的IP地址,向该地址指向的web服务器发出请求。 3、web服务器根据请求将URL地址...
  • 一个动画看懂网络原理之CSMA/CD的工作原理

    万次阅读 多人点赞 2018-10-09 01:48:28
    一个动画看懂网络原理之CSMA/CD的工作原理 CSMA/CD协议是以太网传输中的一个重要协议,由于线路中同一时间只能允许一台电脑发送信息,否则各计算机之间就会产生干扰,为了解决这个问题,采用了CSMA/CD协议来协调。 ...
  • K8S的架构及工作原理

    万次阅读 多人点赞 2020-03-15 20:07:14
    kube-apiserver:提供了HTTP Rest接口的关键服务进程,是K8S里所有资源的增删改查等操作的唯一入口,也是集群控制的入口进程 kube-controller-manager:K8S里所有资源对象的自动化控制中心,集群内各种资源C...
  • HTTP基本原理(简介)

    万次阅读 多人点赞 2016-03-03 15:24:20
    原文:http://blog.csdn.net/hguisu/article/details/8680808 1. HTTP简介  HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加...
  • nginx基本功能和工作原理

    万次阅读 多人点赞 2017-07-17 20:09:40
    HTTP服务器(包含动静分离) 反向代理和正向代理正向代理。简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我...
  • Web基本工作原理

    千次阅读 2019-03-02 11:01:15
    (1)Web的基本工作原理HTTP协议和URL说明 https://www.cnblogs.com/fwnboke/p/9114381.html
  • 云计算的工作原理是什么?

    万次阅读 2019-04-12 17:17:53
    云计算工作基本原理是,用户所处理的数据并不存储在本地,而是保存在互联网上的数据中心里。提供云计算服务的企业负责管理和维护这些数据中心的正常运转,保证足够强的计算能力和足够大的存储空间供用户使用。用户...
  • MapReduce基本原理(详解!)

    千次阅读 多人点赞 2020-06-21 23:36:53
    它借助于函数式程序设计语言Lisp的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理...
  • HTML基本原理

    千次阅读 2019-02-21 14:11:14
    即:http下加入SSL层(SSL层的作用:1. 保证数据传输安全;2. 确认网站的真实性) HTTP请求过程: sequenceDiagram 客户端-&gt;&gt;服务器: 请求 服务器-&gt;&gt;客户端: 响应 请求: 请求,....
  • keepalived工作原理

    千次阅读 2020-08-13 10:23:43
    keepalived工作原理Keepalived简介Keepalived是什么?VRRP协议与工作原理VRRP选举机制工作过程Keepalvied的工作原理Keepalived体系结构与heartbeat/corosync等比较 Keepalived简介 Keepalived是Linux下一个轻量级别...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 359,123
精华内容 143,649
关键字:

http基本工作原理