在计算机网络体系结构的 TCP/IP 参考模型中,总共有四层,由下到上分别是 网络接口层、网际层、传输层、应用层。
网络接口层对应着OSI模型中的物理层和数据链路层,物理层负责在物理媒介上传输原始比特流,确保数据以比特流的形式从一个设备传输到另一个设备。数据链路层管理直接连接的设备之间的数据传输,通过帧(Frame)来定义和管理数据的传输。
网际层中主要使用的是网际协议 IP(Internet Protocol) 协议,主要功能是负责将数据包从源主机到目的主机的转发,中间会经过许多路由器或其他节点,其中运行着路由转发算法来确定数据包的传送路径。
传输层主要负责主机到主机之间的端对端可靠通信,该层使用了2种协议来支持2种数据的传送方法,一种是有连接的可靠数据传输服务,另一个则是无连接的数据服务,它们分别依靠TCP协议和UDP协议来支撑。在网际层中并不负责可靠的数据传输,传输层利用TPC协议基于网际层实现了可靠的数据传输,并提供了更多的网络功能(如流量控制和拥塞控制等)来提高网络的整体性能。
应用层是 TCP/IP 参考模型中的最高层,在这一层运行着各种各样的协议,以应对不用的使用场景。而本文要介绍的 HTTP/HTTPS 就位于该层中,日常浏览网页都会用到这个协议。
本文目录
HTTP简介
HTTP (HyperText Transfer Protocol,超文本传输协议) 是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP是一种用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它定义了客户端(如浏览器)与服务器之间请求和响应的格式。HTTP协议是万维网的通讯基础,通过它,客户端可以请求服务器上的资源(如HTML文件、图片文件等),服务器则根据请求返回相应的资源或处理结果。
Web 客户端主要使用 HTTP 和服务器进行通信
有各种各样的Web服务器遍布全球,它们存储了各种各样的资源,包括图片 jpg、png、HTML文件、视频、音乐、电影等等,当我们打开浏览器浏览某个网页的时候,浏览器就会与Web服务器建立连接,通过HTTP协议来传送这些数据。客户端浏览器向Web服务器发送HTTP请求,服务器对请求的数据进行响应,客户端浏览器将响应的数据解析渲染出来呈现给用户。
URI
Web服务器上有各种类型的资源,为了方便请求这些资源,每个资源都要有一定的标识,统一资源标识符(Uniform Resource Identifier,URI)就是为了这个而生。它可以在世界范围内唯一标识一个资源。例如:https://www.jackey-song.com/img/boyWithCat.webp 标识了一台服务器上的一张图片资源。URI 包括 URL 和 URN。
URL
统一资源定位符(Uniform Resource Locator,URL)是目前最长使用的一种 URI。它提供了一个资源的精确位置,以让浏览器进行访问。
URL主要包含三部分:
- 第一部分
方案(scheme)
协议类型,http://
或https://
等。 - 第二部分 服务器的因特网地址,域名如 jackey-song.com 或 IP 地址。
- 其余部分服务器上一个资源的具体位置或者一些其他的参数。
URN
统一资源名 (Uniform Resource Name) 特定内容的唯一名称使用,资源的位置可以随意移动,支持多种网络协议访问,目前(2024年7月)仍处于试验阶段。
事务
一个HTTP事务由一条HTTP请求和HTTP响应组成。通信过程使用 HTTP 报文 (HTTP message)。
方法
HTTP支持多种方法来实现不同的目的。
- GET:客户端向服务器请求一个资源。
- PUT:客户端的数据存入服务器资源中。
- DELETE:删除服务器中的某个资源。
- POST:客户端数据发送到一个服务器网关应用程序。
- HEAD:和GET一样,只是没有报文的主体,只有一个请求头,常用于测试。
状态码
在你们日常使用过程中,一定碰到过 404 NOT FOUND
,它就是一个状态加上一段描述语句,表示错误未找到相应的资源。
常用的状态码:
- 200 OK
- 200 Document attached
- 200 Success
- 200 All’s cool, dude
- 302 Redirect | 重定向,到其他资方获取资源。
- 404 Not Found。
HTML 页面中的资源
做过前端开发写过HTML的应该都知道HTML页面中包含各种资源,否则一个网页只有文本就显得很单调无味。当你访问一个页面后,鼠标右键选择检查或者通常情况下直接按F12键即可进入调试页面,在这里你可以看到网页的源码和其中包含的各种资源。
报文
一个简单的 请求报文 (request message) 大概如下:
GET /test/hi-here.txt HTTP/1.0 |起始行
--------------------------------
Accept: text/* |首部 Head
Accept-Language: en,fr
|首部以一个空行结束
一个简单的 响应报文 (response message) :
HTTP/1.0 200 OK |起始行
--------------------------------
Content-type: text/plain |首部 Head
Content-length: 19
|首部以一个空行结束
--------------------------------
Hello world! I am a message! |主体
- 起始行:请求报文中要做什么,响应报文中发生了什么状况。
- 首部字段:有多行,每行是一个名字和一个值,描述一些信息,首部以一个空行结束。
- 主体:可以为空,也可以是各种类型的数据。
连接
HTTP是处于应用层的,下面是传输层(TCP协议)、网际层(IP协议),HTTP正是建立在 TCP/IP 之上的,底层提供了一个可靠的连接,所以HTTP就不用在意底层的细节,只需要提供应用即可。
TCP 提供了 无差错的数据传输(三次握手建立连接,四次挥手销毁连接),按序传输(数据总是会按照顺序到达),未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
HTTP客户端和服务器之间发送报文之前,需要使用 网际协议地址(IP地址)和端口号在客户端和服务器之间建立一条 TCP/IP 连接。IP地址就像一个国家的名字,而端口号就像一个国家的港口,网络上两个主机之间的通信就像是轮船运输货物,IP地址和端口号就是告诉轮船把货物运送到哪个国家的哪个港口。一个主机上可能同时运行着多个网络程序,每个程序都要有一个端口号,以保证数据发送到了正确的程序上。HTTP 默认使用的端口号是 80
,HTTPS (HTTP Secure - HTTP 的安全增强版本)默认使用的端口号是 443
。
在日常使用的过程中,我们通常看不到 IP 地址,因为IP地址就是一串数字,它非常难记,对人类不友好。我们经常看到的网址通常是一个域名,如 jackey-song.com 或 baidu.com 等,但是计算并不能读懂域名,所以因特网有一个由域名到 IP 地址映射功能,这个功能由一个系统实现,叫 DNS (Domain Name System) 域名系统,它是一个很庞大的系统,或者说是一个分布式数据库,在全球很多的DNS服务器上都有域名和其对应IP地址的数据,全球巨量的因特网用户每天都要使用它很多次,所以它的实现要复杂一些,处理巨量的DNS解析任务。当在因特网上通过域名访问一个网站的时候,我们的计算机第一个任务就是向因特网发出询问,由域名获取对应主机的IP地址。DNS的实现有兴趣的可以查阅相关资料。
浏览器访问某一个资源的时候,大致过程如下:
- 浏览器从URL中解析出服务器的主机名。
- 浏览器通过DNS获取主机名对应的IP地址。
- 从URL中解析出端口号。
- 建立与HTTP服务器(Web服务器)的TCP连接。
- 浏览器向服务器发送一条 HTTP 请求报文。
- 服务器向浏览器发送一条 HTTP 响应报文。
- 关闭连接,浏览器显示资源。
TCP 的三次握手和四次挥手*
三次握手:
TCP建立连接的过程称为“三次握手”,确保通信双方能够正常通信。以下是三次握手的详细过程:
第一次握手:
客户端向服务器发送一个SYN(同步序列编号)报文段。这个报文段不包含应用层数据,仅包含TCP头部信息,其中SYN标志位被置为1,表示这是一个连接请求。同时,客户端随机选择一个初始序列号seq=x,将其放在TCP报文段的序列号字段中。发送完毕后,客户端进入SYN_SENT状态。
第二次握手:
服务器收到客户端的SYN报文段后,如果同意建立连接,则向客户端发送一个SYN+ACK报文段作为应答。这个报文段中,SYN标志位也被置为1,表示这是一个连接请求应答。同时,ACK(确认)标志位也被置为1,表示对客户端SYN报文段的确认,确认号为x+1(即客户端初始序列号加1)。服务器也随机选择一个初始序列号seq=y,放入TCP报文段的序列号字段中。发送完毕后,服务器进入SYN_RCVD状态。
第三次握手:
客户端收到服务器的SYN+ACK报文段后,向服务器发送一个ACK报文段作为应答。这个报文段中,ACK标志位被置为1,确认号为y+1(即服务器初始序列号加1),表示对服务器SYN报文段的确认。此时,TCP连接已经建立,客户端和服务器都进入ESTABLISHED状态,可以开始传输数据。
三次挥手:
TCP销毁连接的过程称为“四次挥手”,确保双方能够安全地关闭连接。以下是四次挥手的详细过程:
第一次挥手:
客户端(或称为数据发送方)向服务器(或称为数据接收方)发送一个FIN报文段,表示客户端想要关闭连接。发送完毕后,客户端进入FIN_WAIT_1状态。
第二次挥手:
服务器收到客户端的FIN报文段后,向客户端发送一个ACK报文段作为应答,确认号为收到的FIN报文段的序列号加1。这个报文段表示服务器已经收到了客户端的关闭请求,但服务器可能还有数据需要发送给客户端,所以此时连接并未完全关闭。服务器进入CLOSE_WAIT状态。
第三次挥手(可选):
如果服务器确实还有数据需要发送给客户端,那么在发送完所有数据后,服务器会向客户端发送一个FIN报文段,表示服务器也想要关闭连接。发送完毕后,服务器进入LAST_ACK状态。
第四次挥手:
客户端收到服务器的FIN报文段后,向服务器发送一个ACK报文段作为应答,确认号为收到的FIN报文段的序列号加1。这个报文段表示客户端已经收到了服务器的关闭请求,并同意关闭连接。发送完毕后,客户端进入TIME_WAIT状态,等待一段时间(通常是2MSL,即报文段最大生存时间的两倍)以确保服务器收到了客户端的确认报文段。如果在这段时间内没有收到服务器的重传FIN报文段,则客户端最终关闭连接,进入CLOSED状态。服务器在收到客户端的ACK报文段后,也关闭连接,进入CLOSED状态。
HTTP 的版本
- HTTP 0.9
发布时间:1989年
特点:
第一个HTTP协议版本,发明了万维网,并创建了世界第一个网页浏览器。
仅支持GET请求方法,且服务器仅能响应HTTP文本类型的数据。
没有HTTP标头、状态码或错误码,仅使用一行请求信息。
客户端收到数据后,通过四次挥手关闭连接,因此也被称为单线协议。 - HTTP 1.0
发布时间:1996年
特点:
丰富了交互响应的文件类型,但在此之前网页是不能播放音乐的。
引入了HTTP协议标头,响应增加了状态码和传输的内容类型(MIME媒体类型)。
仍然是单线协议,一个连接只能处理一个请求和一个响应,每次建立物理连接的成本较高。
服务器在响应后关闭连接,不支持持久连接。 - HTTP 1.1
发布时间:1997年
特点:
引入了持久连接(keep-alive)的概念,允许在单个连接上发送多个请求和响应,提高了传输效率。
引入了流水线(pipelining)技术,允许客户端在服务器响应前发送多个请求,进一步提高了效率。
增加了对缓存的控制,支持更复杂的缓存机制。
引入了更多的请求方法,如PUT、DELETE等,增强了HTTP的功能。 - HTTP/2(最初命名为HTTP 2.0)
发布时间:2015年
特点:
基于SPDY协议开发,是HTTP协议自1999年HTTP 1.1发布后的首个重大更新。
使用二进制帧层(而不是纯文本)来传输HTTP标头和数据,提高了传输效率和压缩率。
支持多路复用(multiplexing),允许在单个TCP连接上并行发送多个请求和响应,解决了HTTP 1.x中的队头阻塞问题。
引入了HPACK算法对HTTP头部进行压缩,进一步减少了传输数据量。
支持服务器推送(Server Push),允许服务器主动向客户端发送资源,减少了客户端的请求次数。 - HTTP/3
发布时间:2022年6月
特点:
使用QUIC协议替代了TCP协议,作为位于应用层的通用传输协议。QUIC是基于UDP构建的多路复用传输协议,提高了连接速度和用户体验。
解决了TCP协议在移动设备上频繁切换网络时性能下降的问题。
减少了延迟,支持零往返时间(0-RTT)连接建立,对于已经连接的服务器,客户端可以跳过握手过程。
提供了更全面的加密,默认在传输层设置加密连接,提高了安全性。
HTTP 仍然在不断发展演进。
代理
位于客户端和服务器之间的HTTP实体,接收来自客户端的HTTP请求,并代表客户端访问服务器(可能会修改来自客户端的请求),将响应结果返回给客户端。代理可以对请求和响应进行过滤。
缓存
Web 缓存 (Web cache) 也称 代理缓存 (proxy cache) 是一种特殊的 HTTP 代理服务器,它的作用是缓存 Web 服务器上的资源,当用户再次访问相同资源的时候,可以直接从 Web 缓存这里取到数据,以均衡 Web 服务器的负载 和 避免网络拥塞。
网关
gateway 是一种特殊的服务器,通常也是客户端和服务器之间的中间实体,常用于将HTTP流量转换成其他协议。
隧道
在HTTP中,隧道(Tunnel)是一种特殊的技术,它利用HTTP或HTTPS协议来封装其他类型的网络协议数据,从而实现这些协议数据在受限网络环境中的传输。具体来说,HTTP隧道通过HTTP或HTTPS连接建立起一条虚拟的数据通道,使得非HTTP或HTTPS协议的数据能够在这条通道上进行传输,而不会被中间的网络设备(如防火墙、NAT等)所拦截或阻止。
Agent 代理
用户 Agent 代理 是代表用户发起 HTTP 请求的客户端程序。Web 浏览器就是一种 用户 Agent 代理。其他类型的代理有 网络蜘蛛 spiders 或者 Web robots。像搜索引擎就是一种网络蜘蛛,它平时没事就在网上闲逛,搜集信息并整理成文档,当你使用搜索引擎 search 某一个关键词的时候,他就会在数据库中查找这个内容,并通过算法呈现给你。
个人网站:jackey-song.com,欢迎访问。
关注微信公众号:了解后续更多内容。