HTTP协议是什么?
简介:HTTP全称超文本传输协议,Hyper Text Transfer Protocol,是用于从万维网服务器传输超文本到本地浏览器的传输协议。
这里有三个关键词要理解,分别是超文本、传输、协议。
什么是超文本?
超文本(Hyper text)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本。 超文本更是一种用户介面范式,用以显示文本及与文本之间相关的内容。 现时超文本普遍以电子文档方式存在,其中的文字包含有可以链结到其他位置或者文档的连结,允许从当前阅读位置直接切换到超文本连结所指向的位置。 目前最常使用的是超文本标记语言(Hyper Text Markup Language,HTML)及富文本格式 (Rich Text Format,RTF)。 我们日常浏览的网页上的链接都属于超文本。
什么是传输?
超文本仅仅是一种文档格式,如果想要在一台计算机访问另一台计算机上的超文本,两台计算机之间就必须有一根用于数据流传的电缆,将二进制数据包从一台计算机传输到另一台计算机。 显然互联网并不是简单的两台计算机之间通信,而是非常的复杂和庞大,从数据包在离开计算机的网卡的那一刻就面临着无数的问题:
- 数据包要传输给谁?
- 数据包要怎么传输过去?
- 数据包最终会由哪个服务处理?
因此为了方便传输,人们制定了TCP/IP协议簇来规定传输的方式和内容。 通常我们把先发起数据包的一方称为请求方(request),把接收这个数据包的一方称为应答方(response)。 在最理想和简单的网络中,两台计算机只需要进行简单的数据传输。 但是现实的网络是复杂的,假设服务器的状态异常,那么接收不到回传的请求方将会一直不断地发送请求,最终导致网路阻塞。 因此,TCP/IP 三次握手诞生了。
** 三次握手 **
三次握手(Three-way Handshake)是建立TCP连接时,需要客户端与服务端之间往来3个数据包。进行3次握手的主要作用就是为了确认双方是否状态正常,是否具有正常的接发数据的能力。
在建立连接前,服务端出于Listen状态,监听网络中是否有向自己请求的数据包。
-
第一次握手 客户端向服务器发送一个SYN(Synchronize Sequence Numbers 同步序列编号)报文,并指明客户端的ISN(initial sequence number 初始化序列号)。此时客户端进入SYN_SENT (SYN发出)状态。 首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,弹药消耗一个序号。 -
第二次握手 服务端收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并指定自己的ISN。同时会把客户端的ISN + 1作为ACK的值,表示自己已经收到客户端的SYN,服务端进入SYN_RCVD (SYN应答)状态。 在确认报文段中SYN=1,ACK=1,确认好ack=x+1,初始化seq=y。 -
第三次握手 客户端收到服务端返回的SYN报文之后,会发送一个ACK报文,将服务端回传的ISN + 1作为ACK的值,表示已经收到服务端的SYN报文,同时进入ESTABLISHED (准备接收)状态。服务端收到ACK报文之后,也进入ESTABLISHED 状态,此时双方的连接建立完毕。 确认报文段中ACK=1,确认好ack=y+1,序号seq=x+1,ACK报文可以携带数据,不携带数据不消耗序号。
什么是协议?
协议是一种约定,但是不同于口口相传的约定,协议是一种落实在纸面上的,公众所认可的约定。这意味着在通常意义上所有的相关事宜都需要遵守这个约定进行。 而网络协议就是针对网络,或者说网络传输而制定的约定。如果不遵守网络协议进行网络传输,那么所有暴露在公共网络下的计算机都会因为受到庞大的数据传输而不堪重负。即便所有的计算机都不会因为这些处理而宕机,但是你又如何确定自己所需要的所发出的数据包落到实处呢? 因此,网络协议的重要性不言而喻。
总结
总的来说,HTTP并不是什么神秘的事物,当我们揭开她的神秘面纱,她所留下的本质就是: 在计算机之间传输文字、图片、音频、视频等超文本数据的约定和规范。
什么是HTTPS?
HTTPS全称Hyper Text Transfer Protocol Secure Socket Layer,翻译过来的意思就是超文本传输协议安全套接字层。事实上HTTPS由两个部分组成,HTTP自不用说,就是Hyper Text Transfer Protocol超文本传输协议嘛。 但是Secure Socket Layer是什么?他的简写是SSL,看上去是不是熟悉多了?如果你有碰到过证书问题的话,那么你一定见过它。
为什么会有HTTPS?
这就不得不说到关于HTTP的一些设计缺陷了,HTTP是明文传输,什么是明文传输呢?就是建立连接之后数据 不经过加密就直接从服务端传输到客户端,这意味着若是有人在中间拦截数据包就能清楚地知道双方传输的所有信息! 这真是太可怕了,如果只有HTTP的话,想必无数宅男只能望纸兴叹了,因为他们在访问互联网时没有任何秘密可言! 因此,对于数据的加密传输成了迫切的需求,于是HTTPS诞生了。
什么是SSL?
SSL协议不仅仅是SSL协议,还有SSL3.0,也就是TLS协议,SSL全称Secure Socket Layer,翻译过来就是安全套接字层。TLS全称Transport Layer Secure,翻译过来是传输层安全。 根据网络协议设计约定,每一层都是向它的上一层提供服务,因此SSL与TLS毫无疑问就是工作在传输层之上的会话层,也就是在TCP协议之上。你问我UDP?那玩意就不需要安全。 SSL(Secure Sockets Layer 安全套接层)协议,及其继任者TLS(Transport Layer Security传输层安全)协议,是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密,用于保障网络数据传输安全,利用数据加密技术,确保数据在网络传输过程中不会被截取及窃听。
HTTPS的不同
首先最直观的体现除了名称之外,就是两者访问的端口是不同的,HTTP约定端口为80,而HTTPS的约定端口却是443。 同时两者在工作模式上也有所不同,不同于HTTP的三次握手后直接进行传输,HTTPS还增加了验证流程。
HTTPS验证
-
首先与HTTP相同的,客户端向服务端发送请求,但是这个请求来到了443端口。由于在一开始就知道访问的是具有SSL加密的服务端,因此客户端的握手信息中包含了随机值以及客户端支持的加密算法。 -
监听到请求的服务端在接收并处理好数据包之后应答一个握手信息,其中包含了另一个随机值以及匹配的协商加密算法,这个算法包含在客户端发送给服务端的加密算法中。 -
同时服务端会向客户端发送数字证书。这个证书来源可以是自己制作的,也可以是向CA申请的。当然自己制作的证书一般会被客户端认为是不安全的,需要管理员进行处理。这套证书的本质就是一对公钥和私钥。传送的是公钥,包含证书的颁发机构、过期时间、第三方证书认证机构的签名、域名等等信息。 -
接受到响应的客户端解析证书,验证公钥是否有效,如果证书没有问题就会生成一个随机值(预主秘钥)。 -
认证通过之后,客户端与服务端之前相互发送的随机值就会与预主秘钥一同组成会话秘钥,然后通过证书的公钥进行加密。 -
传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用秘钥解密得到随机值和预主秘钥。 -
服务端解密得到随机值和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。 -
客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。 -
同样服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。
总结
HTTP是在计算机之间传输文字、图片、音频、视频等超文本数据的约定和规范。 HTTPS是套了一层SSL/TLS协议外壳的HTTP,多了验证流程确保了一定的安全性。
【参考】
【1】面试官,不要再问我三次握手和四次挥手——猿人谷 【2】看完这篇HTTP,跟面试官扯皮就没问题了——程序员cxuan 【3】【计算机网络】HTTP 协议详解——我要睡觉了∑ 【4】HTTP和HTTPS协议,看一篇就够了——会飞的狗~
|