概述
如何让数据具有自我描述性?
使数据携带自身的信息
为什么网络有层级的划分?
目的是通过通过模块化和分工协作,解决复杂的系统设计、管理和操作问题
交换机、路由器要不要阅读一个信息的头部?要不要阅读数据部分?
要阅读头部,要知道数据从哪来,到哪去,但不用阅读数据部分
网卡:网卡可以完成帧的封装和解封装,工作在数据链路层。 中继器:中继器以比特方式将网络信号进行再生和重定时,使其能够传输更长的距离。 放大器 集线器: 集线器实际上就是一个多端口的中继器。 网桥/桥接器:连接两个局域网的一种存储转发设备,可以将一个大的LAN分割为多个网段,或者将两个以上的LAN互联为一个逻辑LAN。 交换机:交换机有一张交换表,可以记录MAC帧和对应端口。(相当于网桥+集线器) 路由器:路由选择、存储转发、连接外部网络
万维网
万维网(World Wide Web,简称 WWW)的诞生和发展依赖于以下三个核心要素,它们共同构成了现代互联网信息交互的基础:
1. URL(统一资源定位符)
作用:为网络中的资源(如网页、图片、API)提供唯一标识和访问地址。
https://www.example.com:443/path/to/resource?query=value#fragment
↑ ↑ ↑ ↑ ↑ ↑
协议 主机名 端口 路径 查询参数 片段
以下是URL各组成部分的表格化总结:
组成部分 | 作用 | 示例 | 注意事项 |
---|---|---|---|
协议(Scheme) | 指定访问资源使用的应用层协议 | https:// 、ftp:// | 后跟:// ,现代浏览器默认隐藏http:// 或https:// |
主机名(Host) | 标识资源所在的服务器地址(域名或IP) | www.example.com 、192.168.1.1 | 可包含子域(如blog.example.com ) |
端口(Port) | 指定服务器服务的网络端口 | :443 (HTTPS)、:8080 (自定义端口) | 默认端口可省略(HTTP=80,HTTPS=443) |
路径(Path) | 标识服务器上资源的具体位置(类似文件路径) | /articles/2023/ 、/index.html | 区分大小写(取决于服务器配置) |
查询参数(Query) | 向服务器传递额外参数(以? 开头,& 分隔) | ?id=123&lang=zh | 常用于搜索(?q=keyword )、分页(?page=2 ) |
片段(Fragment) | 指向资源内的锚点(以# 开头),仅客户端使用 | #section-2 、/#/home (SPA路由) | 不发送到服务器,用于页面内跳转或前端路由 |
2. HTTP(超文本传输协议)
HTTP 的中文全称是 超文本传输协议(HyperText Transfer Protocol)。
超文本(HyperText)含义:超越普通文本的交互式文本,支持嵌入链接、图片、视频等多媒体资源。
GET:通过 URL 的查询字符串(
?key=value
)传递数据,可见且长度受限(约 2048 字符)。POST:通过请求体(body)传输数据,不可见且支持大量数据(如文件上传)。
发送
发送的HTTP请求一般称之为HTTP请求报文
,分为请求行
、请求头/消息头
、空行
、请求体/请求正文
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.
请求行(Request Line):第一行
请求头(Request Headers):从第二行开始到空行前的所有内容均为请求头,用于传递附加信息
响应
服务器发送的HTTP响应一般称之为HTTP响应报文
,分为响应行
、响应头/消息头
、空行
、响应体
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.
状态码范围 | 类别 | 说明 | 常见例子 |
---|---|---|---|
1XX | 信息性状态码 | 请求已被接收,继续处理 | 101 Switching Protocols (协议切换) |
2XX | 成功状态码 | 请求已成功处理 | 200 OK (成功) |
3XX | 重定向状态码 | 需进一步操作以完成请求 | 301 Moved Permanently (永久重定向) |
4XX | 客户端错误 | 请求包含语法错误或无法完成 | 404 Not Found (资源不存在) |
5XX | 服务器错误 | 服务器处理请求失败 | 500 Internal Server Error (服务器内部错误) |
3. HTML(超文本标记语言)
-
作用:定义网页的结构和内容,并支持超链接(Hyperlink)实现资源互联。
-
关键点:
-
超文本特性:通过
<a>
标签链接其他资源,形成网状信息结构。 -
跨平台兼容:纯文本格式,可在不同设备和浏览器中渲染。
-
多媒体整合:支持嵌入图片、脚本(JavaScript)、样式(CSS)等。
-
-
意义:解决了“如何呈现和关联资源”的问题,是万维网的“内容载体”。
三者的协作关系
1.浏览器输入URL → 2. DNS解析获取IP → 3. 建立TCP连接 → 4. 发送HTTP请求报文 → 5. 服务器返回响应 HTML
DNS解析(Domain Name System Resolution)是将人类易读的域名(如 www.example.com
)转换为机器可识别的IP地址(如 192.0.2.1
)的过程。
不同的域名可以用同一个服务器?
答案是肯定的! 多个域名可以指向同一台服务器,通过监视程序统一管理。
HTTPS
safe:安全的
HTTP | HTTPS | |
---|---|---|
安全性 | 不安全 | 安全(加密+身份验证) |
默认端口 | 80 | 443 |
加密 | 无 |
SSL/TLS 对称加密(如 AES)传输数据 非对称加密(如 RSA)交换密钥 |
速度 | 更快 | 稍慢(可忽略) |
HTTPS 通过 数字证书 验证服务器身份
对称加密(如 AES)与非对称加密(如 RSA)在 HTTPS 中的协作流程
-
客户端 → 服务器:
Hello,支持 HTTPS 吗?
-
服务器 → 客户端:
这是我的证书(含公钥)
-
客户端 验证证书有效性(如是否过期、是否受信任)。
-
客户端 生成随机 AES 密钥,用服务器公钥加密后发送。
-
服务器 用私钥解密,获取 AES 密钥。
-
双方 使用 AES 密钥加密所有后续通信。
特性 | 对称加密(AES) | 非对称加密(RSA) |
---|---|---|
速度 | 快(适合大数据量) | 慢(仅用于小数据) |
密钥管理 | 同一密钥加密/解密 | 公钥加密,私钥解密 |
用途 | 加密实际数据 | 安全交换对称密钥 |
算法举例 | AES, ChaCha20 | RSA, ECC(椭圆曲线) |
TCP
长连接 和 短连接的区别
类型 | 定义 | 典型应用场景 |
---|---|---|
短连接 | 每次通信后立即断开连接,下次通信需重新建立TCP连接。 | HTTP/1.0、简单的请求-响应模型(如早期Web) |
长连接 | 建立连接后保持连接不关闭,允许多次数据传输(通过心跳保活)。 | HTTP/1.1、数据库连接、实时通信(如WebSocket) |
TCP头部结构
(共20字节基础长度 + 可选选项)
字段名 | 位数 | 作用说明 | 示例/备注 |
---|---|---|---|
源端口(Source Port) | 16 bit | 发送方的端口号。 | 如 80 (HTTP服务端口) |
目的端口(Destination Port) | 16 bit | 接收方的端口号。 | 如 54321 (客户端临时端口) |
序列号(Sequence Number) | 32 bit | 当前数据段的第一个字节的序列号,用于数据排序和重组。 | 初始值随机生成(ISN),后续累加数据长度。 |
确认号(Acknowledgment Number) | 32 bit | 期望收到的下一个字节的序列号(仅当ACK=1时有效)。 | 如收到seq=1000 ,则回复ack=1001 。 |
数据偏移(Data Offset) | 4 bit | TCP头部的长度(以4字节为单位),用于定位数据开始位置。 | 最小值为5 (20字节头部)。 |
保留(Reserved) | 6 bit | 保留字段,必须置0。 | 未来扩展使用。 |
控制标志(Flags) | 6 bit | 控制连接状态的关键标志位: | |
- URG Urgent | 1 bit | 紧急指针有效(高优先级数据)。 | 如Telnet中断命令。 |
- ACK Acknowledgment | 1 bit | 确认号有效(建立连接后通常为1)。 | 三次握手中第二次开始ACK=1。 |
- PSH Push | 1 bit | 接收方应立即将数据推送给应用层(避免缓冲区延迟)。 | 如实时聊天消息。 |
- RST | 1 bit | 重置连接(异常终止)。 | 收到无效报文时强制断开。 |
- SYN :Synchronize | 1 bit | 同步序列号(用于建立连接)。 | 三次握手中前两次SYN=1。 |
- FIN | 1 bit | 终止连接(正常关闭)。 | 四次挥手中FIN=1。 |
窗口大小(Window Size) | 16 bit | 接收方的可用缓冲区大小(流量控制),表示当前能接收的字节数。 | 动态调整(滑动窗口机制)。 |
校验和(Checksum) | 16 bit | 校验头部和数据部分的完整性(包括伪头部)。 | 防止传输错误。 |
紧急指针(Urgent Pointer) | 16 bit | 当URG=1时有效,指向紧急数据的末尾偏移量。 | 需配合URG 标志使用。 |
选项(Options) | 可变 | 可选字段(长度由数据偏移决定),用于扩展功能: | |
- MSS(Maximum Segment Size) | 可变 | 协商最大报文段大小(通常1460字节,以太网MTU=1500)。 | 三次握手时协商。 |
- SACK(Selective ACK) | 可变 | 选择性确认,支持部分重传。 | 提高重传效率。 |
- 时间戳(Timestamp) | 可变 | 计算RTT(往返时间)和防止序列号回绕。 | 高带宽网络必备。 |
填充(Padding) | 可变 | 确保TCP头部长度是4字节的整数倍。 | 选项字段不足时补0。 |
三次握手
-
第一次握手(SYN)
-
客户端发送SYN,携带自己的初始序列号ISN(Sequence Number:857960100)。
-
目的:告知服务端“我想建立连接,我的序列号是X=857960100”。
-
-
第二次握手(SYN-ACK)
-
服务端返回SYN-ACK,携带自己的初始序列号ISN(Sequence Number:304853757),并确认客户端的ISN ( ACK=X+1),也就是ACK=857960100+1。
-
目的:回应客户端“我收到你的SYN了,我的序列号是Y=304853757,下次请发X+1”。
-
-
第三次握手(ACK)
-
客户端发送ACK,确认服务端的ISN(ACK=Y+1)也就是304853757+1。
-
目的:告知服务端“我收到你的SYN-ACK了,下次请发Y+1”。
-
关键点:第三次握手是客户端对服务端序列号的显式确认,确保双方序列号同步,且服务端知道客户端是活跃的。
TCP三次握手流程详解
步骤 | 发送方 | 报文内容 | 目的 |
---|---|---|---|
第一次握手 | 客户端 | SYN=1, seq=X | 告知服务端:“我想建立连接,我的初始序列号是X”。 |
第二次握手 | 服务端 | SYN=1, ACK=1, seq=Y, ack=X+1 | 回应客户端:“我收到你的SYN了,我的序列号是Y,下次请从X+1开始发数据”。 |
第三次握手 | 客户端 | ACK=1, seq=X+1, ack=Y+1 | 确认服务端:“我收到你的SYN-ACK了,下次请从Y+1开始发数据” |
为什么TCP需要三次握手?两次握手为什么不行?
两次握手:类似“你约朋友吃饭,朋友说‘好’,但你不确认他是否听到你的约定”。
风险:朋友可能没听清,但你默认他已同意。
三次握手:你约朋友 → 朋友说“好” → 你回复“收到”。
双方明确约定已达成。
TCP两次握手的问题 vs 三次握手的解决方案
问题分类 | 两次握手的缺陷 | 三次握手的解决方案 |
---|---|---|
历史连接干扰 | 服务端收到旧SYN会直接建立连接,客户端因序列号不匹配拒绝,导致服务端资源浪费。 | 客户端通过第三次ACK确认有效性,服务端仅对有效ACK分配资源。 |
初始序列号(ISN)同步 | 服务端无法确认客户端是否收到自己的SYN-ACK(ISN可能丢失),后续数据传输不可靠。 | 客户端的第三次ACK显式确认服务端的ISN(ACK=Y+1),确保双方序列号同步。 |
重复SYN导致的资源浪费 | 服务端无法区分重复SYN(如网络重传),会为每个SYN创建连接,耗尽资源。 | 服务端仅在收到客户端的ACK后分配资源,避免无效连接。 |
四次挥手
发送方设置
PSH=1
,要求接收方的 TCP 协议栈立即将当前数据段(Segment)提交给应用层(如 HTTP、FTP 等),而不是暂存在缓冲区等待更多数据。
为什么 TCP 断开连接需要四次挥手,而不是三次?
TCP 连接是全双工的。TCP 连接允许数据双向独立传输(客户端→服务端,服务端→客户端)。因此,关闭连接需要双向独立关闭:
-
客户端主动发起终止(发送
FIN
)。 -
服务端也需要独立发起终止(发送另一个
FIN
)。
类比:就像两个人打电话,必须双方都明确说“再见”才能挂断。
如果合并为三次:
服务端将 ACK
和 FIN
合并发送(即第二次挥手直接发 FIN + ACK
),但前提是服务端没有剩余数据要发送。这种情况在 HTTP 短连接中常见(表现为“三次挥手”),但不是 TCP 的标准行为。
下面就是合并为三次的情况
完整过程
TIME_WAIT=2MSL: 什么是MSL?为什么客户端最后还要等待2MSL?
什么是MSL?
MSL是指TCP传输中,TCP报文段在网络中存在的最大生存时间。(MSL的主要目的是定义一个时间限制,以确保TCP报文段在网络中不会无限期地存在。是TCP允许不同的实现可以设置不同的MSL值)
为什么客户端最后还要等待2MSL?
确保对方收到最终ACK:TIME_WAIT状态确保连接的另一方(服务器)有足够的时间接收到最后一个ACK。因为如果服务器没有收到这个ACK,并且第三次挥手超时, 服务端可能认为它发送的第三次挥手失败(迷失在网络中), 服务器它会重新发送FIN报文段(第三次挥手)。客户端在TIME_WAIT状态可以处理这种情况,确保连接的可靠终止。
端口和资源的正确释放:这个等待期还允许操作系统正确地清理和释放用于连接的资源,如端口号。在2MSL结束后,相同的端口号可以安全地被新的连接使用,不会受到旧连接残留数据的影响。
TCP协议如何保证数据的可靠传输?
机制 | 解决的问题 | 实现方式 |
---|---|---|
三次握手 | 可靠连接建立 | SYN、ACK同步序列号 |
序列号与确认号 | 数据顺序、丢包检测 | 每个字节标记序列号,ACK确认接收范围 |
超时重传 | 丢包恢复 | RTO超时未收到ACK则重传 |
滑动窗口 | 流量控制 | 动态调整发送窗口大小(RWND) |
拥塞控制 | 网络拥塞避免 | 慢启动、拥塞避免、快重传、快恢复 |
下面表格通过举例说明了超时重传、滑动窗口动态调整大小和快重传机制
步骤 | 发送方(Client) | 接收方(Server) | 机制触发 |
---|---|---|---|
1 | 发送seq=1~1000 | 未收到(丢包) | 超时重传(RTO触发) |
2 | 超时后重传seq=1~1000 | 收到并回复ACK=1001, RWND=4096 | 滑动窗口更新 |
3 | 发送seq=1001~5000 | 收到但缓冲区满,回复ACK=5001, RWND=2048 | 流量控制(窗口调小) |
4 | 发送seq=5001~7048 (2KB) | 收到seq=5001~7048 ,回复ACK=7049 | 正常传输 |
5 | 发送seq=8001~9000 (丢包) | 收到seq=9001~10000 ,回复3次ACK=8001 | 快重传 + 快恢复 |
发送方可能一次发送很多TCP报文, 目的方着急回复确认吗? 不着急,偶尔回复
为什么发送数据时要携带源端口? 接收端需要知道从哪个端口回复
超时重传和快重传有什么区别?见上
UDP
UDP是一种保留消息边界的简单的面向数据报的传输层协议。
- 无连接:UDP是一种无连接协议。这意味着在数据包发送之前,发送方和接收方之间不需要建立连接。每个数据包之间独立发送,彼此之间没有依赖关系。
- 低开销:UDP协议头部较小,只有8字节,相比之下,TCP协议头部最少20字节。UDP的简单性使得它在传输数据时增加的开销更少。
- 不可靠传输:UDP不提供数据到达的保证。因为它不进行错误检查或者纠正,意味着网络上的数据包可能会丢失、重复或乱序到达,且发送方不会得到通知。
- 无拥塞控制:UDP不实现拥塞控制机制。它以相同的速度发送数据,不论网络条件如何。这可能导致在网络质量较差时数据包被丢弃。
- 快速传输:由于缺乏连接建立、确认响应、流量控制等机制,UDP可以更快速地传输数据(能不能到目的地是另外一件事)。
由于其特性,UDP通常用于那些对实时性要求高但对可靠性要求不高的应用,例如视频流、VoIP(语音通信)、在线游戏、早期的聊天软件等。
补充:TCP协议核心术语对照表
英文缩写 | 英文全称 | 中文解释 |
---|---|---|
TCP | Transmission Control Protocol | 传输控制协议,提供可靠的、面向连接的字节流服务。 |
IP | Internet Protocol | 网际协议,负责数据包的路由和寻址。 |
MTU | Maximum Transmission Unit | 最大传输单元,单次数据传输的最大长度(如以太网MTU=1500字节)。 |
MSS | Maximum Segment Size | 最大报文段长度,TCP数据段的最大负载(MSS = MTU - IP头 - TCP头)。 |
SYN | Synchronize Sequence Numbers | 同步序列号,用于建立连接(三次握手的第一步)。 |
ACK | Acknowledgment | 确认号,表示已成功接收数据(ACK=1时有效)。 |
FIN | Finish | 终止连接标志,用于正常关闭连接(四次挥手)。 |
RST | Reset | 重置连接标志,强制终止异常连接。 |
URG | Urgent | 紧急指针标志,表示数据需优先处理(如中断命令)。 |
PSH | Push | 推送标志,要求接收方立即将数据提交给应用层。 |
ISN | Initial Sequence Number | 初始序列号,TCP连接开始时随机生成的序列号。 |
RTT | Round-Trip Time | 往返时间,数据从发送到确认接收的时间。 |
RTO | Retransmission Timeout | 重传超时时间,超时未收到ACK则触发重传。 |
RWND | Receive Window | 接收窗口,接收方当前可用的缓冲区大小(流量控制)。 |
CWND | Congestion Window | 拥塞窗口,发送方根据网络拥塞程度动态调整的发送窗口。 |
SACK | Selective Acknowledgment | 选择性确认,允许接收方告知发送方哪些数据已收到(优化重传)。 |
MSS | Maximum Segment Size | 最大报文段长度,TCP单次传输的数据段最大值。 |
NAT | Network Address Translation | 网络地址转换,将私有IP映射为公有IP(解决IPv4地址不足)。 |
LAN | Local Area Network | 局域网,小范围内的私有网络(如家庭、办公室)。 |
WAN | Wide Area Network | 广域网,跨越长距离的网络(如互联网)。 |