初级程序员必备的十大技能之计算机基础必备(三)

简介: 教程来源 http://htnus.cn 本节详解网络数据传输核心机制:对比OSI七层与TCP/IP四层模型;剖析HTTP请求/响应结构、状态码及方法语义;解析HTTPS加密原理与TLS握手;图解TCP三次握手与四次挥手;还原“输入URL到页面显示”全链路;并提供请求重试、超时、去重等开发实战技巧。

三、计算机网络:数据如何在网络中传输

3.1 OSI 七层模型 vs TCP/IP 四层模型
image.png
3.2 HTTP 协议深度解析
HTTP 请求结构

POST /api/users HTTP/1.1                    ← 请求行
Host: example.com                           ← 请求头
User-Agent: Mozilla/5.0
Content-Type: application/json
Content-Length: 27
                                            ← 空行
{ "name": "张三", "age": 25 }               ← 请求体

HTTP 响应结构

HTTP/1.1 200 OK                            ← 状态行
Content-Type: application/json
Content-Length: 52
Cache-Control: max-age=3600
                                            ← 空行
{ "id": 1, "name": "张三", "age": 25 }      ← 响应体

HTTP 状态码分类
image.png

// 在实际代码中正确处理 HTTP 状态码
async function fetchUser(id) {
    const response = await fetch(`/api/users/${id}`);

    switch (response.status) {
        case 200:
            return await response.json();
        case 404:
            throw new Error("用户不存在");
        case 401:
            // 跳转到登录页
            window.location.href = '/login';
            throw new Error("未授权");
        case 500:
            throw new Error("服务器错误,请稍后重试");
        default:
            throw new Error(`未知错误:${response.status}`);
    }
}

HTTP 方法语义
image.png
3.3 HTTPS:HTTP + 加密
HTTPS 通过 TLS/SSL 协议在 HTTP 和 TCP 之间增加加密层。

// HTTPS 握手过程简化版
// 1. 客户端发送 "Client Hello"(支持的加密算法、随机数)
// 2. 服务器返回 "Server Hello"(选择算法、服务器随机数 + 证书)
// 3. 客户端验证证书 → 生成预主密钥 → 用服务器公钥加密发送
// 4. 双方使用预主密钥生成会话密钥
// 5. 后续通信使用会话密钥对称加密

// 在 Node.js 中创建 HTTPS 服务器
const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('private-key.pem'),
    cert: fs.readFileSync('certificate.pem')
};

https.createServer(options, (req, res) => {
    res.writeHead(200);
    res.end('Hello HTTPS!');
}).listen(443);

3.4 TCP 三次握手与四次挥手
三次握手(建立连接)

客户端                                    服务器
   |                                        |
   |-------- SYN (seq=x) -------->          |  1. 客户端发送 SYN
   |                                        |
   |<----- SYN+ACK (seq=y, ack=x+1) ---|  2. 服务器回复 SYN+ACK
   |                                        |
   |-------- ACK (ack=y+1) -------->       |  3. 客户端回复 ACK
   |                                        |
// 用伪代码模拟三次握手
function threeWayHandshake() {
    // 1. 客户端:我想连接你,这是我的初始序号 100
    const clientSeq = 100;
    send("SYN", clientSeq);

    // 2. 服务器:好的,这是我的初始序号 500,并确认收到你的 100
    const serverSeq = 500;
    send("SYN+ACK", serverSeq, clientSeq + 1);

    // 3. 客户端:确认收到你的 500
    send("ACK", serverSeq + 1);

    // 连接建立,可以发送数据了
}

四次挥手(断开连接)

客户端                                    服务器
   |                                        |
   |-------- FIN (seq=u) --------->        |  1. 客户端发送 FIN
   |                                        |
   |<-------- ACK (ack=u+1) ---------|    2. 服务器回复 ACK
   |                                        |
   |<-------- FIN (seq=v) ----------|     3. 服务器发送 FIN
   |                                        |
   |-------- ACK (ack=v+1) -------->       |  4. 客户端回复 ACK
   |                                        |

3.5 输入 URL 到页面显示的完整过程
这是面试中最高频的问题,理解这个过程就能串联起大部分网络知识:

1. 用户在浏览器输入 URL:https://www.example.com/index.html

2. 浏览器解析 URL
   - 协议: https
   - 域名: www.example.com
   - 路径: /index.html

3. DNS 解析(域名 → IP 地址)
   - 浏览器缓存 → 操作系统缓存 → hosts 文件 → 本地 DNS 服务器
   - 本地 DNS 递归查询根域名服务器 → 顶级域名服务器 → 权威域名服务器
   - 获取 IP 地址,例如 93.184.216.34

4. 浏览器与服务器建立 TCP 连接(三次握手)

5. TLS 握手(如果是 HTTPS)

6. 浏览器发送 HTTP 请求
   GET /index.html HTTP/1.1
   Host: www.example.com
   User-Agent: Mozilla/5.0
   ...

7. 服务器处理请求并返回响应
   HTTP/1.1 200 OK
   Content-Type: text/html
   ...

8. 浏览器接收响应,解析 HTML

9. 解析过程中遇到外部资源(CSS、JS、图片),重复步骤 2-7

10. 浏览器构建 DOM 树和 CSSOM 树

11. 合并生成渲染树

12. 布局(计算每个节点的位置和大小)

