首页/文章/http-网络

按下回车后网页是怎么出来的

2025-08-06
313811 分钟
...

当你在浏览器中输入一个网址,比如 https://www.baidu.com,然后按下回车键,几秒钟后页面就完整地呈现在你眼前。这个看似简单的操作,背后其实是一整套精密协作的网络机制在起作用。本文将带你从基础讲起,理解 Web 开发中最重要的网络知识,帮助你搞清楚:数据是如何从服务器传到你的电脑,并最终变成网页的?

一、互联网通信的分层模型:OSI 七层模型

为了管理复杂的网络通信,工程师们提出了一个通用的参考模型——OSI 七层模型。它把整个通信过程划分为七个层次,每一层各司其职,上层依赖下层的服务,而每一层又只和对等层进行“对话”。

下面我们从最底层开始,逐层理解。

1. 物理层:数据传输的物理基础

物理层是整个网络通信的最底层,负责实际的物理连接。它关注的是“如何把 0 和 1 传过去”。比如你使用的网线、光纤、Wi-Fi 信号,都属于物理层的范畴。

你可以把它想象成一条高速公路。没有这条路,任何车辆(数据)都无法通行。这一层不关心数据的内容,只负责确保电信号或光信号能够稳定传输。

2. 数据链路层:点对点的数据传输

在物理层之上,是数据链路层。它的任务是在两个直接相连的设备之间可靠地传输数据。比如你的电脑和家里的路由器之间,就通过这一层进行通信。

常见的技术如以太网(Ethernet)和 Wi-Fi(802.11 协议)都工作在这一层。它会把数据打包成“帧”(frame),并处理错误检测和重传,确保数据在本地网络中准确送达。

3. 网络层:实现跨网络的数据传输

当数据需要跨越多个网络(比如从你家传到百度的服务器),就轮到网络层发挥作用了。这一层的核心协议是 IP 协议(Internet Protocol)。

每个联网设备都有一个唯一的 IP 地址,就像现实生活中的门牌号。网络层的任务就是根据这些地址,把数据从源地址“路由”到目标地址。

此外,我们平时使用的域名(如 www.baidu.com)并不是机器能识别的地址,需要通过 DNS 解析 转换成 IP 地址。DNS 服务也属于网络层的功能之一。

4. 传输层:确保数据可靠、有序地到达

网络层负责“送达”,但不保证“完整”和“有序”。传输层则解决了这个问题。最常用的协议是 TCP(传输控制协议)。

TCP 的特点包括:

  • 建立连接(三次握手)
  • 数据分段传输
  • 确认与重传机制
  • 流量控制和拥塞控制

正是因为 TCP 的这些机制,我们才能确保网页内容完整无误地加载。常见的端口号如 80(HTTP)、443(HTTPS)也是由传输层管理的。

5. 会话层:管理通信的“会话”状态

会话层负责建立、管理和终止两个设备之间的通信会话。比如你在登录一个网站时,服务器需要知道“你是谁”以及“你是否还在线”。会话层就负责维护这种状态。

虽然在现代 Web 开发中,会话管理更多由应用层(如 Cookie、Session)实现,但它的概念来源于此。

6. 表示层:数据的格式转换与处理

表示层关注的是数据的“表达方式”。不同系统可能使用不同的编码、格式或加密方式。这一层负责将数据转换成对方能够理解的形式。

例如:

  • 将 JSON 或 XML 数据序列化或反序列化
  • 对数据进行压缩以减少传输体积
  • 处理 SSL/TLS 加密(HTTPS 的基础)

它的目标是确保通信双方“语言相通”。

7. 应用层:用户直接交互的层面

这是最上层,也是我们作为开发者最常接触的一层。应用层直接为用户提供服务,常见的协议包括:

  • HTTP/HTTPS:用于网页浏览
  • FTP:文件传输
  • SMTP:电子邮件发送

我们编写的 Web 应用代码,比如用 Node.js 或 Express 编写的接口,本质上都是在应用层通过 HTTP 协议与客户端(浏览器)进行通信。


二、我们写的 Web 代码运行在哪一层?

答案是:主要在应用层

比如你写这样一段代码:

app.get('/', (req, res) => {
  res.send('Hello World!');
});

这段代码的作用是:当浏览器发起一个 HTTP 请求时,服务器返回一段文本。这个过程完全基于应用层的 HTTP 协议。

