概述
如何让数据具有自我描述性?
为什么网络有层级的划分?
交换机、路由器要不要阅读一个信息的头部?要不要阅读数据部分?
网卡:网卡可以完成帧的封装和解封装,工作在数据链路层。 中继器:中继器以比特方式将网络信号进行再生和重定时,使其能够传输更长的距离。 放大器 集线器: 集线器实际上就是一个多端口的中继器。 网桥/桥接器:连接两个局域网的一种存储转发设备,可以将一个大的LAN分割为多个网段,或者将两个以上的LAN互联为一个逻辑LAN。 交换机:交换机有一张交换表,可以记录MAC帧和对应端口。(相当于网桥+集线器) 路由器:路由选择、存储转发、连接外部网络。
协议名 | 层 | 协议功能 | 占用端口 号 |
---|---|---|---|
HTTP 超文本传输协议 | 应用层 | 传输Web网站网页和其他资源 | 80 |
FTP文件传输协议 | 应用层 | 文件上传和下载 | 20/21 |
Telnet 远程连接协议 | 应用层 | 远程登录(无加密) | 23 |
SSH安全外壳协议 | 应用层 | 远程登陆(加密) | 22 |
SMTP 简单邮件传输协 议 | 应用层 | 电子邮件(邮件在服务器之间提交和传 送) | 25 |
POP3 邮局协议版本3 | 应用层 | 电子邮件(邮件最终交付协议) | 110 |
TCP | 传输层 | 可靠的面向连接的传输层协议 | |
UDP | 传输层 | 不可靠的基于数据报的传输层协议 | |
IP | 网络层 | 网际互联协议 | |
ICMP | 网络层 | 网络控制消息协议 | |
IGMP | 网络层 | 网络组管理协议 | |
ARP | 数据链路 层 | 地址转换协议 | |
RARP | 数据链路 层 | 反向地址转换协议 |
万维网
万维网(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请求报文
,分为请求行
、请求头/消息头
、空行
、请求体/请求正文
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.
GET /stm32/index.html?toc=0&ws=off&reset=true HTTP/1.1 # 请求行:使用GET方法获取/stm32/index.html资源,附带3个查询参数,使用HTTP/1.1协议
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 # 可接受的响应内容类型及优先级(q值)
Accept-Encoding: gzip, deflate # 支持的压缩编码格式
Accept-Language: zh-CN,zh;q=0.9 # 优先接收中文内容
Cache-Control: max-age=0 # 禁用缓存,强制向服务器验证
Connection: keep-alive # 要求保持TCP连接
Cookie: __itrace_wid=f3d24dcd-1c13-4bec-8cc9-11d91bc0475e; __itrace_wid=6d823e9c-84aa-43bd-1109-18aee93b70cd # 发送的Cookie信息(包含两个相同的键,可能是错误)
Host: 47.97.82.68:8080 # 目标服务器地址和端口
If-Modified-Since: Tue, 06 May 2025 12:41:12 GMT # 条件请求:如果资源在此时间后未修改则返回304
If-None-Match: W/"681a0368-b41d8" # 条件请求:如果ETag匹配则返回304
Upgrade-Insecure-Requests: 1 # 表示客户端优先选择HTTPS
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 QuarkPC/4.2.5.446 # 客户端浏览器信息(Windows系统,Chrome内核,Quark浏览器)
请求正文
请求行(Request Line):第一行
请求头(Request Headers):从第二行开始到空行前的所有内容均为请求头,用于传递附加信息
响应
服务器发送的HTTP响应一般称之为HTTP响应报文
,分为响应行
、响应头/消息头
、空行
、响应体
四部分.其中的一些消息头和正文都是可选的,消息头和正文内容之间要用空行隔开.
HTTP/1.1 304 Not Modified # 响应行:HTTP/1.1协议,状态码304表示资源未修改
Server: nginx/1.18.0 (Ubuntu) # 服务器类型及版本(Ubuntu系统下的Nginx 1.18.0)
Date: Fri, 25 Jul 2025 13:47:28 GMT # 服务器响应时间(2025年7月25日13:47:28 GMT)
Last-Modified: Tue, 06 May 2025 12:41:12 GMT # 资源最后修改时间(与请求中的If-Modified-Since一致)
Connection: keep-alive # 保持TCP连接不关闭
ETag: "681a0368-b41d8" # 资源标识符(与请求中的If-None-Match一致)
响应正文
状态码范围 | 类别 | 说明 | 常见例子 |
---|---|---|---|
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→ 6. 浏览器渲染页面。
DNS解析(Domain Name System Resolution)是将人类易读的域名(如 www.example.com
)转换为机器可识别的IP地址(如 192.0.2.1
)的过程。
不同的域名可以用同一个服务器?
答案是肯定的! 多个域名可以指向同一台服务器,通过监视程序统一管理。
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后分配资源,避免无效连接。 |
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报文, 目的方着急回复确认吗? 不着急,偶尔回复
为什么发送数据时要携带源端口?
超时重传和快重传的区别是什么?
完整处理流程示例
假设发送 20KB 数据(MSS=1460B,初始 CWND=2 MSS):
分片:分成 14 个段(14×1460B)。
慢启动:
发送 2 段 → 收到 ACK → CWND=4 → 发送 4 段 → …
流量控制:若接收方 RWND=0,暂停发送。
拥塞控制:丢包后触发快重传,CWND 减半。
重组数据:接收方按序列号排序,提交给应用层。
补充: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 | 广域网,跨越长距离的网络(如互联网)。 |