计算机网络
计算机网络
1. 经典网络分层
五层协议模型(TCP/IP模型):分为物理层、数据链路层、网络层、传输层和应用层。
七层协议模型(0SI 模型):分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
TCP和 UDP工作在传输层(第四层),主要是数据的传输和可靠性控制。TCP是一种面向连接的协议,提供可靠的数据传输、流量控制、拥塞控制等功能:UDP是一种无连接的协议,不保证数据传输的可靠性,但传输效率高。
HTTP工作在应用层(第七层),还有 HTTPS 和 GRPC。
2. TCP和UDP有什么特点,有什么区别
TCP和UDP是两种常见的传输层协议,他们有不同的特点和适用场景。
TCP 的特点是面向连接,可靠,面向字节流。它的适用场景是上传下载,HTTP请求。
UDP的特点是无连接,不可靠,面向报文。它的适用场景是音频/视频传输,实时游戏。
引申:
1 .TCP如何做连接管理?
通过三次握手建立连接,通过四次挥手关闭连接。
2 . TCP是如何保证可靠的?
TCP 是通过序列号、确认应答、重传机制、流量控制以及滑动窗口等机制实现可靠性传输的。
TCP通过一系列机制来确保数据的可靠传输。
首先,它使用序号和确认机制来确保数据的有序传输和完整性。每个TCP报文段都包含一个序号字段,表示该报文段的数据在数据流中的位置,接收方通过发送确认消息来确认已经收到的数据,并且告知期望接收的下一个数据的序号。这样,发送方就可以根据收到的确认消息,判断数据是否成功传输,如果没有收到确认消息,就会重新发送数据,确保数据的可靠传输。
其次,TCP还使用超时和重传机制来处理丢失的数据包。如果发送方在超时时间内未收到确认消息,它会假设数据丢失,并重新发送相应的数据。这样可以确保即使在网络出现丢包的情况下,数据仍然可以可靠地传输。
此外,TCP还使用流控制和拥塞控制机制来确保网络的稳定性和公平性。流控制机制通过接收方的窗口字段来控制数据的发送速率,防止发送方发送过多的数据导致接收方无法处理。而拥塞控制机制则根据网络的拥塞情况动态调整发送速率,以避免过多的数据包在网络中造成拥塞,确保网络中的所有流量可以得到公平的分享。
3 .重传机制有哪些?
- 超时重传
- 快速重传
- SACK
- D-SACK
4 .什么是快速重传?
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
它的优点是相比于超时重传节省了大量时间 但是它和超时重传都没有解决重传的时候,是重传一个,还是重传所有的问题。
5 .怎么保证包有序?
发送端发送数据时会给每个TCP段分配一个序列号,用于标识该段在整个数据流中的位置。
接收端收到数据段时,可以通过序列号对这些数据段重新排序。
6 .如何实现一个可靠的UDP连接?
3.三次握手和四次挥手
1.三次握手的过程:
第一步,首先客户端会初始化一个随机序列号,然后存到SYN中发送给服务端。
第二步,服务端收到这个SYN包后,也会初始化一个随机序列号,并把SYN和ACK报文发送给客户端,ACK报文存的是接收到的(客户端序+1)
第三步,客户端收到服务端返回的SYN和ACK包后,会把服务端发送的序列号+1存到ACK报文中,发送给服务端一个ACK报文,确认服务器的请求建立连接。
2.为什么是三次握手?不是两次、四次?
因为
三次握手才可以 阻止重复历史连接的初始化(主要原因)
三次握手才可以 同步双方的初始序列号
三次握手才可以 避免资源浪费
两次握手不能确认双方的可靠连接。
四次握手会造成资源的浪费。
3.四次挥手的过程
客户端打算关闭连接,此时会发送FIN报文,,之后客户端进入
FIN_WAIT_1
状态。服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSE_WAIT
状态。客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态。客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态并在等待一段时间(通常是2倍的最大报文段寿命时间,2MSL)后才会关闭连接,释放资源。这段时间是为了确保最后一个ACK报文段能被对方收到,防止“迟到的报文段”干扰新的连接。
接收方在收到ACK报文段后立即进入CLOSED状态,完成连接关闭。
你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
4. 滑动窗口,流量控制和拥塞控制
1.滑动窗口
滑动窗口是通过动态调整窗口大小来高效的数据传输。
发送方可以在发送窗口内连续发送数据包,而无需等待每个数据包的确认。发送窗口的大小限制了未被确认的数据量。
接收方按序接收数据包,并对每个数据包发送ACK报文。接收方的窗口大小通过ACK报文中的窗口大小字段告知发送方。
发送方收到ACK报文后,会将发送窗口向前滑动。滑动的距离取决于收到的确认字节数。新的数据可以填补窗口腾出的空间。
2.拥塞控制
cwnd:滑动窗口大小 ssthresh
:慢启动门限
慢启动
当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。指数性的增长。
拥塞避免
当拥塞窗口
cwnd
「超过」慢启动门限ssthresh
就会进入拥塞避免算法。 每当收到一个 ACK 时,cwnd 增加 1/cwnd。线性增长
拥塞发生
当发生了「超时重传」,则就会使用拥塞发生算法。
这个时候,ssthresh 和 cwnd 的值会发生变化:
ssthresh
设为cwnd/2
,cwnd
重置为1
(是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)
快速恢复
发送方将拥塞窗口减半。
发送方将拥塞窗口设置为丢失的数据包之前的值。
发送方进入拥塞避免状态,继续以较慢的速度逐渐增加拥塞窗口。
3.TCP粘包是什么
TCP粘包是指在使用TCP协议进行数据传输时,发送方连续发送的数据包可能会被接收方合并成一个大的数据包,从而导致接收方难以区分原始数据包的边界。这可能会导致接收方在处理数据时出现混乱或错误。TCP粘包通常发生在发送方发送数据速度过快,或者接收方处理数据速度不够快时
5.HTTPS和HTTP
1.HTTPS和HTTP的区别
HTTP和HTTPS都是用于在网络上传输数据的协议
HTTPS相比于HTTP多了一个SSL证书
HTTPS使用的是SSL/TSL加密通讯,而HTTP是明文传输,安全性很低
HTTPS监听443端口,HTTP监听80端口
HTTPS因为需要进行加密解密等过程,速度上会略慢与HTTP
2.什么是SSL协议
SSL(Secure Sockets Layer)协议是一种安全技术,通过加密和身份验证机制,确保了客户端和服务器之间的数据传输的安全性
3.HTTPS是如何优化三次握手,四次挥手
TCP快速打开
- 客户端发送SYN包,同时携带预先交换的cookie和数据。
- 服务器验证cookie后,发送SYN-ACK包,并立即响应数据。
TLS早期数据
- 客户端发送包含会话票据和早期数据的ClientHello消息。
- 服务器验证会话票据后,发送ServerHello消息,并立即处理早期数据。
会话恢复机制
- 会话ID:
- 客户端发送包含会话ID的ClientHello消息。
- 服务器检查并确认会话ID,发送ServerHello消息,恢复会话。
- 会话票据:
- 客户端发送包含会话票据的ClientHello消息。
- 服务器解密会话票据,恢复会话并发送ServerHello消息。
通过这些优化,HTTPS在保持高安全性的同时显著提升了连接建立和数据传输的效率,减少了延迟,提高了用户体验。
4.http/1.1,http/2,http/3
HTTP/1.1
特点
:
- 基于文本的协议,每个请求/响应都是纯文本形式,使用明文传输。
- 每个连接只能处理一个请求,因此需要多个连接来并行加载资源(例如,图像、CSS、JavaScript)。
- 多个请求需要按顺序排队,因为每个请求都必须等待前一个请求完成。
- 存在“队头阻塞”问题,即一个连接上的某个请求阻塞了后续请求的执行。
HTTP/2
特点
:
- 引入了二进制分帧层,将HTTP消息分解为一系列帧,每个帧可以独立地传输和处理。
- 支持多路复用,允许在单个连接上并发发送多个请求和响应,消除了多个连接带来的开销。
- 引入了头部压缩机制,减少了重复的HTTP头部信息,降低了通信数据量。
- 支持服务器推送(Server Push),允许服务器在客户端请求之前主动推送资源。
HTTP/3
特点
:
- 基于 UDP 协议,通过 QUIC(Quick UDP Internet Connections)协议进行传输。
- QUIC 协议实现了更快的连接建立和更可靠的数据传输,避免了 TCP 的队头阻塞问题。
- 支持零RTT连接建立,允许在初始握手阶段就发送数据。
- 可靠性更高,当网络切换(如移动到另一个网络)时,连接不会被重置,减少了用户感知到的中断时间。
性能对比
- HTTP/2相对于HTTP/1.1:
- 提高了页面加载速度,尤其是在高延迟网络环境下。
- 减少了网络连接和资源请求的数量,降低了延迟。
- 支持服务器推送,优化了资源加载顺序。
- HTTP/3相对于HTTP/2:
- 进一步降低了延迟,提高了连接建立速度。
- 提供了更好的移动设备支持,减少了网络切换对连接的影响。
Get与Post的区别
GET 和 POST 是 HTTP 协议中最常用的两种请求方法,它们在数据传输和使用方式上有几个重要的区别:
1. 数据传输方式
- GET:通过 URL 参数传输数据,数据附在 URL 后面,可见。有一定安全风险,特别是对于敏感信息。
- POST:通过请求体传输数据,数据不可见。对安全,适合传输敏感信息
2. 数据长度限制
- GET:由于 URL 长度限制,GET 请求传输的数据量较小,一般不超过 2KB。
- POST:没有固定的数据长度限制,可以传输大量数据.
3. 数据类型
- GET:通常用于获取资源,不应该对服务器状态产生任何影响,因此用于幂等操作。
- POST:通常用于向服务器提交数据,可能会对服务器状态产生影响,用于非幂等操作,例如提交表单。
4. 使用场景
- GET:适合用于获取数据,例如浏览网页、搜索等。
- POST:适合用于提交数据,例如提交表单、上传文件等。
总结
- GET:适用于获取数据,数据附在 URL 上,传输数据量小,安全性相对较低,幂等操作。
- POST:适用于提交数据,数据传输在请求体中,传输数据量大,安全性较高,非幂等操作。