本文最后更新于 218 天前,其中的信息可能已经有所发展或是发生改变。
- 介绍一下 TCP/IP 模型和 OSI 模型的区别?
答:
- TCP/IP 模型
- 是如今现实世界被广泛使用的网络通信模型,是事实上的标准
- 从底层到顶层分别为5层
- 物理层:负责比特流在物理介质上的传输
- 数据链路层:负责同一物理网络内
设备之间到端的传输 - 网络层:核心是ip寻址和路由,负责主机到主机的逻辑寻址和路由选择
- 传输层:保证端到端的数据传输
- tcp:有连接服务,在一个不可信的网络世界中提供了一个可信的流传输机制。
- udp:无连接服务,不可靠传输,用于可容许少量丢包的场景。
- 应用层:面向用户的接口,为用户和应用提供服务。
- tcp/ip模型,在网络层只提供
无连接服务,在传输层才支持有连接服务(tcp)。
- OSI 模型
- 是国际标准化组织ISO提出的理论上的标准,并未在现实世界做到广泛运用
- 共分为7层(物联网舒会适用)
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
- 网络层和传输层都支持
有连接服务和无连接服务
关键区别:
- tcp/ip 是现实世界事实上的标准,而osi只是理论模型。
- tcp/ip模型合并了osi模型中的会话层,表示层,应用层为应用层。
- tcp/ip 网络层只支持无连接,传输层才支持有连接。osi的网络层和传输层 无连接和有连接都支持。
- 从输入URL到页面展示发生了什么?
答:
- URL解析及规划请求
- 浏览器判断是输入URL还是搜索关键词,若是输入关键词测则
触发搜索引擎查询 - 解析URL,分解URL中的协议
http/https, 域名www.baidu.com, 端口80/443,路径index.html等。对url进行解析后,浏览器会确定web服务器域名。
- 浏览器判断是输入URL还是搜索关键词,若是输入关键词测则
- DNS域名解析
- 查询缓存
- 浏览器缓存->系统缓存
hosts文件。
- 浏览器缓存->系统缓存
- 若缓存未查询到,则进行递归查询。
- 查询本地DNS服务器,根DNS服务器,顶级域DNS.com,权威DNS example.com
- 查询缓存
- 建立连接
- 三次握手建立TCP连接
- 现在大多数网站都使用HTTPS协议,它还需要额外做两点
- TLS握手,在TLS握手的时候需要
协商加密协议以及交换密钥。 - 需要验证CA链的可信度
- TLS握手,在TLS握手的时候需要
- 发送HTTP请求
- 服务器处理请求
- 反向代理,如NGINX处理负载均衡
- 应用服务器执行业务逻辑,查询数据库。
- 生成响应
- 浏览器解析与渲染
- HTTP请求报文和响应报文是怎样的,有哪些常见的字段?
HTTP请求报文和响应报文是HTTP协议通信的核心,它们遵循特定的格式,由 起始行、头部字段、空行和可选的消息主体组成。以下是它们的详细结构和常见字段:
一、HTTP请求报文格式
<方法> <请求URL> <HTTP版本>
<头部字段>
...
(空行)
<请求主体>(可选)
示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
(空行)
关键组成部分:
- 起始行:
- 方法:
GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)、HEAD(仅获取头部)等。 - 请求URL:目标资源的路径(如
/index.html)。 - HTTP版本:
HTTP/1.1或HTTP/2。
- 方法:
- 常见请求头部字段(客户端能处理的内容):
- 请求主体(要更新的数据):
- 用于
POST、PUT等方法,包含表单数据、JSON、文件等。
- 用于
二、HTTP响应报文格式
<HTTP版本> <状态码> <状态短语> // 状态行
<头部字段> // 状态头
...
(空行)
<响应主体>(可选)
示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: nginx
(空行)
<!DOCTYPE html>...
关键组成部分:
- 起始行:
- HTTP版本:
HTTP/1.1或HTTP/2。 - 状态码:三位数字代码(如
200)。 - 状态短语:状态码的文本描述(如
OK)。
- HTTP版本:
- 常见响应头部字段:
- 响应主体:
- HTML页面、JSON数据、图片等资源内容。
三、常用状态码速查
| 状态码 | 类别 | 常见示例 |
1xx | 信息性 | 100 Continue |
2xx | 成功 | 200 OK、201 Created |
3xx | 重定向 | 301 Moved Permanently、304 Not Modified |
4xx | 客户端错误 | 400 Bad Request、404 Not Found、403 Forbidden |
5xx | 服务器错误 | 500 Internal Server Error、503 Service Unavailable |
四、报文结构总结
| 部分 | 请求报文 | 响应报文 |
| 起始行 | GET /path HTTP/1.1 | HTTP/1.1 200 OK |
| 头部字段 | Host, User-Agent, Cookie | Content-Type, Server, Set-Cookie |
| 空行 | \r\n(必须存在) | \r\n(必须存在) |
| 主体 | POST数据、上传文件等 | HTML、JSON、文件内容等 |
五、实际应用场景
- 调试工具:使用浏览器开发者工具(F12 → Network 标签)或命令行工具(
curl -v URL)查看原始报文。 - API开发:RESTful API 依赖
Content-Type: application/json和状态码(如201 Created)。 - 安全相关:
CORS通过响应头Access-Control-Allow-Origin控制跨域访问。
理解这些报文结构和字段,是调试网络问题、开发Web应用或学习HTTP协议的基础!
- HTTP有哪些请求方式?
HTTP 请求方法(也称为 HTTP verbs)定义了客户端对服务器资源执行的操作类型。以下是主要的请求方法及其用途:
一、核心方法(RFC 7231 定义)
| 方法 | 作用 | 是否幂等 | 是否安全 | 典型应用场景 |
GET | 获取资源(**只读**) | ✓ | ✓ | 加载网页、查询数据 |
POST | 提交数据(**创建资源**或触发处理) | ✗ | ✗ | 表单提交、新增订单 |
PUT | 替换目标资源(全量更新) | ✓ | ✗ | 更新用户全部信息 |
DELETE | 删除资源 | ✓ | ✗ | 删除文件、订单 |
HEAD | 获取资源的**元数据**(响应头,无响应体) | ✓ | ✓ | 检查资源是否存在/是否被修改 |
OPTIONS | 查询服务器支持的**通信选项**(如允许的请求方法) | ✓ | ✓ | 跨域请求预检(CORS) |
PATCH | 部分更新资源(修改局部内容) | ✗ | ✗ | 更新用户邮箱(仅修改单个字段) |
关键概念解释:
- 幂等性:多次重复请求效果相同(如
GET重复执行仍返回相同数据)。- 安全性:不修改服务器资源(如
GET只读,DELETE不安全)。
二、扩展方法(其他协议或框架)
| 方法 | 用途 | 常见场景 |
CONNECT | 建立隧道(用于 HTTPS 代理) | 代理服务器转发 HTTPS 请求 |
TRACE | 回显请求(用于诊断,**存在安全风险**) | 网络调试(通常被禁用) |
LINK / UNLINK | 建立/移除资源关联(**已废弃**) | 旧版 HTTP(现用超媒体替代) |
三、方法特性对比
| 特性 | GET | POST | PUT | DELETE | PATCH |
| 可携带请求体 | ✗ | ✓ | ✓ | ✓ | ✓ |
| 缓存支持 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 浏览器历史记录保存 | ✓ | ✗ | ✗ | ✗ | ✗ |
| 表单支持 | ✓ | ✓ | ✗ | ✗ | ✗ |
四、实际使用示例
1. RESTful API 设计
GET /users → 获取用户列表
POST /users → 创建新用户
GET /users/{id} → 获取单个用户
PUT /users/{id} → 全量更新用户
PATCH /users/{id} → 部分更新用户(如修改密码)
DELETE /users/{id} → 删除用户
2. HTML 表单支持的方法
<form method="POST"> <!-- 仅支持 GET/POST -->
<input type="hidden" name="_method" value="PUT"> <!-- 框架(如 Rails)通过此字段模拟 PUT -->
</form>
五、常见问题
Q1: POST 和 PUT 的区别?
POST→ **创建新资源**(如提交订单,每次提交生成新订单号)。PUT→ **替换已有资源**(如更新用户 ID=123 的全部信息,多次调用结果不变)。
Q2: PUT 和 PATCH 的区别?
PUT:更新**整个资源**(需提交完整字段)。PATCH:更新**部分字段**(只需提交需修改的字段)。
Q3: 为什么 OPTIONS 方法用于跨域?
- 浏览器在发送跨域请求前,自动发起
OPTIONS预检请求,检查服务器是否允许实际请求的方法(如DELETE)。
六、状态码与方法匹配
| 方法 | 成功状态码 | 错误状态码 |
GET | 200 OK | 404 Not Found |
POST | 201 Created | 400 Bad Request |
PUT | 200 OK 或 204 No Content | 409 Conflict |
DELETE | 204 No Content | 403 Forbidden |
掌握这些方法是理解 RESTful API 设计 和 Web 开发 的基础!
- GET请求和POST请求的区别
- get请求时用于获取数据,post请求用于提交数据
- get请求多次重复请求获取的是一样的数据,所以它具有幂等性。post请求每次提交的数据不一样,不具有幂等性。
- get请求将参数放在url之后,post请求将参数放在请求体中。
- 正因为get请求将参数放在url中,所以get请求的安全性更低;post请求将参数放在请求体重,post请求的安全性更高。
- get请求受到url的长度限制,post请求理论上无限制。
- get请求可以被缓存,post请求不能被缓存。
- HTTP中常见的状态码有哪些?
2xx表示成功- 200 表示客户端请求成功。
- 201 表示创建了新资源。
- 204 表示无内容,服务器成功处理请求,但是无内容。
3xx表示重定向- 301 表示永久重定向。
- 302 表示临时重定向。
- 304 表示请求的内容未被修改过,服务器返回时使用缓存。
4xx表示客户端错误- 401 表示请求需要身份验证。
- 403 表示请求的对应资源禁止访问。
- 404 表示服务器无法找到对应资源。
5xx表示服务端错误- 500 表示服务器内部错误。
- 503 表示服务不可用。
- HTTP中,什么是强缓存和协商缓存?
强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。
- 强缓存:客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。
Expires强缓存:设置一个强缓存时间,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的Expires字段的时间做比较来判断是否需要对服务器发起请求。这里有一个巨大的漏洞:“如果我本地时间不准咋办?”所以目前已经被废弃了。Cache-Control强缓存:目前使用的强缓存是通过HTTP响应头中的Cache-Control字段实现,通过max-age(如3600s)来告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。
- 协商缓存:当强缓存失效时,浏览器会发送请求到服务器,通过
ETag或Last-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器返回304 Not Modified状态码,告知浏览器使用本地缓存;如果资源已修改,则返回新的资源,浏览器更新本地缓存。这种方式需要与服务器通信,但可以确保用户总是获取最新的内容。
- HTTP1.0和HTTP1.1的区别
持久连接: 最大区别是:http 1.0 使用短连接,http1.1 使用长连接。当客户端和服务端要交换不止一次资源的时候,比如我们要访问一个网页,需要获取多个资源的时候,就会发送多个get请求。1.0需要建立多个连接,而1.1只需建立一次连接,节省了建立连接的性能消耗。管道传输: http 1.1 支持管道网络传输。不需要等到第一个请求结束即可发送第二个请求。这同时也会带来一些问题,服务端需要按照接收请求报文的顺序做出响应,若请求报文丢失,则可能造成响应队头阻塞。新增状态码: 比如100 continue,丰富了状态信息。如206 partial content,资源只返回了请求所需求的一部分。而http 1.0中不允许这样,只能获取整个资源,这会造成带宽的浪费。缓存控制: http1.0主要使用If-Modified-Since和Expires, 而http1.1则引入了更多的缓存控制策略如Etag和If-None-Match。Host头: http 1.1 引入了host头,允许客户端指定请求的主机名,这使得在同一台主机上托管多个域名成为可能。
- HTTP2.0与HTTP1.1的区别?
二进制协议: http2.0 使用二进制传输,1.1使用文本传输。多路复用: 支持多路复用,允许单个连接上并行交错发送多个请求和响应,解决了1.1的队头阻塞问题。头部压缩:引入HPACK压缩算法,对请求和响应的头部信息进行压缩,减少了冗余信息的传输。服务器推送:允许服务器主动推送数据给客户端,减少页面加载时间优先级和依赖: 允许客户端为请求设立优先级。
- HTTP3.0有了解过吗?
QUIC协议:http 3.0 最大的特点是放弃了TCP协议,转而使用基于UDP的QUIC协议。避免了TCP队头阻塞问题。- 默认使用
TLS。 0-RTT与1-RTT快速握手:通过集成TLS 1.3,首次连接仅需1次往返(1-RTT),重复连接可实现0-RTT(无需握手),显著提升页面加载速度.- 多路复用与流隔离:
- 每个HTTP请求/响应被分配独立的流(Stream),流间数据互不阻塞,即使某条流丢包也不影响其他流。
- 对比HTTP/2的多路复用仍受限于TCP单一路径。
连接迁移能力
- https和http有哪些区别?
tls:http是明文传输,而https在http的基础上新增了加密层,确保数据传输的安全性连接建立: http建立连接相对简单,TCP三次握手后便可进行http的报文传输。而https在三次握手后还需进行tls的握手。端口: http端口使用80,https端口使用443端口。证书: https需要向CA申请证书,以确保服务器身份可信。
- https的工作原理(https建立连接的过程)
- 非对称加密用于初始化
- 对称加密用于传输(快速高效)
- 随机数保证新鲜性,
Client Random和Server Random确保每次会话生成的密钥都是唯一的,防止重放攻击。 - 证书保证身份
- tcp和udp的区别
- tcp和udp的区别
- tcp保证在不可信的网络世界中做到可信的交付,udp不保证交付
- 为了做到可信的交付,tcp采用了多种机制,
- 首先是面向连接,传输数据前必须通过三次握手建立连接。
- 其次是拥塞控制,具有复杂的拥塞控制算法,会在网络拥堵时主动降低发送速率。
- 通过序列号机制保证接收方收到的数据是有序的。
- 基于字节流,而udp基于数据报。
- tcp应用场景:网页浏览,文件传输,电子邮件,远程登录。
- udp应用场景:视频流媒体,语音通话,在线游戏。
- tcp连接如何确保可靠性
- 序列号:每个TCP端都维护序列号,确保数据包的顺序正确
- 确认应答:接收方发送ack确认应答消息,表示确认收到数据,如果发送方在一定时间内没有收到确认,就会重新发送数据
- 超时重传:发送方在发送数据时会设置一个定时器,在定时器超时之前,发送方没有收到确认消息,会重新发送数据。
- 流量控制:滑动窗口机制确保接收方能处理发送方的数据
- 拥塞控制:控制发送速率,通过慢启动,拥塞控制,快重传,快恢复等控制数据发送速率
- tcp为什么是三次握手,而不是两次或者四次
- 三次握手可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
历史连接:比如在网络阻塞的场景,客户端发送一个syn之后挂掉,这个syn由于网络阻塞没有到服务端。

如果是两次握手连接,就无法阻止历史连接。因为两次握手的情况下,服务端没有中间状态来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。