但需要注意的是,虽然我们只关注应用层,底层的 TCP、IP、DNS 等协议仍在默默工作,确保请求能正确发送并响应返回。


三、TCP 与 HTTP 的关系

很多人容易混淆 TCP 和 HTTP。其实它们属于不同的层次:

  • TCP 是传输层协议,负责数据的可靠传输。
  • HTTP 是应用层协议,定义了客户端和服务器之间“请求-响应”的格式。

可以这样理解:HTTP 是基于 TCP 的。当你访问一个网站时,首先通过 TCP 建立连接,然后在这个连接上传输 HTTP 请求和响应。

举个例子:HTTP 请求中的 GET /index.html 是内容,而 TCP 负责确保这个请求完整、有序地送达服务器。


四、用 Node.js 创建服务器:net 与 http 模块的区别

在 Node.js 中,你可以使用不同的模块来创建服务器。

使用 net 模块(底层)

net 模块基于 TCP,提供最基础的网络通信能力。你可以监听端口、接收连接、收发原始数据流。

但问题在于:HTTP 是一种应用层协议,需要你自己解析请求头、请求行、请求体等。比如你收到一段字符串:

GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0

你需要手动分析这是什么请求、路径是什么、头部有哪些信息。开发效率低,容易出错。

使用 http 模块(推荐)

http 模块已经封装了 HTTP 协议的解析逻辑。你不需要关心底层细节,只需要关注业务逻辑:

const http = require('http');

http.createServer((req, res) => {
  console.log(req.method, req.url); 
  res.end('Hello');
}).listen(3000);

因此,在开发 Web 应用时,我们通常使用 http 模块或更高层的框架(如 Express),而不是直接操作 net


五、为什么 HTTP 要区分请求头和请求体?

一个完整的 HTTP 请求由两部分组成:请求头(Headers)请求体(Body)

请求头的作用

请求头包含关于请求的元信息,比如:

  • Host:目标主机
  • Content-Type:请求体的数据类型
  • Accept:客户端能接收的响应格式
  • Authorization:身份认证信息

这些信息帮助服务器理解“这个请求的上下文”,从而做出正确响应。

请求体的作用

请求体是真正要传输的数据,通常出现在 POSTPUT 等方法中,比如:

  • 用户登录时的用户名和密码
  • 上传的 JSON 数据
  • 文件内容

为什么要分开?

  1. 内容协商:服务器可以根据 Accept 头返回不同格式的响应(如 HTML、JSON)。
  2. 性能优化:对于 GET 请求,没有请求体,服务器可以快速处理。
  3. 结构清晰:头信息用于控制,主体用于数据,职责分明。
  4. 安全性:认证信息放在头部,数据放在主体,便于分别处理。

六、静态文件服务与 MIME 类型

在 Web 开发中,除了动态接口,我们还需要提供静态资源,如 CSS、JavaScript、图片、字体等。这些文件内容固定,统称为“静态文件”。

当用户请求一个静态资源时,服务器只需读取文件并返回,无需计算或处理。这就是静态文件服务

但问题来了:服务器如何告诉浏览器“这个文件是什么类型”?比如一个 .css 文件,如果不说明类型,浏览器可能把它当作普通文本显示,而不是作为样式应用。

这就引出了 MIME 类型(Multipurpose Internet Mail Extensions)。

什么是 MIME 类型?

MIME 类型是一种标准,用来标识文件的媒体类型。服务器在响应头中通过 Content-Type 字段发送 MIME 类型,告诉浏览器如何处理响应内容。

常见类型包括:

  • text/html:HTML 文件
  • text/css:CSS 文件
  • application/javascript:JS 文件
  • image/png:PNG 图片
  • application/json:JSON 数据

mime.getType(filePath) 的作用

在 Node.js 中,我们可以使用 mime 模块(需安装:npm install mime)来自动获取文件的 MIME 类型:

const mime = require('mime');
const mimeType = mime.getType('./styles/main.css'); 

这个函数根据文件的扩展名(如 .css.png)查找对应的 MIME 类型,极大地简化了静态服务器的开发。

实际应用示例

const http = require('http');
const fs = require('fs');
const path = require('path');
const mime = require('mime');

