面试系列文章
GET和POST的请求的区别
- 传递的参数不同,
POST
传递的参数在request body
中,GET
传递的参数在url
后拼接 GET
请求一般用于查询,POST
一般用于提交某种信息进行某些修改操作POST
相对GET
请求安全GET
请求会被浏览器主动缓存,POST
不会,要手动设置GET
请求长度有限制,POST
没有
POST和PUT请求的区别
PUT
请求为更新数据POST
为创建数据
HTTP 1.1 和 HTTP 2.0 的区别
- 二进制协议 :
HTTP1.1
的解析是基于文本,而HTTP2
使用二进制,将请求和响应分割为更小的帧,从而实现多路复用。 - 多路复用 :在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样避免了
HTTP
队头阻塞,但是TCP
的队头阻塞依旧存在。- HTTP队头阻塞
- TCP队头阻塞
- 头部信息压缩 :由于
HTTP1.1
每次请求都会带上所有信息,比如Cookie
,这样会很浪费性能,HTTP2
引入头部压缩,一方面将头部信息使用gzip压缩后再发送,另一方面客户端和服务器同时维护一张头部信息表,所有字段都会存入这张表,生成索引,只发送索引就可以。 - 服务器推送 :
HTTP2
允许服务器向客户端主动发送资源,只限于静态资源如css
,img
等
HTTP队头堵塞
在HTTP/1.1
中,默认情况下,浏览器对同一域名下的并发连接数有限制(通常为6-8个),这意味着浏览器同一时间最多只能与服务器建立6-8个连接。同时,在同一连接中,请求和响应是按照顺序处理的,也就是说,一个请求需要等待前面的请求响应完成后才能开始处理。如果前面的请求处理时间较长,后续请求就必须等待,从而导致队头阻塞。
总结:HTTP
队头堵塞是指在同一域名下浏览器的连接数有限制,并且请求要在连接内按顺序处理,这样就会导致某个请求的延迟或阻塞会影响后续请求的处理。
TCP队头阻塞
在一个TCP
连接中,如果某个数据包在传输过程中失误或者丢失,那么在这个数据包后发送的所有数据都需要等待,直到该数据被重新传输 。这种情况会导致接收方在TCP
缓冲区中,后续的数据包被阻塞在错误数据包之后,无法继续处理,即被堵塞在队头
总结:TCP
协议为了保证数据包的有序传输 ,如果一个数据包在丢失损坏后,TCP
接受端会要求重新发送该数据包,直到被正确接收为止。
HTTP和HTTPS协议的区别
HTTPS
需要CA证书,HTTP
不需要HTTP
是明文传输,不安全。而HTTPS
基于SSL
进行加密,相对安全。HTTP
端口为80
,HTTPS
端口443
对HTTP请求中的keep-alive有了解吗
在HTTP
协议中keep-valie
是一种长连接。
在HTTP1.0
中默认是每次请求/应答,客户端和服务器都会建立一次连接,请求完成后立即断开,这种是短连接 。当使用keep-alive
后,客户端和服务端的连接持续有效,后续的请求就会避免重复建立连接,减少服务器负担降低延迟,这种就是长连接。
使用方式就是通过在HTTP
请求头中添加Connection: keep-alive
字段,服务端会在响应头中添加Connection: keep-alive
字段通知客户端长连接已经建立。
在HTTP1.1
默认开启了长连接,除非在请求或响应头中明确关闭它。在HTTP2
中使用了多路复用,允许在同一个连接上处理多个请求和相应,取代了keep-alive
机制。
三次握手和四次挥手
字段理解
- seq 序列号 随机数
seq = x
每次连接都会携带一个自己的随机序列号 - ack 确认号
ack = seq + 1
确认上一次收到了序列号 除了第一次连接都会携带 - ACK 确认收到序列号
ACK = 1
除了第一次连接都会携带 - SYN 发起一个新连接
SYN = 1
- FIN 释放一个连接
FIN = 1
三次握手
指建立一个TCP
连接时,需要客户端和服务器总共发送3个包,主要作用是为了确认双方接受和发放能力是否正常。
初始化 客户端处于Closed
状态,服务端处于 Listen
状态
- 第一次握手 客户端给服务器发送一个TCP报文【向服务器请求连接】
- SYN = 1 建立一个新链接
- seq = x 随机序列号
- 此时客户端处理SYN-SEND状态
- 第二次握手 服务器接收到
SYN
报文后,回复浏览器 【同意连接】- SYN = 1 同意建立一个新链接
- ACK = 1 确认收到序列号
- seq = y 随机序列号
- ack = x + 1 确认收到序列号是x
- 服务端进入 SYN-REVD阶段
- 第三次握手 浏览器收到报文后回复服务器 【收到回复】
- ACK = 1 确认收到序列号
- seq = x + 1 上一次浏览器发 送的
seq = x
基础上+ 1
- ack = y + 1 确认收到的序列号是服务器 回复的
y
- 服务器和浏览器同时进入 ESTABLISHED 状态
- 此时双方连接已建立,开始传送数据
那为什么要三次握手呢?两次不行吗? 为了确认双方的接收能力和发送能力都正常。服务端在发送完SYN
报文后,客户端需要回复一个ACK
告诉服务的确认有效。
四次挥手
刚开始双方都处于 ESTABLISHED 状态
- 第一次挥手 向服务器发送报文
FIN = 1
关闭连接seq = u
随机序列号- 浏览器进入
FIN-WAIT-1
半关闭阶段
- 第二次挥手 服务器收到报文后,知道浏览器要断开链接,开始处理内部操作
ACK = 1
确认收到序列号ack = u + 1
确认收到序列号为u
seq = v
随机序列号- 服务器进入
COLSE-WAIT
处理阶段 - 浏览器进入
FIN-WAIT-2
阶段 等待服务器处理
- 第三次挥手 服务器处理完毕 回复浏览器
FIN = 1
关闭连接ACK = 1
确认收到序列号ack = u + 1
确认收到序列号为u
seq = w
随机序列号- 服务器进入
LAST-ACK
阶段 等待浏览器确认收到
- 第四次挥手 浏览器收到服务器报文 回复服务器
ACK = 1
seq = u + 1
acl = w + 1
- 浏览器进入
TIME-WAIT
阶段,此时TCP
未释放掉,等待2MSL
(毫秒),等待服务器收到自己的报文,然后进入COLSE
阶段
为什么是四次 客户端发送FIN
报文后,表示客户端当前没有数据需要处理,而不代表服务端没有数据需要处理。此时需要服务端回复ACK
确认收到报文后,开始处理内部数据。当内部数据处理完后,再回复FIN
可以关闭连接
当在浏览器中输入 URL 并且按下回车之后发生了什么?
- URL解析,判断URL是否符合规范
- 浏览器判断缓存,判断请求都资源是否有缓存,如果有就不需要向服务器发送新的请求
- DNS解析,获取目标服务器ip
- 建立TCP连接(三次握手)
- 发送HTTP请求
- 服务器处理,返回数据
- 浏览器解析渲染页面
- TCP连接关闭(四次挥手)
什么是HTTPS协议?如何加密的?
超文本传输安全协议(Hypertext Transfer Protocol Secure,简称:HTTPS) HTTPS
在HTTP
层和tcp
层中间加了一个SSL/TLS安全层 ,进行加密,避免了HTTP
协议存在的信息窃听,信息劫持等风险。
由于HTTP
协议采用明文传输信息 ,很容易被窃听、篡改、劫持 。而HTTPS
增加的TLS/SSL
层可以对身份进行验证 、信息加密解密 功能,避免这种问题发生。安全层的主要职责就是对发起的HTTP
的数据进行加密解密操作。
安全层依赖于三个算法:
- 对称加密: 用一个密钥加密数据,加密后也可以对其解密。存在安全风险,容易被劫持
- 非对称加密:一个公钥一个私,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。
- 如果公钥是一开始通过明文传输给浏览器的,也会造成劫持,用公钥解密数据。
- CA证书:向机构申请一份CA证书,里面包含网站信息和公钥A,服务端吧证书传给浏览器,浏览器验证证书,拿到公钥A
加密过程: 安全层采用混合加密(对称加密 + 非对称加密)
- 服务端传递
CA
证书给浏览器 - 客户端通过
CA
证书验证网站,拿到公钥A
。 - 客户端对称加密生产密钥
X
,用公钥A加密后返回服务端 - 服务端用私钥A解密公钥
A
,拿到客户端的密钥X - 后续通信就使用密钥
X
进行加密
TLS/SSL的工作原理
LS/SSL的功能实现主要依赖三类基本算法:散列函数hash 、对称加密 、非对称加密
客户端使用非对称加密与服务器进行通信,实现身份的验证并协商对称加密使用的秘钥。
HTTP状态码
- 1XX: 请求正在处理
- 2XX:正常状态码
- 200 :请求处理成功
- 201 : 请求成功并且服务器创建了新资源
- 202 :服务器已经接收请求,但尚未处理
- 3XXX:重定向状态
- 301 :请求重定向
- 302: 临时重定向
- 303: 临时重定向,使用get请求新的url
- 304:浏览器缓存相关
- 4XX:错误状态码
- 400: 服务器无法理解请求格式,需要修改请求内容后再次发起请求
- 401: 请求未授权
- 403: 禁止访问
- 404: 服务器上无法找到请求资源
- 5XX:服务器错误
- 500: 服务端错误
- 503: 服务器暂时无法处理请求
DNS完整的查询过程
DNS服务器域名解析过程:
- 查看浏览器缓存是否有对应IP,如果找到直接返回,没有找到继续下一步。
- 发送请求到本地DNS服务器 ,本地域名服务器缓存中如果有,直接返回,没有就向上级服务器迭代查询。
- 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个顶级域名服务器地址。
- 本地DNS服务器向顶级域名服务器发送请求,顶级域名服务器查询自己的缓存,如果就返回,如果没有返回下一级权威域名服务器地址。
- 本地DNS服务器向权威域名服务器发送请求,服务器返回域名对应的ip
- 本地DNS服务器将返回结果保存,方便下次查询。
- 本地DNS服务器将IP返回给浏览器
OSI七层模型
- 物理层(Physical Layer):负责传输原始的比特流(0和1),通过物理媒介(如光纤、电缆、无线等)将数据从一个节点传输到另一个节点。
- 数据链路层(Data Link Layer):在物理连接上传输数据帧,并处理帧的传输错误。它还负责物理地址(MAC地址)的寻址和数据帧的识别。
- 网络层(Network Layer):处理数据包的路由和转发,负责将数据从源主机发送到目标主机,包括寻找最佳路径和实现路由选择。
- 传输层(Transport Layer):提供端到端的数据传输服务,包括数据的分段、重组和错误恢复,确保数据可靠地传输。
- 会话层(Session Layer):负责建立、管理和终止会话(会话是两个应用程序之间的通信会话),并提供会话恢复功能。
- 表示层(Presentation Layer):处理数据的表示和编码,确保数据格式在不同系统之间的交换和解释。
- 应用层(Application Layer):为用户提供应用服务,包括网络服务和应用程序之间的交互,例如电子邮件、文件传输、远程登录等。
TCP/IP五层协议
- 应用层
HTTP
协议FTP
协议DNS
查询 - 传输层 提供通信
UPD
无连接 最大努力传输服务 不安全TCP
面向连接 数据可靠
- 网络层 路由器 交换机
- 数据链条层 IP数据封装成帧 在两个相邻节点间传送
- 物理层 确保数据在物理媒介上传输
TCP和UDP的区别
TCP
和 UDP
都是传输层协议 ,他们都属于TCP/IP
协议族:
TCP
- 面向连接
- 一对一,不支持广播和多播
- 面向字节流
- 可靠传输
- 提供拥塞控制
- 提供全双工通信
UDP
- 面向无连接,不需要建立三次握手
- 支持一对一、一对多、多对多方式
- 面向报文
- 不可靠
UDP协议为什么不可靠?
- 传输数据之前不需要先建立连接
- 不需要确认
- 不跟踪连接
对 WebSocket 的理解
WebSocket
是一种在单个TCP
连接上实现全双工通信的网络协议,与传统的 HTTP
协议不同,HTTP
是基于请求-响应模式,即客户端发送请求,服务器返回响应,然后连接关闭。而 WebSocket
允许客户端和服务器之间保持持久性的连接,双方可以随时互相发送数据,而不需要每次通信都建立新的连接。
服务器可以向客户端主动推送消息,客户端也可以主动向服务器推送消息。
TCP和UDP的应用
TCP应用层协议
- HTTP:用于在Web浏览器和Web服务器之间传输超文本数据。大多数网站使用TCP上的HTTP来传输网页内容,图像,视频等。
- SMTP:用于电子邮件的发送。它确保电子邮件消息以可靠的方式传递到电子邮件服务器。
- POP3 和 IMAP:这两种协议用于从电子邮件服务器接收邮件。它们使用TCP确保邮件的完整传递。
- FTP:用于在客户端和服务器之间传输文件。TCP确保文件以可靠的方式传输。
- SSH:用于远程登录和安全传输数据。SSH使用TCP来保证安全的数据传输。
- HTTPS:是安全的HTTP,使用SSL/TLS进行加密。它在TCP上运行,用于安全的网页浏览。
UPD应用层协议
- DNS :用于将域名映射到IP地址。
DNS
使用UDP
进行快速的查询和响应,尽管它不提供数据可靠性。 - DHCP :用于为设备分配IP地址和其他网络配置。
DHCP
使用UDP
来请求和分配IP
地址。 - SNMP :用于网络设备的监控和管理。它使用
UDP
在网络设备之间传输监控信息。 - TFTP :类似于
FTP
,但更简单,用于快速传输文件。TFTP
使用UDP
来传输数据。 - VoIP :用于实时语音通话。
VoIP
应用程序使用UDP
来传输音频数据,因为它对延迟比数据丢失更敏感。 - NTP :用于同步计算机的时间。
NTP
使用UDP
来获取时间信息。