13. 绘制(将像素绘制到屏幕上)

3.6 网络开发实用技巧

// 1. 请求重试(处理网络波动)
async function fetchWithRetry(url, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
        try {
            const response = await fetch(url);
            if (response.ok) return response;
        } catch (error) {
            console.log(`第 ${i + 1} 次尝试失败`);
            if (i === maxRetries - 1) throw error;
            // 指数退避:1s, 2s, 4s...
            await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
        }
    }
}

// 2. 请求超时控制
function fetchWithTimeout(url, timeout = 5000) {
    return Promise.race([
        fetch(url),
        new Promise((_, reject) => 
            setTimeout(() => reject(new Error('请求超时')), timeout)
        )
    ]);
}

// 3. 请求去重(防止重复请求)
const pendingRequests = new Map();

async function dedupFetch(url) {
    if (pendingRequests.has(url)) {
        return pendingRequests.get(url);
    }

    const promise = fetch(url).finally(() => {
        pendingRequests.delete(url);
    });

    pendingRequests.set(url, promise);
    return promise;
}

来源:
http://unbgv.cn

相关文章
|
20天前
|
编解码 数据可视化 前端开发
前端组件库——DataV知识点大全(二)
教程来源 https://www.xbivx.cn DataV提供40+高质量组件,涵盖边框(13种SVG动画边框)、装饰、数字翻牌器、滚动表格、水位图、锥形柱图、飞线图及全屏容器等,支持高度自定义与响应式适配,助力快速构建专业数据大屏。
|
20天前
|
资源调度 数据可视化 前端开发
前端组件库——DataV知识点大全(一)
教程来源 https://www.wkmsa.cn DataV是专注大屏可视化的开源Vue组件库,提供丰富SVG边框、装饰与图表组件,助力快速构建震撼数据看板。基于Vue3+TS重构,支持主题定制与按需引入;3.0版将集成WebGPU,性能提升47%。开箱即用,大幅降低开发门槛。
|
16天前
|
前端开发 JavaScript 数据可视化
前端组件库 ——Three.js 知识点大全(一)
教程来源 https://www.vhjpe.cn/ Three.js 是基于 WebGL 的主流 JavaScript 3D 库,封装底层图形接口,让开发者用简洁代码快速构建网页级 3D 场景。涵盖场景、相机、渲染器三大核心,支持几何体、材质、光照、动画等完整管线,广泛应用于数据可视化、虚拟展厅与智慧园区等领域。
|
17天前
|
JavaScript Java 关系型数据库
全栈(Java + Vue + MySQL)开发图书管理系统教程(一)
教程来源 https://yyvgt.cn 本教程带你从零打造全栈图书管理系统,涵盖Spring Boot+Vue3前后端分离开发、JWT认证、RBAC权限控制、MySQL数据库设计(含范式化/索引/软删除)及统一RESTful接口规范,深入原理与工程实践。
|
20天前
|
移动开发 自然语言处理 小程序
前端组件库——Wot Design Uni知识点大全(三)
教程来源 https://rvtst.cn Wot Design Uni 是基于 Vue3 的跨平台 UI 组件库,支持微信/支付宝小程序、H5、App 等多端兼容;提供样式隔离修复、virtualHost 渲染优化、虚拟列表、按需引入、国际化(15+语言)等完整解决方案。
|
21天前
|
移动开发 前端开发 JavaScript
前端组件库——Wot Design Uni知识点大全(二)
教程来源 http://unbgv.cn Wot Design Uni 是基于 Vue3+TS 的跨平台 uni-app 组件库,提供 70+ 高质量组件。涵盖按钮、单元格、表单(支持链式校验)、弹窗、Toast、虚拟列表及带徽标的 Tabs 等,全面适配小程序/H5/APP,支持暗黑模式与国际化。
|
21天前
|
JSON 小程序 前端开发
前端组件库——Vant Weapp知识点大全
教程来源 http://oplhc.cn/ Vant Weapp是有赞官方打造的高星(1.1w+)微信小程序UI组件库,轻量、稳定、高性能,含50+组件与CSS变量主题系统,支持按需引入与深度定制,是小程序开发首选开源UI方案。
|
24天前
|
人工智能 前端开发 JavaScript
前端组件库——shadcn/ui知识点大全(三)
教程来源 http://lemci.cn/ shadcn/ui通过Tree Shaking、动态导入、Tailwind JIT等实现极致性能优化,Bundle仅增20–50KB;组件即代码,完全可控、可定制、易维护,契合Next.js+Tailwind现代栈与AI协作开发。
|
9天前
|
前端开发 JavaScript API
前端组件库 ——LayUI 知识点大全(一)
教程来源 http://oplhc.cn LayUI是由国内开发者“贤心”于2016年推出的经典模块化前端UI框架,MIT开源。不依赖Vue/React等现代框架,零配置、低门槛、开箱即用,尤受后端开发者与中小项目青睐。2026年仍持续更新,最新版2.11+强化组件与工程化支持。
|
14天前
|
Web App开发 前端开发 数据可视化
前端组件库 ——ECharts 知识点大全(一)
教程来源 https://bgnno.cn/ ECharts 是 Apache 顶级开源可视化库,由百度于2013年发起,支持50+图表类型、千万级数据渲染、Canvas/SVG双引擎及深度交互。兼容主流浏览器与移动端,广泛应用于商业、政务与科研领域。