计算机网络
# 基础
# TCP/IP网络模型
TCP/IP网络模型是互联网的基础,它是一系列网络协议的总称⁵。对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式。而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。这个网络协议是分层的,每一层都有各自的作用和职责。这样可以保证数据能够快速准确地发送,并且在目的地重新组装数据包。
# 应用
# 从浏览器地址栏输入 url 到显示主页的过程?
- 用户输入url并回车
- 浏览器进程检查url,组装协议,构成完整的url
- 浏览器进程通过进程间通信(IPC)把url请求发送给网络进程
- 网络进程接收到url请求后检查本地缓存是否缓存了该请求资源,如果有则将该资源返回给浏览器进程
- 如果没有,网络进程向web服务器发起http请求(网络请求),请求流程如下: 5.1 进行DNS解析,获取服务器ip地址,端口 5.2 利用ip地址和服务器建立tcp连接 5.3 构建请求头信息 5.4 发送请求头信息 5.5 服务器响应后,网络进程接收响应头和响应信息,并解析响应内容
- 网络进程解析响应流程; 6.1 检查状态码,如果是301/302,则需要重定向,从Location自动中读取地址,重新进行第4步,如果是200,则继续处理请求。 6.2 200响应处理:检查响应类型Content-Type,如果是字节流类型,则将该请求提交给下载管理器,该导航流程结束,不再进行后续的渲染,如果是html则通知浏览器进程准备渲染进程准备进行渲染。
- 准备渲染进程 7.1 浏览器进程检查当前url是否和之前打开的渲染进程根域名是否相同,如果相同,则复用原来的进程,如果不同,则开启新的渲染进程
- 传输数据、更新状态 8.1 渲染进程准备好后,浏览器向渲染进程发起“提交文档”的消息,渲染进程接收到消息和网络进程建立传输数据的“管道” 8.2 渲染进程接收完数据后,向浏览器发送“确认提交” 8.3 浏览器进程接收到确认消息后更新浏览器界面状态:安全、地址栏url、前进后退的历史状态、更新web页面
# DNS域名解析过程
当您在浏览器中输入一个域名时,DNS协议会通过一系列的步骤来查找该域名对应的IP地址。下面是一个简单的概述:
- 首先,您的计算机会检查其本地DNS缓存,看看它是否已经知道该域名对应的IP地址。如果缓存中有该信息,则解析过程结束。
- 如果本地DNS缓存中没有该信息,您的计算机会向您的网络配置中指定的DNS服务器发送查询请求。
- 如果本地DNS服务器也不知道该域名对应的IP地址,它会向根DNS服务器发送查询请求。
- 根DNS服务器会返回一个顶级DNS服务器(如.com或.cn)的地址。
- 本地DNS服务器再向顶级DNS服务器发送查询请求。
- 顶级DNS服务器会返回该域名对应的权威DNS服务器(即负责管理该域名的服务器)的地址。
- 本地DNS服务器再向权威DNS服务器发送查询请求。
- 权威DNS服务器会返回该域名对应的IP地址。
- 本地DNS服务器将该IP地址缓存起来,并将其返回给您的计算机。
- 您的计算机将该IP地址缓存起来,并使用它来访问目标网站。
# 为什么要有WebSocket?
WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它是 HTML5 开始提供的。WebSocket 使客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
传统的 HTTP 协议是一个请求-响应协议,请求必须先由浏览器发给服务器,服务器才能响应这个请求,再把数据发送给浏览器。这意味着,浏览器不主动请求,服务器是没法主动发数据给浏览器的。这样一来,要在浏览器中实现实时聊天、在线炒股或在线多人游戏等功能就很困难。
为了解决这个问题,HTML5 推出了 WebSocket 标准,让浏览器和服务器之间可以建立无限制的全双工通信,任何一方都可以主动发消息给对方。这样就可以更好地节省服务器资源和带宽,并且能够更实时地进行通讯。
# HTTP
# HTTP 常用的状态码及其含义?
# URI 和 URL 有什么区别?
# HTTP 1.1 做的改进
HTTP/1.1 相对于 HTTP/1.0 做了许多改进,包括:
- 长连接:HTTP/1.1 支持长连接(Persistent Connection),即在一个 TCP 连接上可以传输多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。⁴
- 缓存处理:HTTP/1.1 引入了更多的缓存控制策略,例如 Entity tag、If-Unmodified-Since、If-Match、If-None-Match 等,以更好地控制缓存。⁶
- Host 头处理:HTTP/1.1 引入了 Host 头,使得在同一个 IP 地址和端口号上可以配置多个虚拟 WEB 站点。⁵
举个例子,在 HTTP/1.0 中,每个 HTTP 请求都需要建立一个新的 TCP 连接,完成后立即关闭连接。这样做会带来很大的开销和延迟。而在 HTTP/1.1 中,可以在一个 TCP 连接上发送多个 HTTP 请求和响应,大大减少了建立和关闭连接的开销和延迟。
# HTTP 2.0
HTTP/2 相对于 HTTP/1.1 也做了许多改进,包括:
- 二进制分帧:HTTP/2 在应用层(HTTP/2)和传输层(TCP 或者 TLS)之间增加了一个二进制分帧层,实现了请求和响应的多路复用。
- 头部压缩:HTTP/2 使用 HPACK 算法对头部进行压缩,减少了数据传输的开销。
- 服务器推送:HTTP/2 支持服务器推送(Server Push),即服务器可以在客户端需要之前主动将数据推送给客户端,提高了页面加载速度。
举个例子,在 HTTP/1.1 中,同一时间内同一域名下的请求数量是有限制的,超过限制的请求需要等待之前的请求完成后才能发送。而在 HTTP/2 中,由于引入了二进制分帧和多路复用技术,可以在一个 TCP 连接上同时发送多个请求和响应,大大提高了传输效率。
# HTTP 3.0
HTTP/3 相对于 HTTP/2 也做了许多改进,包括:
- 基于 QUIC 协议:HTTP/3 是基于 QUIC 协议的,而 QUIC 协议是基于 UDP 的。QUIC 协议在 UDP 的基础上实现了可靠的数据传输、拥塞控制、加密和多路数据流。³
- 解决队头阻塞问题:HTTP/3 通过在 QUIC 层实现无序、并发字节流的传输,解决了队头阻塞问题。¹
- 更快的连接建立:HTTP/3 重新定义了 TLS 协议加密 QUIC 头部的方式,既提高了网络攻击成本,又降低了建立连接的速度。¹
- 连接迁移:HTTP/3 将 Packet、QUIC Frame、HTTP3 Frame 分离,实现了连接迁移功能,降低了 5G 环境下高速移动设备的连接维护成本。¹
举个例子,在 HTTP/2 中,由于基于 TCP 实现,当出现丢包时会导致整个 TCP 连接等待重传,造成队头阻塞问题。而在 HTTP/3 中,由于基于 QUIC 协议实现无序、并发字节流的传输,即使出现丢包也不会影响其他数据流的传输,从而解决了队头阻塞问题。
# 为什么要有HTTPS
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)是一种通过计算机网络进行安全通信的传输协议。它在 HTTP 的基础上增加了 SSL/TLS 协议,用于在客户端和服务器之间建立安全连接,对数据进行加密传输。
使用 HTTPS 的主要目的是为了保护用户的隐私和数据安全。当用户通过浏览器访问网站时,如果使用 HTTP 协议,那么传输的数据是明文的,容易被第三方拦截、窃听或篡改。而使用 HTTPS 协议,数据在传输过程中会被加密,即使被第三方拦截也无法解密,从而保护了用户的隐私和数据安全。
此外,使用 HTTPS 还可以防止“中间人攻击”,即第三方在客户端和服务器之间截获并篡改数据。由于 HTTPS 协议提供了身份验证机制,客户端可以验证服务器的身份,确保与正确的服务器建立连接。
总之,使用 HTTPS 可以提高网络通信的安全性,保护用户的隐私和数据安全。
HTTP/2 和 HTTP/3 都支持加密传输,但它们并不是替代 HTTPS 的协议。事实上,它们通常都是与 HTTPS 一起使用的。
HTTP/2 和 HTTP/3 都支持在 TLS(Transport Layer Security)层上进行加密传输。TLS 是一种安全协议,用于在客户端和服务器之间建立安全连接,对数据进行加密传输。HTTPS 协议也是基于 TLS 协议实现的。
因此,当我们谈论使用 HTTP/2 或 HTTP/3 进行安全通信时,实际上是指使用基于 TLS 的 HTTPS 协议,并通过 HTTP/2 或 HTTP/3 进行数据传输。也就是说,HTTP/2 和 HTTP/3 只是用来传输数据的协议,而 HTTPS 则是用来保证数据安全的协议。
总之,HTTP/2 和 HTTP/3 并不能替代 HTTPS,它们通常都是与 HTTPS 一起使用的,以保证数据的安全传输。
# HTTPS解决了哪些问题
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)是一种通过计算机网络进行安全通信的传输协议。它在 HTTP 的基础上增加了 SSL/TLS 协议,用于在客户端和服务器之间建立安全连接,对数据进行加密传输。
使用 HTTPS 可以解决以下问题:
- 数据窃听:当用户通过浏览器访问网站时,如果使用 HTTP 协议,那么传输的数据是明文的,容易被第三方拦截、窃听。而使用 HTTPS 协议,数据在传输过程中会被加密,即使被第三方拦截也无法解密,从而保护了用户的隐私和数据安全。
- 数据篡改:使用 HTTP 协议时,传输的数据容易被第三方篡改。而使用 HTTPS 协议,由于数据被加密,第三方无法对其进行篡改。
- 身份伪装:使用 HTTP 协议时,用户无法确定与之通信的服务器是否为真实的服务器。而使用 HTTPS 协议,客户端可以验证服务器的身份,确保与正确的服务器建立连接。
总之,使用 HTTPS 可以提高网络通信的安全性,保护用户的隐私和数据安全。
# Session 和 Cookie 有什么联系和区别?
# TCP
# TCP三次握手
主要是因为两次握手无法解决“失效的连接请求”问题,而四次握手则会增加额外的开销,并且并不能带来更多的好处。因此,TCP 采用了三次握手作为建立连接的标准方式。
总之,TCP 采用三次握手来建立连接,主要是为了解决“失效的连接请求”问题,并确保连接的可靠性。三次握手既能有效地解决这个问题,又不会带来额外的开销。
# TCP四次挥手
TCP(Transmission Control Protocol)是一种面向连接的传输层协议,它提供了可靠的、面向字节流的数据传输服务。在关闭 TCP 连接时,客户端和服务器需要进行四次挥手,以释放连接资源并确保数据传输的完整性。
在四次挥手的过程中,客户端和服务器都需要等待 2MSL(Maximum Segment Lifetime,最大报文段生存时间)才能进入 CLOSED 关闭状态。这主要是为了解决以下两个问题:
- 确保数据传输的完整性:在关闭连接之前,客户端和服务器可能还有未完成的数据传输。等待 2MSL 可以确保网络中所有的报文段都已经传输完成,避免数据丢失。
- 防止旧连接复活:在网络传输过程中,客户端或服务器发送的报文段可能会由于网络延迟或其他原因被延迟。如果不等待 2MSL,那么这些延迟的报文段可能会在新的连接建立后到达,导致旧连接复活。等待 2MSL 可以确保所有旧的报文段都已经失效,避免旧连接复活。
MSL 的具体值取决于具体的网络环境和操作系统实现,通常为 2 分钟。因此,在关闭 TCP 连接时,客户端和服务器都需要等待一段时间(通常为 4 分钟)才能进入 CLOSED 关闭状态。
总之,在四次挥手的过程中,客户端和服务器都需要等待 2MSL 才能进入 CLOSED 关闭状态。这主要是为了确保数据传输的完整性,并防止旧连接复活。
# TCP 是如何保证可靠性的?
TCP协议保证可靠性的方式主要有:校验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口控制等方法实现了可靠性传输。¹²
- 校验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。¹
- 序列号/确认应答:这个机制类似于问答的形式。发送端发送信息给接收端,接收端会回应一个包,这个包就是应答包。只要发送端有一个包传输,接收端没有回应确认包(ACK包),都会重发。或者接收端的应答包,发送端没有收到也会重发数据。这就可以保证数据的完整性。¹
- 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。¹
- 最大消息长度:在建立TCP连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。
- 滑动窗口控制:窗口控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。¹
# TCP 的流量控制?
流量控制是为了防止发送方发送数据过快,导致接收方来不及接收,从而出现分组丢失的情况。为了避免分组丢失,流量控制通过控制发送方的发送速度,使得接收方能够及时接收数据。
流量控制的根本目的是防止分组丢失,它是构成TCP可靠性的一方面。
# 说说 TCP 的拥塞控制?
TCP 拥塞控制是为了防止过多的数据注入到网络中,避免出现网络负载过大的情况。如果拥塞不加以控制,将导致大量的报文重传,并再度引起大量的数据报丢弃,直到整个网络瘫痪。 因此,拥塞控制是一种全局的控制方法,旨在保护网络免受过载。
# TCP 里面的粘包、拆包
# UDP
# TCP 与 UDP之间的差别
TCP 和 UDP 是两种常用的传输层协议,它们之间有一些重要的区别。
首先,TCP 是面向连接的协议,而 UDP 是无连接的协议。这意味着在使用 TCP 传输数据之前,源端和终端必须先建立连接。而使用 UDP 时,不需要建立连接,可以直接发送数据。
其次,TCP 提供可靠的服务,保证数据无差错、不丢失、不重复、按需到达。而 UDP 尽最大努力交付,不保证可靠交付数据。
此外,TCP 面向字节流,UDP 是面向报文的。TCP 有拥塞控制机制,而 UDP 没有拥塞控制。
举个例子,TCP 常用于文件传输(FTP)、网页浏览(HTTP/HTTPS)等需要可靠传输的场景。而 UDP 常用于视频、音频等多媒体通信、广播通信等对高速传输和实时性有较高要求的场景。