前言:上篇博客中我们已经认识了应用层,通过实现简易计算器,将ISO制定的七层网络协议的后三层进行了分层体现,自己制定了对应的协议进行网络传输。而今天我们学习一下应用层非常有名的协议HTTP协议。话不多说我们直接进入主题。
HTTP 历史及版本核心技术与时代背景
HTTP(Hypertext Transfer Protocol,超文本传输协议)作为互联网中浏览器和服务
器间通信的基石,经历了从简单到复杂、从单一到多样的发展过程。以下将按照时间
顺序,介绍 HTTP 的主要版本、核心技术及其对应的时代背景。
HTTP/0.9
核心技术:
• 仅支持 GET 请求方法。
• 仅支持纯文本传输,主要是 HTML 格式。
• 无请求和响应头信息。
时代背景:
• 1991 年,HTTP/0.9 版本作为 HTTP 协议的最初版本,用于传输基本的超文本HTML 内容。
• 当时的互联网还处于起步阶段,网页内容相对简单,主要以文本为主。
HTTP/1.0
核心技术:
• 引入 POST 和 HEAD 请求方法。
• 请求和响应头信息,支持多种数据格式(MIME)。
• 支持缓存(cache)。
• 状态码(status code)、多字符集支持等。
时代背景:
• 1996 年,随着互联网的快速发展,网页内容逐渐丰富,HTTP/1.0 版本应运而生。
• 为了满足日益增长的网络应用需求,HTTP/1.0 增加了更多的功能和灵活性。
• 然而,HTTP/1.0 的工作方式是每次 TCP 连接只能发送一个请求,性能上存在一定局限。
HTTP/1.1
核心技术:
• 引入持久连接(persistent connection),支持管道化(pipelining)。
• 允许在单个 TCP 连接上进行多个请求和响应,提高了性能。
• 引入分块传输编码(chunked transfer encoding)。
• 支持 Host 头,允许在一个 IP 地址上部署多个 Web 站点。
时代背景:
• 1999 年,随着网页加载的外部资源越来越多,HTTP/1.0 的性能问题愈发突出。
• HTTP/1.1 通过引入持久连接和管道化等技术,有效提高了数据传输效率。
• 同时,互联网应用开始呈现出多元化、复杂化的趋势,HTTP/1.1 的出现满足了这些需求。
HTTP/2.0
核心技术:
• 多路复用(multiplexing),一个 TCP 连接允许多个 HTTP 请求。
• 二进制帧格式(binary framing),优化数据传输。
• 头部压缩(header compression),减少传输开销。
• 服务器推送(server push),提前发送资源到客户端。
时代背景:
• 2015 年,随着移动互联网的兴起和云计算技术的发展,网络应用对性能的要求越来越高。
• HTTP/2.0 通过多路复用、二进制帧格式等技术,显著提高了数据传输效率和网络性能。
• 同时,HTTP/2.0 还支持加密传输(HTTPS),提高了数据传输的安全性。
HTTP/3.0
核心技术:
• 使用 QUIC 协议替代 TCP 协议,基于 UDP 构建的多路复用传输协议。
• 减少了 TCP 三次握手及 TLS 握手时间,提高了连接建立速度。
• 解决了 TCP 中的线头阻塞问题,提高了数据传输效率。
时代背景:
• 2022 年,随着 5G、物联网等技术的快速发展,网络应用对实时性、可靠性的要求越来越高。
• HTTP/3.0 通过使用 QUIC 协议,提高了连接建立速度和数据传输效率,满足了这些需求。
• 同时,HTTP/3.0 还支持加密传输(HTTPS),保证了数据传输的安全性。
HTTP 协议
虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。
在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本(如 HTML 文档)。
HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。
认识 URL
平时我们俗称的 "网址" 其实就是说的URL,也叫做统一资源定位符。
1.首先我们的协议方案名表示我们本次所使用的协议具体内容。
一般常见的协议方案名有:
HTTP (HyperText Transfer Protocol):超文本传输协议,用于从Web服务器传输超文本到本地浏览器。
HTTPS (HTTP Secure):安全超文本传输协议,是HTTP协议的安全版本,通过SSL/TLS提供加密传输。
FTP (File Transfer Protocol):文件传输协议,用于在网络上的计算机之间传输文件。
SFTP (Secure File Transfer Protocol):安全文件传输协议,是FTP的安全性加强版本,使用SSH进行加密。
SMTP (Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件。
POP3 (Post Office Protocol version 3):邮局协议第三版,用于接收电子邮件。
IMAP (Internet Message Access Protocol):互联网消息访问协议,用于访问和管理电子邮件。
SSH (Secure Shell):安全外壳协议,用于安全地访问远程计算机。
Telnet:一种网络协议,用于远程登录到服务器并执行命令,但由于安全问题,已逐渐被SSH所取代。
DNS (Domain Name System):域名系统,将域名转换为IP地址。
DHCP (Dynamic Host Configuration Protocol):动态主机配置协议,用于自动分配IP地址给网络中的设备。
SNMP (Simple Network Management Protocol):简单网络管理协议,用于网络管理。
LDAP (Lightweight Directory Access Protocol):轻量级目录访问协议,用于访问和维护分布式目录信息服务。
RTP (Real-time Transport Protocol):实时传输协议,用于传输音频和视频数据。
RTSP (Real Time Streaming Protocol):实时流媒体协议,用于控制流媒体服务器中的会话。
XMLRPC (XML Remote Procedure Call):XML远程过程调用,一种使用XML编码的RPC协议。
JSON-RPC (JSON Remote Procedure Call):JSON远程过程调用,一种使用JSON格式的数据交换协议。
SOAP (Simple Object Access Protocol):简单对象访问协议,一种基于XML的、用于网络服务的协议。
BGP (Border Gateway Protocol):边界网关协议,用于互联网上进行网络之间的路由。
NTP (Network Time Protocol):网络时间协议,用于同步网络设备的时钟。
2.登录信息
在这种方式中,用户名和密码被编码并附加到URL中,以供访问受保护的资源。以下是登录信息在URL 。处于安全考虑用户名和密码在URL中是明文传输,可能被网络监听者截获,所以现代Web应用通常会避免在URL中直接传递登录信息,而是使用更为安全的认证机制。
3.服务器地址
也就是我们所说的ip(域名),这样可以准确的找到我们的服务器来获取资源。例如www.baidu.com等等都属于服务器地址。
4.服务器端口号
我们在socket编程中使用listen进行监听时需要绑定对应的端口号,如果服务器监听的不是默认端口(如HTTP的80或HTTPS的443),则需要指定端口号。
常见的知名端口号:
- HTTP - 80:用于Web服务器,传输超文本的协议。
- HTTPS - 443:HTTP的安全版本,通过SSL/TLS加密传输。
- FTP - 21:文件传输协议,用于文件的上传和下载。
- SSH - 22:安全外壳协议,用于安全远程登录和其他安全网络服务。
- Telnet - 23:远程登录服务,已逐渐被SSH取代。
- SMTP - 25:简单邮件传输协议,用于发送电子邮件。
- POP3 - 110:邮局协议第三版,用于接收电子邮件。
- IMAP - 143:互联网消息访问协议,用于访问和管理电子邮件。
- LDAP - 389:轻量级目录访问协议,用于访问和维护分布式目录信息。
5.带层次的文件路径
http超文本传输协议就是为了拿取资源,而资源全部都在服务器中。我们想要确定一个资源首先就要确定其IP+port找到服务器唯一进程,再通过文件路径找到具体的哪一个资源。所以我们就要提供唯一路径来获取资源。
6.查询字符串
用于提供附加参数,用?
开始,后面跟着参数名和值,多个参数用&
分隔。查询字符串的内容通常由键值对组成,每个键值对用等号=
连接。
查询字符串的作用:
数据传递:在表单提交时,将表单中的数据作为查询字符串附加在URL后,以便发送到服务器。
过滤和排序:在API请求中,查询字符串用于指定过滤条件、排序规则或搜索关键字。
用户偏好设置:保存用户的偏好设置或配置,例如主题、语言或布局。
状态信息:传递状态信息或标识,如会话标识、用户ID或访问令牌。
页面导航:在某些单页面应用(SPA)中,查询字符串用于在不重新加载页面的情况下传递状态或导航信息。
跟踪和分析:包含跟踪参数,用于网站分析或广告跟踪。
重定向和链接管理:在重定向URL或管理链接时,使用查询字符串传递额外信息。
比如我们在百度中搜索CSDN,其中查询字符串中就有一个wd = cddn的键值对。
7.片段标识符:它在URL的末尾,跟在井号(#)后面。片段标识符用于指向资源内部的特定部分,这个资源可以是HTML页面、PDF文件、或者其他类型的文档。
主要用途:
页面内导航:在HTML文档中,片段标识符可以用来链接到页面内的一个特定部分,如一个章节、图片、表格或脚注。
滚动位置:当用户点击包含片段标识符的链接时,浏览器会滚动到文档中相应的位置。
用户界面更新:在单页面应用(SPA)中,片段标识符可以用来更新页面的UI组件,而无需重新加载整个页面。
持久链接:创建指向页面特定部分的持久链接,使得用户可以书签或分享这些链接。
内容锚点:在文档中,片段标识符可以作为内容的锚点,用于引用或注释。
避免页面刷新:在动态内容加载的情况下,使用片段标识符可以更新页面的特定部分而避免整个页面的刷新。
跟踪和分析:网站分析工具可能使用片段标识符来跟踪用户在页面上的行为。
状态恢复:在某些应用中,片段标识符可以用于保存和恢复页面的状态。