type
status
date
slug
summary
tags
category
icon
password
记录一些计网的面经知识点
GET 和 POST 请求的区别
- 应用场景:
GET
:用于幂等请求,一般用于对服务器资源不会产生影响的场景,如请求网页资源。POST
:用于非幂等请求,一般用于对服务器资源产生影响的场景,如用户注册。
- 是否缓存:浏览器一般会缓存
GET
请求,而不会缓存POST
请求。
- 报文格式:
GET
请求的报文中实体部分为空。POST
请求的报文中实体部分通常为向服务器发送的数据。
- 安全性:
GET
请求的参数可以放入 URL 中,因而相对不安全,因为 URL 会保留在历史记录中。
- 请求长度:浏览器对 URL 长度有限制,影响
GET
请求的长度。这个限制是浏览器规定的,并非 RFC 规定的。
- 参数类型:
POST
请求支持更多的数据类型。
POST 和 PUT 请求的区别
PUT
请求向服务器发送数据以修改数据内容,不会增加数据种类。即无论发送多少次PUT
请求,数据种类不会改变(可以理解为更新数据)。
POST
请求向服务器发送数据,并且会改变数据种类或创建新的内容(可以理解为创建数据)。
常见的 HTTP 请求头和响应头
HTTP Request Header 常见的请求头:
Accept
:浏览器能够处理的内容类型。
Accept-Charset
:浏览器能够显示的字符集。
Accept-Encoding
:浏览器能够处理的压缩编码。
Accept-Language
:浏览器当前设置的语言。
Connection
:浏览器与服务器之间连接的类型。
Cookie
:当前页面设置的任何 Cookie。
Host
:发出请求的页面所在的域。
Referer
:发出请求的页面的 URL。
User-Agent
:浏览器的用户代理字符串。
HTTP Responses Header 常见的响应头:
Date
:表示消息发送的时间,时间的描述格式由 RFC 822 定义。
Server
:服务器名称。
Connection
:浏览器与服务器之间连接的类型。
Cache-Control
:控制 HTTP 缓存。
Content-Type
:表示后面的文档属于什么 MIME 类型。
常见的
Content-Type
类型:application/x-www-form-urlencoded
:浏览器的原生 form 表单。
multipart/form-data
:常见的POST
提交方式,通常表单上传文件时使用。
application/json
:服务器消息主体是序列化后的 JSON 字符串。
text/xml
:提交 XML 格式的数据。
常见的 HTTP 请求方法
GET
:向服务器获取数据。
POST
:将实体提交到指定的资源,通常会造成服务器资源的修改。
PUT
:上传文件,更新数据。
DELETE
:删除服务器上的对象。
HEAD
:获取报文首部,与GET
相比,不返回报文主体部分。
OPTIONS
:询问支持的请求方法,用来跨域请求。
CONNECT
:要求在与代理服务器通信时建立隧道,使用隧道进行 TCP 通信。
TRACE
:回显服务器收到的请求,主要用于测试或诊断。
HTTP 1.1 和 HTTP 2.0 的区别
- 二进制协议:
HTTP/2
是一个二进制协议,头信息和数据体都是二进制,统称为“帧”,分为头信息帧和数据帧。帧是实现多路复用的基础。
- 多路复用:
HTTP/2
实现了多路复用,客户端和服务器可以同时发送多个请求和回应,且不用按顺序发送,避免了“队头堵塞”的问题。
- 数据流:
HTTP/2
使用了数据流的概念,不按顺序发送数据包。每个请求或回应的数据包统称为一个数据流,并有独立编号,用来区分数据流。
- 头信息压缩:
HTTP/2
实现了头信息压缩。头信息使用gzip
或compress
压缩,并且客户端和服务器共同维护一张头信息表,字段存入表中,生成索引号。以后不发送同样字段,只发送索引号,以提高速度。
- 服务器推送:
HTTP/2
允许服务器未经请求,主动向客户端推送资源,减少延迟时间。注意HTTP/2
推送的都是静态资源,不同于WebSocket
或使用SSE
方法推送即时数据。
HTTP 和 HTTPS 协议的区别
- CA 证书:HTTPS 协议需要 CA 证书,费用较高;而 HTTP 协议不需要。
- 传输方式:HTTP 协议是超文本传输协议,信息以明文传输;HTTPS 则是 SSL 加密传输协议,更加安全。
- 连接和端口:HTTP 协议使用的端口是 80,HTTPS 协议使用的端口是 443。
- 状态:HTTP 协议连接简单,是无状态的;HTTPS 协议由 SSL 和 HTTP 协议构建,可进行加密传输和身份认证。
HTTP2 的头部压缩算法
HTTP/2 的头部压缩是 HPACK 算法。在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,采用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。
HTTP 3.0
HTTP/3
基于 UDP 协议,实现了类似于 TCP 的多路复用数据流、传输可靠性等功能,这套功能称为 QUIC 协议。- 流量控制与传输可靠性:QUIC 在 UDP 的基础上增加了一层来保证数据传输的可靠性,提供数据包重传、拥塞控制及其他 TCP 特性。
- 集成 TLS 加密功能:QUIC 使用 TLS 1.3,减少了握手所需的 RTT 数。
- 多路复用:同一物理连接上可有多个独立的逻辑数据流,实现数据流的单独传输,解决 TCP 的队头阻塞问题。
- 快速握手:基于 UDP,可使用 0 ~ 1 个 RTT 来建立连接。
HTTPS 协议
- HTTPS(Hypertext Transfer Protocol Secure) 是一种通过计算机网络进行安全通信的传输协议。它通过 HTTP 进行通信,利用 SSL/TLS 来加密数据包。
- HTTPS 的主要目的是为网站服务器提供身份认证,保护交换数据的隐私与完整性。
- 相比于采用明文传输的 HTTP 协议,HTTPS 使用 TLS/SSL 来进行身份验证、信息加密和完整性校验,从而避免信息窃听、篡改和劫持的风险。
- 安全层的主要职责是对发起的 HTTP 请求的数据进行加密操作,并对接收到的 HTTP 内容进行解密操作。
HTTPS 通信(握手)过程
- 客户端请求:客户端向服务器发起请求,请求中包含协议版本号、生成的随机数及客户端支持的加密方法。
- 服务器响应:服务器接收到请求后,确认加密方法,提供服务器证书及生成的随机数。
- 客户端验证:客户端确认服务器证书有效后,生成新的随机数,使用数字证书中的公钥加密随机数并发送给服务器,同时提供前面所有内容的哈希值供服务器检验。
- 服务器解密:服务器使用私钥解密客户端发送的随机数,并提供前面内容的哈希值供客户端检验。
- 建立对话秘钥:客户端和服务器根据约定的加密方法使用三个随机数生成对话秘钥,后续对话过程使用该秘钥加密信息。
DNS 完整的查询过程
- 浏览器缓存查询:首先会在浏览器的缓存中查找对应的 IP 地址,如果找到,直接返回结果;若未找到,继续下一步。
- 本地 DNS 查询:将请求发送给本地 DNS 服务器,在本地域名服务器缓存中查询,如果找到结果,则返回;若未找到,继续下一步。
- 根域名服务器查询:本地 DNS 服务器向根域名服务器发送请求,根域名服务器返回所查询域的顶级域名服务器地址。
- 顶级域名服务器查询:本地 DNS 服务器向顶级域名服务器发送请求,接收请求的服务器查询自己的缓存,若有记录,则返回查询结果;若无记录,则返回相关下一级的权威域名服务器的地址。
- 权威域名服务器查询:本地 DNS 服务器向权威域名服务器发送请求,权威域名服务器返回对应的结果。
- 缓存结果:本地 DNS 服务器将返回结果保存在缓存中,以便下次使用。
- 返回结果:本地 DNS 服务器将最终结果返回给浏览器。
例如,要查询
www.baidu.com
的 IP 地址,首先在浏览器的缓存中查找该域名的缓存,若不存在,则将请求发送到本地 DNS 服务器。本地 DNS 服务器查询缓存是否存在该域名的记录,若不存在,则向根域名服务器发送请求,获取负责 .com
的顶级域名服务器 IP 地址列表。接着,本地 DNS 服务器向顶级域名服务器发送请求,获取负责 .baidu
的权威域名服务器 IP 地址列表。最后,本地 DNS 服务器向权威域名服务器发送请求,获取 www.baidu.com
对应的 IP 地址列表。OSI 七层模型
OS参考模型 | 各层的解释 |
应用层 | 为应用程序提供服务 |
表示层 | 数据格式转化、数据加密 |
会话层 | 建立、管理和维护会话 |
传输层 | 建立、管理和维护端到端的连接 |
网络层 | IP选址及路由选择 |
数据链路层 | 提供介质访问和链路管理 |
物理层 | 物理层 |
简记:
- 物联网淑慧实用
- 应用表示会传输,网络数据链路无(物)
TCP 的三次握手和四次挥手
三次握手
第一次握手:SYN
- 客户端向服务器发送一个SYN(Synchronize Sequence Number)报文,表示希望建立连接,并发送一个初始序列号
seq=x
。
第二次握手:SYN-ACK
- 服务器收到SYN报文后,确认收到了客户端的请求,并向客户端发送一个SYN-ACK(SYN acknowledgment)报文。这个报文包含服务器的初始序列号
seq=y
,并对客户端的SYN报文进行确认ack=x+1
。
第三次握手:ACK
- 客户端收到SYN-ACK报文后,向服务器发送一个ACK(Acknowledgment)报文,确认服务器的SYN报文
ack=y+1
,并且开始传输数据。此时,TCP连接建立完成。
三次握手:
- A:是B吗?我要跟你通信,听得到我说话吗?
- B:可以通信,你听得到我说话吗?
- A:我也听得到。
四次挥手
第一次挥手:FIN
- 客户端向服务器发送一个FIN(Finish)报文,表示客户端不再发送数据,但可以继续接收数据,并请求关闭连接。此时,客户端进入
FIN_WAIT_1
状态。
第二次挥手:ACK
- 服务器收到FIN报文后,向客户端发送一个ACK报文,确认已收到客户端的请求,并表示自己还有数据要发送。客户端收到ACK报文后进入
FIN_WAIT_2
状态。
第三次挥手:FIN
- 服务器向客户端发送一个FIN报文,表示服务器的数据已经发送完毕,并请求关闭连接。此时,服务器进入
CLOSE_WAIT
状态。
第四次挥手:ACK
- 客户端收到FIN报文后,向服务器发送一个ACK报文,确认已收到服务器的FIN报文,并进入
TIME_WAIT
状态,等待一段时间以确保服务器收到ACK报文后,再彻底关闭连接。服务器收到ACK报文后关闭连接,客户端在等待时间结束后也关闭连接。
四次挥手:
- A:呼叫B,我要跟你断开。
- B:知道了,等一下我还有话没说完
- B:我说完了,可以断开了
- A:好的