一、计算机分层模型
1.1 TCP/IP四层模型
1.1.1 四层模型的划分
TCP/IP协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层。
-
1、应用层
应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。
HTTP协议也处于该层。 -
2、传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)。 -
3、网络层
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。 -
4、数据链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
1.1.2 四层模型间的数据传输
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。以HTTP举例来说明,首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。
接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。
发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去。
1.1.3 TCP/IP四层模型与OSI七层模型
两种模型之间的对应关系:
1.2 分层模型用到的协议
1.2.1 ARP
(1)首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。
(2)当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机IP地址,源主机MAC地址,目的主机的IP地址。
(3)当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的 MAC地址。
(4)源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。
1.2.2 ICMP
ICMP(InternetControl Message Protocol),因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。ICMP报文有两种:差错报告报文和询问报文。
1.2.3 DNCP
动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
1.2.4 RARP
逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。
1.2.5 SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
1.2.6 IP
按层次分,IP(Internet Protocol)网际协议位于网络层。
IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方,则需要满足各类条件。其中两个重要的条件是IP地址和MAC地址。
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。
IP间的通信依赖MAC地址。在网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时,会采用ARP协议(Address Resolution Protocol)。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。
1.2.7 DNS
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址之间的解析服务。
DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
1.2.8 TCP
按层次分,TCP位于传输层,提供可靠的字节流服务。
字节流服务是指,为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。简而言之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。
二、HTTP
HTTP协议是一种无状态协议
。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
2.1 HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。通常,并不一定要有报文主体。
请求报文(上)和响应报文(下)的结构:
请求报文和响应报文的首部内容由以下数据组成:
1)请求行:包含用于请求的方法,请求URI和HTTP版本。
2)状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
3)首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。
4)其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。
2.1.1 HTTP请求报文
HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成。
请求行:(get/post方法,url中的path路径,http版本)。
请求头部:由键值对组成。
2.1.2 HTTP响应报文
HTTP响应报文由四个部分组成:
-
状态码
:描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。 -
HTTP头部
:它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。 -
空行
。 -
主体
:它包含了响应的内容。它可以包含HTML代码、图片等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。
2.2 HTTP首部
HTTP协议的请求和响应报文,都包含HTTP首部。
2.2.1 HTTP报文首部
HTTP报文的结构:
-
1、HTTP请求报文
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
-
2、HTTP响应报文
在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分构成。
2.2.2 HTTP首部字段
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。示例:
首部字段名: 字段值
比如在HTTP首部中,以Content-Type这个字段来表示报文主体的对象类型:
Content-Type: text/html
同时,字段值对应单个HTTP首部字段可以有多个值。示例:
Keep-Alive: timeout=15, max=100
当HTTP报文首部中出现了两个或两个以上具有相同首部字段名时,浏览器内部处理逻辑的不同,结果可能并不一致。有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
-
1、4种HTTP首部字段类型
HTTP首部字段根据实际用途被分为以下4种类型:
1)通用首部字段:请求报文和响应报文两方都会使用的首部。
2)请求首部字段:从客户端向服务器端发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
3)响应首部字段:从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
4)实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。 -
2、通用首部字段
通用首部字段是指,请求报文和响应报文双方都会使用的首部。以下均为HTTP/1.1版本中的通用首部字段。1. Cache-Control
该字段用来控制缓存行为。首部字段Cache-Control的指令可用于请求及响应时。参数示例:
Cache-Control: private, max-age=0, no-cache
列举一些常见的字段:
#明确表明其他用户也可利用缓存
Cache-Control: public
#只有特定的用户可以利用缓存
Cache-Control: private
#客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。
#如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。
Cache-Control: no-cache
#由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定
#参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能
#使用缓存。换言之,无参数值的首部字段可以使用缓存。
Cache-Control: no-cache=Location
#该指令规定缓存不能在本地存储请求或响应的任一部分。
Cache-Control: no-store
#当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定
#时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么
#缓存服务器通常需要将请求转发给源服务器。
#当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确
#认,而 max-age 数值代表资源保存为缓存的最长时间。
Cache-Control: max-age=604800(单位:秒)
2. Connection
Connection字段具备如下两个作用:1、控制不再转发给代理的首部字段;2、管理持久连接。使用示例:
Connection: 不再转发的首部字段名
#HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。
#当服务器端想明确断开连接时,则指定Connection首部字段的值为 Close。
Connection: close
#维持持续连接
Connection: Keep-Alive
3. Date
首部字段Date表明创建HTTP报文的日期和时间。不同格式的日期示例:
Date: Tue, 03 Jul 2012 04:40:59 GMT
Date: Tue, 03-Jul-12 04:40:59 GMT
Date: Tue Jul 03 04:40:59 2012
-
3、请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。1. Accept
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。示例:
#文本文件
#text/html, text/plain, text/css ...
#图片文件
#image/jpeg, image/gif, image/png ...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-
Accept-Charset
Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段Accept相同的是可用权重q值来表示相对优先级。示例:
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
2. Accept-Encoding
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。示例:
Accept-Encoding: gzip, deflate
3. Authorization
Authorization字段是用来告知服务器,用户代理的认证信息。
-
4、响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。1. Age
首部字段Age能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。示例:
Age: 600
2. Location
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx :Redirection的响应,提供重定向的URI。
-
5、实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。1. Content-Encoding
首部字段Content-Encoding会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。示例:
Content-Encoding: gzip
2. Content-Language
实体主体使用的自然语言。示例:
Content-Language: zh-CN
3. Content-Length
实体主体部分的大小(单位是字节)。示例:
Content-Length: 15000
4. Content-Type
实体主体内对象的媒体类型。和首部字段Accept一样,字段值用type/subtype形式赋值。示例:
Content-Type: text/html; charset=UTF-8
2.3 HTTP编码
-
1、编码格式
HTTP协议中有一种被称为内容编码的功能。内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码:
gzip(GNU zip)
compress(UNIX 系统的标准压缩)
deflate(zlib)
identity(不进行编码)
-
2、分块传输
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
2.4 HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。也就是说,状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
状态码的类别:
2XX
2XX的响应结果表明请求被正常处理了。
-
200/OK
表示从客户端发来的请求在服务器端被正常处理了。 -
201/已创建
请求成功并且服务器创建了新的资源。 -
202/已接受
服务器已接受请求,但尚未处理。 -
203/非授权信息
服务器已成功处理了请求,但返回的信息可能来自于另一来源。 -
204/No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。 -
205/重置内容
服务器成功处理了请求,但没有返回任何内容。 -
206/Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX
3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
-
301/Moved Permanently
永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。 -
302/Found
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。 -
303/See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
比如,当使用POST方法访问CGI程序,其执行后的处理结果是希望客户端能以GET方法重定向到另一个URI上去时,返回303状态码。虽然302 Found状态码也可以实现相同的功能,但这里使用303状态码是最理想的。 -
304/Not Modified
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。 -
305/使用代理
请求者只能使用代理访问请求的网页。 -
307/Temporary Redirect
临时重定向,该状态码与302 Found有着相同的含义。
4XX
4XX的响应结果表明客户端是发生错误的原因所在。
-
400/Bad Request
该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求的内容后再次发送请求。 -
401/Unauthorized
该状态码表示发送的请求需要有通过HTTP认证的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。 -
403/Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分对原因进行描述。 -
404/Not Found
该状态码表明服务器上无法找到请求的资源。 -
405/方法禁用
禁用请求中指定的方法。 -
406/不接受
无法使用请求的内容特性响应请求的网页。 -
407/需要代理授权
此状态码与401(未授权)类似,但指定请求者应当授权使用代理。 -
408/请求超时
服务器等待请求时发生超时。 -
409/冲突
服务器在完成请求时发生冲突。 -
410/已删除
如果请求的资源已永久删除,服务器就会返回此响应。 -
413/请求实体过大
服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 -
414/请求的URI过长
请求的URI(通常为网址)过长,服务器无法处理。 -
415/不支持的媒体类型
请求的格式不受请求页面的支持。 -
417/未满足期望值
服务器未满足“期望”请求头字段的要求。
5XX
5XX的响应结果表明服务器本身发生错误。
-
500/Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。 -
502/错误网关
服务器作为网关或代理,从上游服务器收到无效响应。 -
503/Service Unavailable
该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 -
504/网关超时
服务器作为网关或代理,但是没有及时从上游服务器收到请求。 -
505/HTTP版本不受支持
服务器不支持请求中所用的HTTP协议版本。
2.5 HTTP请求过程
-
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为 80)建立一个TCP套接字连接。 -
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文。 -
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。 -
4、释放连接TCP连接
若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。 -
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
2.6 HTTP长链接与短连接
-
长连接、短连接
在HTTP/1.0中默认使用短连接。客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。 -
什么时候用长连接,短连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,每次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。
而像WEB网站的http服务一般都用 短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
2.7 转发与重定向
转发是服务器行为,重定向是客户端行为。
-
转发
客户浏览器发送http请求 --> web 服务器接受此请求 --> 调用内部的一个方法在容器内部完成请求处理和转发动作 --> 将目标资源发送给客户。
在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。 -
重定向
客户浏览器发送http请求 --> web服务器接受后发送302状态码响应及对应新的location给客户浏览器 --> 客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址 --> 服务器根据此请求寻找资源并发送给客户。
在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
三、HTTPS
3.1 HTTP的缺点
HTTP在安全性方面存在着一些问题:
- 通信使用明文(不加密),内容可能会被窃听;
- 不验证通信方的身份,因此有可能遭遇伪装;
- 无法证明报文的完整性,所以有可能已遭篡改。
-
1、明文通信
由于HTTP本身不具备加密的功能,所以也无法做到对通信整体(使用HTTP协议通信的请求和响应的内容)进行加密。
进行加密时,可以对通信加密。HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer,安全套接层)或TLS(安全层传输协议)的组合使用,加密HTTP的通信内容。与SSL组合使用的HTTP被称为HTTPS。
还有一种将参与通信的内容本身加密的方式。由于HTTP协议中没有加密机制,那么就对HTTP协议传输的内容本身加密。即把HTTP报文里所含的内容进行加密处理。在这种情况下,客户端需要对HTTP报文进行加密处理后再发送请求。 -
2、不验证通信方的身份
HTTP协议中的请求和响应不会对通信方进行确认。
虽然使用HTTP协议无法确定通信方,但如果使用SSL则可以。SSL不仅提供加密处理,而且还使用了一种被称为证书的手段。 -
3、无法证明报文完整性
由于HTTP协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。
虽然有使用HTTP协议确定报文完整性的方法,但事实上并不便捷、可靠。其中常用的是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。
3.2 HTTPS
HTTP+加密+认证+完整性保护=HTTPS,即添加了加密及认证机制的HTTP称为HTTPS。
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
-
SSL
SSL采用一种叫做公开密钥加密的加密处理方式。近代的加密方法中加密算法是公开的,密钥是保密的。
加密和解密同用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。
公开密钥加密方式很好地解决了共享密钥加密的困难。公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。 -
数字证书
公开密钥加密方式还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥。为了解决这个问题,可以使用由数字证书认证机构和其相关机关颁发的公开密钥证书。
数字证书认证机构的业务流程:
1)首先,服务器的运营人员向数字证书认证机构提出公开密钥的申请。数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
2)服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
3)接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二,服务器的公开密钥是值得信赖的。
多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
3.3 HTTPS与HTTP的区别
1)HTTP的连接是无状态的,不安全的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
2)在OSI网络模型中,HTTP工作于应用层,而HTTPS工作在传输层。
3)HTTP无需加密,而HTTPS对传输的数据进行加密。
4)HTTP无需证书,而HTTPS需要认证证书。
3.4 HTTPS的通信过程
1)A与B通过TCP建立链接,初始化SSL层。
2)进行SSL握手,A发送https请求,传送客户端SSL协议版本号、支持的加密算法、随机数等。
3)服务器B把CA证书(包含B的公钥),把自己支持的加密算法、随机数等回传给A。
4)A接收到CA证书,验证证书有效性。
5)校验通过,客户端随机产生一个字符串作为与B通信的对称密钥,通过CA证书解出服务器B的公钥,对其加密,发送给服务器。
6)B用私钥解开信息,得到随机的字符串(对称密钥),利用这个密钥作为之后的通信密钥。
7)客户端向服务器发出信息,指明后面的数据使用该对称密钥进行加密,同时通知服务器SSL握手结束。
8)服务器接收到信息,使用对称密钥通信,通知握手接收。
9)SSL握手结束,使用对称密钥加密数据。
四、TCP
4.1 TCP头部结构
图中从左到右的标识字段为:URG、ACK、PSH、RST、SYN、FIN。
ACK:设置为1,标识前面的确认(ack)是有效的。
PSH:表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来直到缓冲区收满为止。
RST:当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。
SYN:用来建立连接。
FIN:用来释放连接。
URG:当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
窗口的大小,可以指定从被确认的字节算起,可以发送多少个字节。
校验和:校验范围包括TCP头、数据报内容等。