网络相关知识
本文最后更新于 218 天前,其中的信息可能已经有所发展或是发生改变。
  1. 介绍一下 TCP/IP 模型和 OSI 模型的区别?

答:

  1. TCP/IP 模型
    1. 是如今现实世界被广泛使用的网络通信模型,是事实上的标准
    2. 从底层到顶层分别为5层
      1. 物理层:负责比特流在物理介质上的传输
      2. 数据链路层:负责同一物理网络内 设备之间到端的传输
      3. 网络层:核心是ip寻址和路由,负责主机到主机的逻辑寻址和路由选择
      4. 传输层:保证端到端的数据传输
        1. tcp有连接服务,在一个不可信的网络世界中提供了一个可信的流传输机制
        2. udp:无连接服务,不可靠传输,用于可容许少量丢包的场景。
      5. 应用层:面向用户的接口,为用户和应用提供服务。
    3. tcp/ip模型,在网络层只提供无连接服务,在传输层才支持有连接服务(tcp)。
  2. OSI 模型
    1. 是国际标准化组织ISO提出的理论上的标准,并未在现实世界做到广泛运用
    2. 共分为7层(物联网舒会适用)
      1. 物理层
      2. 数据链路层
      3. 网络层
      4. 传输层
      5. 会话层
      6. 表示层
      7. 应用层
    3. 网络层和传输层都支持有连接服务无连接服务

关键区别:

  1. tcp/ip 是现实世界事实上的标准,而osi只是理论模型。
  2. tcp/ip模型合并了osi模型中的会话层,表示层,应用层为应用层。
  3. tcp/ip 网络层只支持无连接,传输层才支持有连接。osi的网络层和传输层 无连接和有连接都支持。
  4. 从输入URL到页面展示发生了什么?

答:

  1. URL解析及规划请求
    1. 浏览器判断是输入URL还是搜索关键词,若是输入关键词测则触发搜索引擎查询
    2. 解析URL,分解URL中的协议http/https, 域名www.baidu.com, 端口80/443,路径index.html等。对url进行解析后,浏览器会确定web服务器域名。
  2. DNS域名解析
    1. 查询缓存
      • 浏览器缓存->系统缓存hosts文件
    2. 若缓存未查询到,则进行递归查询。
      • 查询本地DNS服务器,根DNS服务器,顶级域DNS.com,权威DNS example.com
  3. 建立连接
    1. 三次握手建立TCP连接
    2. 现在大多数网站都使用HTTPS协议,它还需要额外做两点
      • TLS握手,在TLS握手的时候需要协商加密协议以及交换密钥
      • 需要验证CA链的可信度
  4. 发送HTTP请求
  5. 服务器处理请求
    1. 反向代理,如NGINX处理负载均衡
    2. 应用服务器执行业务逻辑,查询数据库。
    3. 生成响应
  6. 浏览器解析与渲染
  1. 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
(空行)

关键组成部分:

  1. 起始行
    1. 方法GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)、HEAD(仅获取头部)等。
    2. 请求URL:目标资源的路径(如 /index.html)。
    3. HTTP版本HTTP/1.1HTTP/2
  1. 常见请求头部字段(客户端能处理的内容)
  1. 请求主体(要更新的数据)
    1. 用于 POSTPUT 等方法,包含表单数据、JSON、文件等。

二、HTTP响应报文格式

<HTTP版本> <状态码> <状态短语> // 状态行
<头部字段>    // 状态头
...
(空行)
<响应主体>(可选)

示例:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: nginx
(空行)
<!DOCTYPE html>...

关键组成部分:

  1. 起始行
    1. HTTP版本HTTP/1.1HTTP/2
    2. 状态码:三位数字代码(如 200)。
    3. 状态短语:状态码的文本描述(如 OK)。
  1. 常见响应头部字段
  1. 响应主体
    1. HTML页面、JSON数据、图片等资源内容。

三、常用状态码速查

状态码类别常见示例
1xx信息性100 Continue
2xx成功200 OK201 Created
3xx重定向301 Moved Permanently304 Not Modified
4xx客户端错误400 Bad Request404 Not Found403 Forbidden
5xx服务器错误500 Internal Server Error503 Service Unavailable

四、报文结构总结

部分请求报文响应报文
起始行GET /path HTTP/1.1HTTP/1.1 200 OK
头部字段Host, User-Agent, CookieContent-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协议的基础!

  1. HTTP有哪些请求方式?

