PHP第二篇——理论常识:HTTP-HTTPS

简介

  • 超文本传输协议(HTTP,HyperText Transfer Protocol)

    • 是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
  • HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)

    • 是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。

TCP/IP

HTTP是一个基于TCP的协议,而TCP是一种可靠的传输层协议.

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。WEB使用HTTP协议作应用层协议,以封装HTTP 文本信息,然后使用TCP/IP做传输层协议将它发到网络上。

HTTPS

HTTP+加密+认证+完整性保护=HTTPS

是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

  • HTTPS协议的主要作用可以分为两种:
    • 一种是建立一个信息安全通道,来保证数据传输的安全;
    • 另一种就是确认网站的真实性。

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

SSL/TLS

  • SSL:(Secure Socket Layer,安全套接字层)

    • 位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
  • TLS:(Transport Layer Security,传输层安全协议)

    • 用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

SSL是Netscape开发的专门用于保护Web通讯的,目前版本为3.0.最新版本的TLS 1.0是IETE(工程任务组)指定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。   

  • SSL的作用

    • (1)、认证用户和服务器,确保数据发送到正确的客户机和服务器;

    • (2)、加密数据以防止数据中途被窃取;

    • (3)、维护数据的完整性,确保数据在传输过程中不被改变。

而SSL证书指的是在SSL通信中验证通信双方身份的数字文件,一般分为服务器证书和客户端证书,我们通常说的SSL证书主要指服务器证书,SSL证书由受信任的数字证书颁发机构CA(如VeriSign,GlobalSign,WoSign等),在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能,分为扩展验证型(EV)SSL证书、组织验证型(OV)SSL证书、和域名验证型(DV)SSL证书。

CA证书

CA(Certificate Authority)是负责管理和签发证书的第三方权威机构,是所有行业和公众都信任的、认可的。

CA证书,就是CA颁发的证书,可用于验证网站是否可信(针对HTTPS)、验证某文件是否可信(是否被篡改)等,也可以用一个证书来证明另一个证书是真实可信,最顶级的证书称为根证书。除了根证书(自己证明自己是可靠),其它证书都要依靠上一级的证书,来证明自己。

HTTP&HTTPS区别:

简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  1. https协议需要到ca申请证书或自制证书。
  2. http的信息是明文传输,https则是具有安全性的ssl加密。
  3. http是直接与TCP进行数据传输,而https是经过一层SSL(OSI表示层),用的端口也不一样,前者是80(需要国内备案),后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

HTTP&HTTPS综合区别:https://blog.csdn.net/hanjianqiang2468/article/details/52605849

注意: https加密是在传输层

https报文在被包装成tcp报文的时候完成加密的过程,无论是https的header域也好,body域也罢都是会被加密的。

当使用tcpdump或者wireshark之类的tcp层工具抓包,获取是加密的内容,而如果用应用层抓包,使用Charels(Mac)、Fildder(Windows)抓包工具,那当然看到是明文的。

握手过程

HTTP三次握手

曹理鹏(iCocos)-梦工厂

HTTP(HyperText Transfer Protocol)超文本传输协议是互联网上应用最为广泛的一种网络协议。由于信息是明文传输,所以被认为是不安全的。而关于HTTP的三次握手,其实就是使用三次TCP握手确认建立一个HTTP连接。

SYN(synchronous)是TCP/IP建立连接时使用的握手信号、Sequence number(序列号)、Acknowledge number(确认号码),三个箭头指向就代表三次握手,完成三次握手,客户端与服务器开始传送数据。

  • 第一次握手:

    • 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
  • 第二次握手:

    • 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手:

    • 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
建立TCP连接时会发生:三次握手(three-way handshake)
  • firefox > nginx [SYN] 在么
  • nginx > firefox [SYN, ACK] 在
  • firefox > nginx [ACK] 知道了
为什么断开需要四次握手:

