1.概念
1.1 协议
协议是指在计算机通信和网络通信中,为了实现数据交换而建立的一套规则、约定或者标准。它定义了通信双方之间的通信格式、传输方式、数据的含义、错误处理等细节,从而确保通信的可靠性、有效性和安全性。
>1在计算机网络中,协议通常分为两种主要类型:
1. **通信协议(Communication Protocol):** 这类协议定义了计算机之间或计算机与设备之间的通信规则,以确保数据的可靠传输。例如,TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的网络层协议,用于在互联网上进行数据传输。
2. **应用层协议(Application Layer Protocol):** 这类协议建立在通信协议之上,用于定义应用程序之间的通信规则。应用层协议通常针对特定的应用领域或服务,例如HTTP(超文本传输协议)用于在Web浏览器和服务器之间传输超文本文档,SMTP(简单邮件传输协议)用于电子邮件的传输等。
协议在计算机通信中起着至关重要的作用,它们使得不同系统和设备能够相互通信并交换数据,从而构建了整个互联网和各种网络服务。
1.2 HTTP
HTTP(超文本传输协议)是一种用于传输超文本文档(例如HTML文件)的应用层协议,是互联网上最常用的协议之一。它建立在TCP/IP协议之上,用于客户端和服务器之间的通信。
HTTP的工作原理如下:
1. **客户端发送请求:** 客户端(例如Web浏览器)向服务器发送HTTP请求,请求获取或传输特定资源,例如网页、图像、视频等。
2. **服务器处理请求:** 服务器接收到客户端的请求后,根据请求的内容和类型进行处理。服务器可能会读取文件、运行脚本、查询数据库等操作。
3. **服务器发送响应:** 服务器处理完请求后,将所请求的资源以及相关的响应信息发送回客户端。
4. **客户端接收响应:** 客户端接收到服务器发送的响应后,根据响应的内容进行相应的处理,例如渲染网页、显示图像、播放视频等。
HTTP通信的特点包括:
- **简单性:** HTTP的基本功能和操作相对简单,易于实现和理解。
- **灵活性:** HTTP允许传输各种类型的数据,包括文本、图像、音频、视频等。
- **无状态性:** HTTP是一种无状态协议,每个请求都是独立的,服务器不会在多次请求之间保持任何状态信息。
- **连接性:** HTTP默认使用短连接,即每个请求/响应周期都会建立一个新的TCP连接,但也可以通过HTTP持久连接来重用连接以提高性能。
HTTP协议的版本有多个,其中最常见的是HTTP/1.1和HTTP/2,而HTTP/3则是基于UDP的新一代HTTP协议。
HTTP传输的弊端:
1. **不安全性**:HTTP 传输的数据并没有加密,容易被网络中的攻击者截获、篡改或者窃取,导致数据泄露和安全问题。
2. **性能瓶颈**:HTTP 协议中每次请求和响应都需要建立 TCP 连接,这会增加额外的网络延迟和资源开销。而且 HTTP 的请求和响应头部信息较多,还会占用带宽。
3. **可扩展性差**:HTTP 协议本身的设计比较简单,只支持基本的请求和响应方式,难以满足复杂的应用需求。此外,HTTP 协议在传输二进制数据等其他格式的数据时,需要对这些数据进行 Base64 编码,这会增加额外的传输开销。
4. **无法支持实时性交互**:HTTP 是一种请求-响应模式,客户端需要不断地发送请求来获取最新的数据,这会导致实时性较差,难以支持实时性交互。
为了解决 HTTP 协议的这些弊端,人们已经提出了许多新的协议和技术,如 HTTPS、SPDY、HTTP/2、WebSocket 等,这些协议和技术可以提供更好的安全性、性能和可扩展性,从而满足不同应用场景的需求。
1.3 HTPS
HTTPS的工作原理
HTTPS(HyperText Transfer Protocol Secure)是一种通过计算机网络进行安全通信的协议。它是基于HTTP协议的加密版本,通过使用TLS/SSL协议进行数据加密,确保通信的安全性和隐私性。以下是HTTPS的工作原理:
1. **建立连接:** 客户端(例如浏览器)向服务器发送连接请求,请求建立安全连接。
2. **握手阶段:** 在这个阶段,TLS/SSL协议用于进行握手操作,以确保通信的安全性。这包括以下步骤:
- 客户端发送支持的加密算法列表和其他必要的信息给服务器。
- 服务器选择一个加密算法并发送其证书(包含公钥)给客户端。
- 客户端验证服务器证书的有效性,并生成一个用于对称加密的随机密钥,然后使用服务器的公钥加密该密钥,并发送给服务器。
- 服务器使用自己的私钥解密客户端发送的随机密钥。
3. **加密通信:** 一旦握手成功,客户端和服务器之间的通信将使用双方协商好的对称加密密钥进行加密和解密。这确保了数据在传输过程中的机密性。
4. **数据传输:** 在建立安全连接后,客户端和服务器可以安全地传输数据,所有传输的数据都会被加密。
5. **连接关闭:** 当通信结束时,客户端或服务器可以选择关闭连接。
总的来说,HTTPS通过使用加密技术确保了数据在传输过程中的安全性,防止了数据被窃取或篡改的风险。这使得用户可以放心地在互联网上进行敏感数据的传输,例如登录凭证、支付信息等。
HTTPS通信特点
HTTPS通信的特点包括:
1. **安全性:** HTTPS使用TLS/SSL协议对数据进行加密,因此可以有效防止数据在传输过程中被窃取或篡改。这种加密技术保护了用户的隐私和敏感信息,使其在互联网上传输时更加安全。
2. **验证身份:** 在握手阶段,服务器会向客户端发送其证书,证书包含了服务器的公钥和相关信息。客户端可以验证证书的有效性,确保其连接的是预期的服务器,而不是中间人攻击或伪装的服务器。
3. **完整性保护:** HTTPS不仅对数据进行加密,还使用消息认证码(MAC)来保护数据的完整性。这意味着即使数据被窃取,攻击者也无法篡改数据,因为篡改后的数据在解密时会被检测到。
4. **信任度:** HTTPS通常使用由权威机构颁发的数字证书,这些证书通过了严格的身份验证,客户端可以信任这些证书。这增加了用户对连接的信任度,减少了受到钓鱼攻击等威胁的风险。
5. **SEO优化:** 谷歌等搜索引擎对采用HTTPS协议的网站给予更高的排名,这也促使更多网站采用HTTPS,提升了整个网络环境的安全性。
综上所述,HTTPS通信的特点使得其成为互联网上安全传输敏感信息的首选协议,保护用户隐私,防止数据泄露和篡改。
HTTPS传输的弊端
HTTPS作为一种安全通信协议,在保护用户数据方面有着明显的优势,但也存在一些弊端:
1. **性能开销:** HTTPS通信涉及加密和解密操作,这会增加服务器和客户端的计算负担,导致一定程度的性能损失。尤其是在服务器端,加密操作可能对服务器的响应时间产生影响。
2. **证书管理成本:** 为了使用HTTPS,网站需要获取和维护数字证书。证书的获取和管理可能需要费用,尤其是对于企业级网站来说,还需要定期更新证书,这增加了运维成本。
3. **部署复杂性:** 配置和部署HTTPS通常比HTTP更为复杂,特别是对于较大规模的网站或复杂的网络架构。需要对服务器、负载均衡器等进行适当的配置和调整。
4. **可能存在中间人攻击:** 尽管HTTPS可以防止数据被窃取或篡改,但仍然存在中间人攻击的可能性。如果攻击者能够获取有效的数字证书或以其他方式介入通信,他们可能会中断或篡改通信。
5. **不可缓存性:** HTTPS通信的内容通常不能被中间节点(例如代理服务器或内容分发网络)缓存,这可能影响到内容分发和加速,增加了网络传输的负担。
虽然HTTPS有一些弊端,但综合考虑其安全性和保护用户隐私的重要性,大多数网站仍然选择采用HTTPS来保护数据传输的安全。随着技术的发展和优化,一些弊端可能会逐渐减少。
2.HTTPS和HTTP的区别
3.资源的使用情况
HTTP使用TCP三次握手建立连接,客户端和服务器需要交换3个包(具体可查看马海祥博客《HTTP服务的七层架构技术解析及运用》的相关介绍);HTTPS除了TCP的三个包,还要加上ssl握手需要的9个包,所以一共是12个包。
HTTP建立连接,按照下面链接中针对Computer Science House的测试,是114毫秒;HTTPS建立连接,耗费436毫秒,ssl部分花费322毫秒,包括网络延时和ssl本身加解密的开销(服务器根据客户端的信息确定是否需要生成新的主密钥;服务器回复该主密钥,并返回给客户端一个用主密钥认证的信息;服务器向客户端请求数字签名和公开密钥)。
当SSL连接建立后,之后的加密方式就变成了3DES等对于CPU负荷较轻的对称加密方式,相对前面SSL建立连接时的非对称加密方式,对称加密方式对CPU的负荷基本可以忽略不记,所以问题就来了,如果频繁的重建ssl的session,对于服务器性能的影响将会是致命的,尽管打开HTTPS保活可以缓解单个连接的性能问题,但是对于并发访问用户数极多的大型网站,基于负荷分担的独立的SSL termination proxy就显得必不可少了,Web服务放在SSL termination proxy之后,SSL termination proxy既可以是基于硬件的,譬如F5;也可以是基于软件的,譬如维基百科用到的就是Nginx。
那采用HTTPS后,到底会多用多少服务器资源,2010年1月Gmail切换到完全使用HTTPS, 前端处理SSL机器的CPU负荷增加不超过1%,每个连接的内存消耗少于20KB,网络流量增加少于2%,由于Gmail应该是使用N台服务器分布式处理,所以CPU负荷的数据并不具有太多的参考意义,每个连接内存消耗和网络流量数据有参考意义,这篇文章中还列出了单核每秒大概处理1500次握手(针对1024-bit 的 RSA),这个数据很有参考意义。
Heartbleed这个被称作史上最大的网络安全漏洞,想必很多人都有所耳闻,Heartbleed之所以能够出现,其实和我们这个问题关系还不小,前面我们谈到了频繁重建SSL/TLS的session对于服务器影响是致命的,所以,聪明的RFC在2012年提出了RFC6520 TLS的心跳扩展,这个协议本身是简单和完美的,通过在客户端和服务器之间来回发送心跳的请求和应答,保活TLS session,减少重建TLS的session的性能开销,令人遗憾的是,openssl在实现这个心跳扩展时,犯了一个低级的错误,没有对收到的心跳请求进行长度检查,直接根据心跳请求长度拷贝数据区,导致简单的心跳应答中可能包含了服务器端的核心数据区内容,用户名,密码,信用卡信息,甚至服务器的私有密钥都有可能泄露。
4.网站的搭建需不需使用HTTPS
从难易程度来讲,HTTP的搭建肯定比HTTPS简单的多,但是如果你的网站涉及交易支付、在线购物等建议网站应该使用 HTTPS 来保护数据传输的安全性。HTTPS 是基于 HTTP 协议之上的一种安全协议,通过使用 SSL/TLS 协议来加密数据传输,从而保证了数据传输的机密性、完整性和可信性。
在您的网站涉及到用户信息的收集、交易支付、在线购物等,那么使用 HTTPS 协议将更为重要。因为在 HTTP 协议下,所有数据都是明文传输的,如果被黑客截获,可能会导致用户账号密码、银行卡信息等敏感数据泄露,给用户造成不必要的损失。
此外,现在许多搜索引擎和浏览器都更加重视网站的安全性,推荐使用 HTTPS。例如,Google 在其搜索引擎结果中标注了非 HTTPS 网站为“不安全”,使用 HTTPS 的网站则会获得优先显示和更高的排名。
虽然使用 HTTPS 要比 HTTP 更加复杂,需要配置证书、升级服务器等,但是它可以有效地保护用户数据传输的安全性,有助于提高网站的信誉度和用户体验。
5.搭建HTTPS
搭建 HTTPS,您需要完成以下步骤:
1. **获取 SSL 证书**:您需要从数字证书认证机构(CA)或者自签名方式获得 SSL 证书。CA 是一个可信的第三方机构,可以对您的身份和网站进行验证,并颁发 SSL 证书。自签名证书是自己制作的证书,不需要经过 CA 的认证,但是它不能被大多数浏览器所信任。在选择证书时,您需要考虑到其安全性、价格和可信度等因素。
2. **配置服务器**:您需要在 Web 服务器上进行相应的配置,以便支持 HTTPS 协议。对于 Apache 和 Nginx 等常见的 Web 服务器,您需要修改配置文件,以启用 HTTPS 支持,并指定 SSL 证书的位置。
3. **安装 SSL 证书**:您需要将 SSL 证书安装到 Web 服务器中,并配置好相应的密钥和证书链。SSL 证书一般包括公钥和私钥两部分,私钥需要妥善保管,不要泄露给他人。
4. **测试 HTTPS 连接**:在完成上述步骤之后,您需要测试 HTTPS 连接是否正常工作。您可以使用浏览器来访问网站,并检查浏览器地址栏中是否显示了 HTTPS 协议和 SSL 证书相关信息。
需要注意的是,在搭建 HTTPS 时,您需要考虑到服务器的硬件性能、带宽、证书有效期、证书更新等因素。同时,您也需要及时升级 Web 服务器软件和 SSL/TLS 协议,以保证数据传输的安全性。
6.免费的证书推荐
推荐几个免费的 SSL 证书颁发机构:
1. **Let's Encrypt**:Let's Encrypt 提供了免费的 SSL/TLS 证书,其证书受到大多数现代浏览器的信任。您可以使用 Certbot 工具来自动化证书的获取和配置过程,极大地简化了搭建 HTTPS 的流程。
2. **Cloudflare**:Cloudflare 提供了免费的基本 SSL 证书,可以通过 Cloudflare 的 CDN 服务来实现 HTTPS 加速和安全性增强。其免费证书支持 SNI 技术,适用于大多数网站。
3. **ZeroSSL**:ZeroSSL 提供了简单易用的免费 SSL 证书生成工具,您可以通过其在线工具来生成免费的 SSL 证书。它也提供了 API 和 ACME 协议的支持,方便自动化证书的获取和更新。
4. **SSL For Free**:SSL For Free 提供了免费的 SSL 证书,支持通配符证书和多域名证书。您可以通过其在线工具来获取证书,并提供了相应的安装说明。
这些免费的 SSL 证书颁发机构都提供了简单易用的方式来获取和配置 SSL 证书,可以帮助您快速实现网站的 HTTPS 加密,提升网站的安全性和用户信任度。
7.每期一问
上期答案
struct ListNode* reverseList(struct ListNode* head) {//判断传入的值为空或者只有一个节点直接返回if(head == NULL || head->next == NULL){return head;}struct ListNode* p1;//定义三个指针struct ListNode* p2;struct ListNode* p3;p1 = NULL;p2 = head;p3 = head->next;while(p2){//翻转指针p2->next = p1;p1 = p2;p2 = p3;if(p3 != NULL){p3 = p3->next;}}return p1;
}
本期问题:. - 力扣(LeetCode)
本期内容就这些,我们下期再见!