HTTP 请求方法(也称为 HTTP verbs)定义了客户端对服务器资源执行的操作类型。以下是主要的请求方法及其用途:


一、核心方法(RFC 7231 定义)

方法作用是否幂等是否安全典型应用场景
GET获取资源(**只读**)加载网页、查询数据
POST提交数据(**创建资源**或触发处理)表单提交、新增订单
PUT替换目标资源(全量更新)更新用户全部信息
DELETE删除资源删除文件、订单
HEAD获取资源的**元数据**(响应头,无响应体)检查资源是否存在/是否被修改
OPTIONS查询服务器支持的**通信选项**(如允许的请求方法)跨域请求预检(CORS)
PATCH部分更新资源(修改局部内容)更新用户邮箱(仅修改单个字段)

关键概念解释

  • 幂等性:多次重复请求效果相同(如 GET 重复执行仍返回相同数据)。
  • 安全性:不修改服务器资源(如 GET 只读,DELETE 不安全)。

二、扩展方法(其他协议或框架)

方法用途常见场景
CONNECT建立隧道(用于 HTTPS 代理)代理服务器转发 HTTPS 请求
TRACE回显请求(用于诊断,**存在安全风险**)网络调试(通常被禁用)
LINK / UNLINK建立/移除资源关联(**已废弃**)旧版 HTTP(现用超媒体替代)

三、方法特性对比

特性GETPOSTPUTDELETEPATCH
可携带请求体
缓存支持
浏览器历史记录保存
表单支持

四、实际使用示例

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)。

六、状态码与方法匹配

方法成功状态码错误状态码
GET200 OK404 Not Found
POST201 Created400 Bad Request
PUT200 OK204 No Content409 Conflict
DELETE204 No Content403 Forbidden

掌握这些方法是理解 RESTful API 设计Web 开发 的基础!

  1. GET请求和POST请求的区别
  1. get请求时用于获取数据,post请求用于提交数据
  2. get请求多次重复请求获取的是一样的数据,所以它具有幂等性。post请求每次提交的数据不一样,不具有幂等性。
  3. get请求将参数放在url之后,post请求将参数放在请求体中。
  4. 正因为get请求将参数放在url中,所以get请求的安全性更低;post请求将参数放在请求体重,post请求的安全性更高。
  5. get请求受到url的长度限制,post请求理论上无限制。
  6. get请求可以被缓存,post请求不能被缓存。
  1. HTTP中常见的状态码有哪些?
  1. 2xx 表示成功
    1. 200 表示客户端请求成功。
    2. 201 表示创建了新资源。
    3. 204 表示无内容,服务器成功处理请求,但是无内容。
  2. 3xx 表示重定向
    1. 301 表示永久重定向。
    2. 302 表示临时重定向。
    3. 304 表示请求的内容未被修改过,服务器返回时使用缓存。
  3. 4xx 表示客户端错误
    1. 401 表示请求需要身份验证。
    2. 403 表示请求的对应资源禁止访问。
    3. 404 表示服务器无法找到对应资源。
  4. 5xx 表示服务端错误
    1. 500 表示服务器内部错误。
    2. 503 表示服务不可用。
  1. HTTP中,什么是强缓存和协商缓存?