关于四次握手的详细过程这里就不过多介绍,请自行百度,这里简单说一下需要执行的步骤,和为什么连接是三次,二断开时四次

关闭TCP连接时会发生:四次挥手(four-way handshake)
  • firefox > nginx [FIN] 我要关闭连接了
  • nginx > firefox [ACK] 知道了,等我发完包先
  • nginx > firefox [FIN] 我也关闭连接了
  • firefox > nginx [ACK] 好的,知道了
解释原因:
  • TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(
  • 即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.
  • 关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须
  • 通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果.
另一种解释:
  • 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

补充

SYN: synchronization(同步)

ACK: acknowledgement(确认:告知已收到)

FIN: finish(结束)

HTTPS握手:

曹理鹏(iCocos)-梦工厂

HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。具体是如何进行加密,解密,验证的,且看下图,下面的称为一次握手。

  • 1.客户端发起HTTPS请求

  • 2.服务端的配置

    • 采用HTTPS协议的服务器必须要有一套数字证书,可以是自己制作或者CA证书。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用CA证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。公钥给别人加密使用,私钥给自己解密使用。
  • 3.传送证书

    • 这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等。
  • 4.客户端解析证书

    • 这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值,然后用证书对该随机值进行加密。
  • 5.传送加密信息

    • 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
  • 6.服务段解密信息

    • 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
  • 7.传输加密后的信息

    • 这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
  • 8.客户端解密信息

    • 客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。

注意: HTTPS中整个握手过程第三方即使监听到了数据,也束手无策。

为什么HTTPS是安全的?

在HTTPS握手的第四步中,如果站点的证书是不受信任的,会显示出现下面确认界面,确认了网站的真实性。另外第六和八步,使用客户端私钥加密解密,保证了数据传输的安全。

补充

app与后台通信完整流程

  • 1.建立连接:前台后台建立连接。
  • 2.发送请求:打开连接后,app向后台发送请求。
  • 3.发送响应:后台处理完请求后,要向app发送响应消息。
    • 后台通过关键词:路径映射,Dispatcher分发机制等方式处理app的请求
  • 4.断开连接:以上交互完成后可以断开连接了。

浏览器执行过程

  • 1.首先嘛,你得在浏览器里输入要网址:
  • 2.浏览器查找域名的IP地址
  • 3.浏览器给web服务器发送一个HTTP请求
  • 4.facebook服务的永久重定向响应.服务器给浏览器响应一个301永久重定向响应,这样浏览器就会问“http://www.facebook.com/” 而非“http://facebook.com/”。
  • 5.浏览器跟踪重定向地址.浏览器知道了“http://www.facebook.com/”才是要访问的正确地址,所以它会发送另一个获取请求:
  • 6.服务器“处理”请求.服务器接收到获取请求,然后处理并返回一个响应。
  • 7.服务器发回一个HTML响应.
  • 8.浏览器开始显示HTML.
  • 9.浏览器发送获取嵌入在HTML中的对象。在浏览器显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件。
  • 10.浏览器发送异步(AJAX)请求。

TCP, UDP,Socket

  • TCP :Transmission Control Protocol,传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,但也是最安全的。

  • UDP : User Data Protocol,用户数据报协议。传输数据之前源端和终端不建立连接,发送端直接把数据发送到网络,接收端把消息段放在队列中,应用程序每次从队列中读一个消息段。

  • Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,提供了一系列方法方便开发者进行网络通讯。

TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要解决数据如何在网络中传输。

Socket中又分为流模式、数据报模式、原始套接字三种模式,即Socket_STREAM,Socket_DREAME,SOCL_RAW方式。
    原始套接字(SOCK_RAW):原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于: 原始套接字可以读写内核没有处理的IP数据包,
    流套接字: 只能读取TCP协议的数据,
    数据报套接字: 只能读取UDP协议的数据。
因此,如果要访问其他协议发送数据必须使用原始套接字。
坚持原创技术分享,您的支持将鼓励我继续创作!