http.createServer((req, res) => {
  const filePath = path.join(__dirname, 'public', req.url);
  
  fs.readFile(filePath, (err, data) => {
    if (err) {
      res.writeHead(404, { 'Content-Type': 'text/plain' });
      res.end('File not found');
      return;
    }

    const mimeType = mime.getType(filePath) || 'application/octet-stream';
    res.writeHead(200, { 'Content-Type': mimeType });
    res.end(data);
  });
}).listen(3000);

这样,浏览器就能正确识别并处理各种静态资源。

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
http-网络2025-03-04
网络代理详解
一、 的基础概念 1\. 什么是代理? 代理是一种通过中间服务器来帮助 访问目标服务器的技术。代理服务器位于客户端与服务器之间,充当两者的中介,从而实现客户端和服务器之间的隔离。用户的所有请求经过代理后,再发往目标服务器,而目标服务器的响应则返回代理,再由代理传递给用户。 2\. 网络代理的工作流程 在基本的网络代理工作流程中, 扮演了“请求转发者”和“响应返回者”的角色: 1. 客户端请求 :客户端将请求发送到代理服务器,而不是直接发...
学习面试
http-网络2024-11-29
没有koa的cors你怎么处理跨域?
关联问题: JSONP有何局限性 CORS如何处理复杂请求 代理在生产环境效果如何 前言 “金九银十”的秋招,就像是落进池塘的羽毛,连点水花都没砸起来。已读不回是常态,能给面试已是情分,能拿offer的更是少之又少。可怜我在寒潮来临的深秋之际,也只得哀叹一句“越来越冷了啊...” 不过人总是要吃饭的,所以再怎么冷,卖炭翁也得卖炭,牛马攻城狮也得“攻城”,既是为了填饱肚子,也是为了“春天”做准备。所以今天为各位前端工程狮细聊一下前端面试中...
学习面试
http-网络2024-09-11
面试常客系列之跨域前言
跨域?什么是跨域呢?我们先来看看一个url的组成, ,这一个url我们可以分成四部分来看 是协议, 是域名, 是端口, 是路径.在浏览器中,我们从一个域名发送请求到另一个域名,如果两个域名的协议,域名,端口三部分只要存在一部分不同就会发生跨域,也就是说只有两个域名的协议,域名,端口都相同才会不会发生跨域,所以我们又如何解决跨域的问题呢?在下文中会给大家介绍几种方法去解决跨域问题. 那么要解决跨域就不得不谈及 ,同源策略是一种安全措施,用...
学习面试
http-网络2024-09-02
HTTP缓存:别傻傻不会回答了
前言 在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本,并存储在某个相对来说可以快速到达、访问、获取的仓库,这样在需要这些数据的时候可以直接从这个仓库中获取数据。 缓存的目的: 提升数据交换的性能,提高速度。 缓解服务器或数据库的压力。 HTTP 根据是否要向服务器发送请求将缓存规则分为两类:强缓存和协商缓存。 强缓存 在强缓存中,如果命中缓存,则直接从缓存数据库中取出资源,无需再发送请求到服务器上。...
学习面试
http-网络2024-08-19
网络-navigator.sendBeacon前言
navigator.sendBeacon 是浏览器的 API,用于在浏览器后台发送异步请求,它不会等服务端响应。 它可以用于在页面卸载或关闭的时候,发送数据,以及在不阻塞页面卸载的情况下发送数据。 使用 方法发送的请求是异步的,不会阻塞页面的卸载或关闭过程。 这对于需要在用户离开页面之前发送数据的情况非常有用。 优点 不受页面卸载过程的影响,确保数据可靠发送。 普通的 请求如 和 在页面关闭或者刷新、前进、后退等操作时 , 这些请求有可...
学习面试
http-网络2024-08-16
前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别在前端开发中,实时数据更
前端项目中的 项目实践 前言 在前端开发中,实时数据更新是提升用户体验的重要因素之一。 是一种高效的技术,允许服务器通过单向连接将实时数据推送到客户端。下面将从 的基本改变,使用场景展开了解,并提供一个实际案例来更好的理解如何在前端项目中应用 。 的主要特点 1. 单项数据流:数据从服务器推送到客户端。 2. 自动重连:在链接丢失时,浏览器会自动尝试重新链接。 3. 简单易用:基于 协议,不需要额外的库或协议。 的使用场景 适用于需要从...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录