赞
踩
在计算机网络体系结构的 TCP/IP 参考模型中,总共有四层,由下到上分别是 网络接口层、网际层、传输层、应用层。
网络接口层对应着OSI模型中的物理层和数据链路层,物理层负责在物理媒介上传输原始比特流,确保数据以比特流的形式从一个设备传输到另一个设备。数据链路层管理直接连接的设备之间的数据传输,通过帧(Frame)来定义和管理数据的传输。
网际层中主要使用的是网际协议 IP(Internet Protocol) 协议,主要功能是负责将数据包从源主机到目的主机的转发,中间会经过许多路由器或其他节点,其中运行着路由转发算法来确定数据包的传送路径。
传输层主要负责主机到主机之间的端对端可靠通信,该层使用了2种协议来支持2种数据的传送方法,一种是有连接的可靠数据传输服务,另一个则是无连接的数据服务,它们分别依靠TCP协议和UDP协议来支撑。在网际层中并不负责可靠的数据传输,传输层利用TPC协议基于网际层实现了可靠的数据传输,并提供了更多的网络功能(如流量控制和拥塞控制等)来提高网络的整体性能。
应用层是 TCP/IP 参考模型中的最高层,在这一层运行着各种各样的协议,以应对不用的使用场景。而本文要介绍的 HTTP/HTTPS 就位于该层中,日常浏览网页都会用到这个协议。
HTTP (HyperText Transfer Protocol,超文本传输协议) 是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP是一种用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它定义了客户端(如浏览器)与服务器之间请求和响应的格式。HTTP协议是万维网的通讯基础,通过它,客户端可以请求服务器上的资源(如HTML文件、图片文件等),服务器则根据请求返回相应的资源或处理结果。
有各种各样的Web服务器遍布全球,它们存储了各种各样的资源,包括图片 jpg、png、HTML文件、视频、音乐、电影等等,当我们打开浏览器浏览某个网页的时候,浏览器就会与Web服务器建立连接,通过HTTP协议来传送这些数据。客户端浏览器向Web服务器发送HTTP请求,服务器对请求的数据进行响应,客户端浏览器将响应的数据解析渲染出来呈现给用户。
Web服务器上有各种类型的资源,为了方便请求这些资源,每个资源都要有一定的标识,统一资源标识符(Uniform Resource Identifier,URI)就是为了这个而生。它可以在世界范围内唯一标识一个资源。例如:https://www.jackey-song.com/img/boyWithCat.webp 标识了一台服务器上的一张图片资源。URI 包括 URL 和 URN。
统一资源定位符(Uniform Resource Locator,URL)是目前最长使用的一种 URI。它提供了一个资源的精确位置,以让浏览器进行访问。
URL主要包含三部分:
方案(scheme)
协议类型,http://
或 https://
等。统一资源名 (Uniform Resource Name) 特定内容的唯一名称使用,资源的位置可以随意移动,支持多种网络协议访问,目前(2024年7月)仍处于试验阶段。
一个HTTP事务由一条HTTP请求和HTTP响应组成。通信过程使用 HTTP 报文 (HTTP message)。
HTTP支持多种方法来实现不同的目的。
在你们日常使用过程中,一定碰到过 404 NOT FOUND
,它就是一个状态加上一段描述语句,表示错误未找到相应的资源。
常用的状态码:
做过前端开发写过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的实现有兴趣的可以查阅相关资料。
浏览器访问某一个资源的时候,大致过程如下:
三次握手:
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实体,接收来自客户端的HTTP请求,并代表客户端访问服务器(可能会修改来自客户端的请求),将响应结果返回给客户端。代理可以对请求和响应进行过滤。
Web 缓存 (Web cache) 也称 代理缓存 (proxy cache) 是一种特殊的 HTTP 代理服务器,它的作用是缓存 Web 服务器上的资源,当用户再次访问相同资源的时候,可以直接从 Web 缓存这里取到数据,以均衡 Web 服务器的负载 和 避免网络拥塞。
gateway 是一种特殊的服务器,通常也是客户端和服务器之间的中间实体,常用于将HTTP流量转换成其他协议。
在HTTP中,隧道(Tunnel)是一种特殊的技术,它利用HTTP或HTTPS协议来封装其他类型的网络协议数据,从而实现这些协议数据在受限网络环境中的传输。具体来说,HTTP隧道通过HTTP或HTTPS连接建立起一条虚拟的数据通道,使得非HTTP或HTTPS协议的数据能够在这条通道上进行传输,而不会被中间的网络设备(如防火墙、NAT等)所拦截或阻止。
用户 Agent 代理 是代表用户发起 HTTP 请求的客户端程序。Web 浏览器就是一种 用户 Agent 代理。其他类型的代理有 网络蜘蛛 spiders 或者 Web robots。像搜索引擎就是一种网络蜘蛛,它平时没事就在网上闲逛,搜集信息并整理成文档,当你使用搜索引擎 search 某一个关键词的时候,他就会在数据库中查找这个内容,并通过算法呈现给你。
个人网站:jackey-song.com,欢迎访问。
关注微信公众号:了解后续更多内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。