强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。

  1. 强缓存:客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。
  • Expires强缓存:设置一个强缓存时间,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的Expires字段的时间做比较来判断是否需要对服务器发起请求。这里有一个巨大的漏洞:“如果我本地时间不准咋办?”所以目前已经被废弃了。
  • Cache-Control强缓存:目前使用的强缓存是通过HTTP响应头中的Cache-Control字段实现,通过max-age(如3600s)来告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。
  1. 协商缓存:当强缓存失效时,浏览器会发送请求到服务器,通过ETagLast-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器返回304 Not Modified状态码,告知浏览器使用本地缓存;如果资源已修改,则返回新的资源,浏览器更新本地缓存。这种方式需要与服务器通信,但可以确保用户总是获取最新的内容。
  1. HTTP1.0和HTTP1.1的区别
  1. 持久连接: 最大区别是:http 1.0 使用短连接,http1.1 使用长连接。当客户端和服务端要交换不止一次资源的时候,比如我们要访问一个网页,需要获取多个资源的时候,就会发送多个get请求。1.0需要建立多个连接,而1.1只需建立一次连接,节省了建立连接的性能消耗。
  2. 管道传输: http 1.1 支持管道网络传输。不需要等到第一个请求结束即可发送第二个请求。这同时也会带来一些问题,服务端需要按照接收请求报文的顺序做出响应,若请求报文丢失,则可能造成响应队头阻塞。
  3. 新增状态码: 比如 100 continue,丰富了状态信息。如 206 partial content,资源只返回了请求所需求的一部分。而http 1.0中不允许这样,只能获取整个资源,这会造成带宽的浪费。
  4. 缓存控制: http1.0主要使用If-Modified-SinceExpires, 而http1.1则引入了更多的缓存控制策略如EtagIf-None-Match
  5. Host头: http 1.1 引入了host头,允许客户端指定请求的主机名,这使得在同一台主机上托管多个域名成为可能。
  1. HTTP2.0与HTTP1.1的区别?
  1. 二进制协议: http2.0 使用二进制传输,1.1使用文本传输。
  2. 多路复用: 支持多路复用,允许单个连接上并行交错发送多个请求和响应,解决了1.1的队头阻塞问题。
  3. 头部压缩:引入HPACK压缩算法,对请求和响应的头部信息进行压缩,减少了冗余信息的传输。
  4. 服务器推送:允许服务器主动推送数据给客户端,减少页面加载时间
  5. 优先级和依赖: 允许客户端为请求设立优先级。
  1. HTTP3.0有了解过吗?
  1. QUIC 协议:http 3.0 最大的特点是放弃了TCP协议,转而使用基于UDP的QUIC协议。避免了TCP队头阻塞问题。
  2. 默认使用TLS
  3. 0-RTT与1-RTT快速握手:通过集成TLS 1.3,首次连接仅需1次往返(1-RTT),重复连接可实现0-RTT(无需握手),显著提升页面加载速度.
  4. 多路复用与流隔离:
    1. 每个HTTP请求/响应被分配独立的流(Stream),流间数据互不阻塞,即使某条流丢包也不影响其他流。
    2. 对比HTTP/2的多路复用仍受限于TCP单一路径。
  5. 连接迁移能力
  1. https和http有哪些区别?
  1. tls:http是明文传输,而https在http的基础上新增了加密层,确保数据传输的安全性
  2. 连接建立: http建立连接相对简单,TCP三次握手后便可进行http的报文传输。而https在三次握手后还需进行tls的握手。
  3. 端口: http端口使用80,https端口使用443端口。
  4. 证书: https需要向CA申请证书,以确保服务器身份可信。
  1. https的工作原理(https建立连接的过程)
  1. 非对称加密用于初始化
  2. 对称加密用于传输(快速高效)
  3. 随机数保证新鲜性, Client RandomServer Random 确保每次会话生成的密钥都是唯一的,防止重放攻击。
  4. 证书保证身份
  1. tcp和udp的区别
  1. tcp和udp的区别
  1. tcp保证在不可信的网络世界中做到可信的交付,udp不保证交付
  2. 为了做到可信的交付,tcp采用了多种机制,
    1. 首先是面向连接,传输数据前必须通过三次握手建立连接。
    2. 其次是拥塞控制,具有复杂的拥塞控制算法,会在网络拥堵时主动降低发送速率。
    3. 通过序列号机制保证接收方收到的数据是有序的。
    4. 基于字节流,而udp基于数据报。
  3. tcp应用场景:网页浏览,文件传输,电子邮件,远程登录。
  4. udp应用场景:视频流媒体,语音通话,在线游戏。
  1. tcp连接如何确保可靠性
  1. 序列号:每个TCP端都维护序列号,确保数据包的顺序正确
  2. 确认应答:接收方发送ack确认应答消息,表示确认收到数据,如果发送方在一定时间内没有收到确认,就会重新发送数据
  3. 超时重传:发送方在发送数据时会设置一个定时器,在定时器超时之前,发送方没有收到确认消息,会重新发送数据。
  4. 流量控制:滑动窗口机制确保接收方能处理发送方的数据
  5. 拥塞控制:控制发送速率,通过慢启动,拥塞控制,快重传,快恢复等控制数据发送速率
  1. tcp为什么是三次握手,而不是两次或者四次
  • 三次握手可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

历史连接:比如在网络阻塞的场景,客户端发送一个syn之后挂掉,这个syn由于网络阻塞没有到服务端。

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