我的知识记录:计算机网络

技术学习笔记

Posted by yZhang on April 18, 2025

1.计算机网络知识

1.1 TCP和UDP的区别

连接:TCP建立连接然后传输数据;UDP即刻传输数据。
服务对象:TCP一对一;UDP支持一对一、一对多、多对多。
可靠性:TCP是可靠交付数据;UDP尽最大努力交付,不保证可靠交付数据。
拥塞控制、流量控制:TCP有,以保证数据传输的安全性,UDP则没有,他需要保证发送速率。
首部开销:TCP首部20字节,UDP首部8字节。
传输方式:TCP是流式传输,没有边界,但保证顺序和可靠。UDP是一个包一个包的传输,有边界。

2.计算机网络分层

2.1 IOS/OSI七层模型

IOS/OSI七层模型:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

2.2 TCP/IP四层模型

TCP/IP四层模型:
数据链路层、网络层、传输层、应用层。

3.https的握手过程及原理

应用层有哪些协议?
HTTP:超文本传输协议,用于传输超文本文档。
HTTPS:HTTP协议的安全版本,采用SSL/TLS加密传输数据。
CDN:内容分发网络,通过网络加速内容的分发,提高用户访问速度。
DNS:Domain Name System,用于域名解析。
FTP:文件传输协议,用于传输文件。

传统的TLS握手基本都是使用RSA算法来实现密钥交换的。
在将TLS证书部署到服务端时,证书文件 ≈ 服务端公钥,而私钥则由服务端保存。公钥会在TLS握手阶段传递给客户端。
在RSA密钥协商算法中,客户端会生成随机密钥,并使用服务端的公钥加密后再传给服务端。根据非对称加密算法,公钥加密的消息仅能通过私钥解密;这样服务端解密后,双方得到了相同的密钥,再用他加密应用消息。
详细介绍一下”公钥加密”和”私钥解密”过程:

(1) RSA密钥生成 (服务端准备)

服务端首先生成一对RSA密钥:

  • 私钥 $ (d, n) $
  • 公钥 $ (e, n) $

生成步骤:

  1. 选择两个大素数 $ p $ 和 $ q $,计算 $ n = p \times q $。
  2. 计算欧拉函数 $ \phi(n) = (p-1)(q-1) $。
  3. 选择整数 $ e $ 满足 $ 1 < e < \phi(n) $ 且 $ \gcd(e, \phi(n)) = 1 $(互质,通常取65537)。
  4. 计算 $ d $ 使得 $ d = e^{-1} \mod \phi(n) $(即 $ e \cdot d = 1 \mod \phi(n) $)。
    结果:公钥用于加密,私钥用于解密,且数学上不可逆向推导(因大数分解难题)。

(2) 客户端:公钥加密过程

客户端生成随机对称密钥 $ K $,并用服务端公钥 $ (e, n) $ 加密:

加密公式:$ C = K^e \mod n $ ($ C $ 为加密后的密文)

步骤:

  1. 将密钥 $ K $ 转换为整数(如字节序列的数值表示)。
  2. 若 $ K $ 较长,需分块并填充(如PKCS#1标准)。
  3. 计算 $ K^e \mod n $,得到密文 $ C $。

关键点:

  • 只有公钥 $ e $ 和 $ n $ 被使用,无需私钥。
  • 加密后的 $ C $ 只能通过私钥 $ d $ 解密。

(3) 服务端:私钥解密过程

服务端收到密文 $ C $ 后,用私钥 $ (d, n) $ 解密:

解密公式:$ K = C^d \mod n $

步骤:

  1. 计算 $ C^d \mod n $,得到原始整数形式的 $ K $。
  2. 将整数转换回字节序列,恢复对称密钥。

数学原理:
根据欧拉定理和RSA设计:
$ C^d = (K^e)^d = K^{e \cdot d} = K^{1 + k \cdot \phi(n)} = K \mod n $
(因 $ e \cdot d = 1 \mod \phi(n) $,且 $ K $ 与 $ n $ 通常互质)

(4) 完整流程示例

  1. 服务端:生成RSA密钥对,发送公钥 $ (e, n) $ 给客户端。
  2. 客户端
    • 生成AES密钥 $ K = \text{0x123…} $。
    • 计算 $ C = \text{0x123…}^e \mod n $,发送 $ C $。
  3. 服务端
    • 计算 $ K = C^d \mod n $,还原 $ K $。
  4. 双方:使用 $ K $ 进行对称加密通信(如AES-GCM)。

握手过程:

TLS全称为Transport Layer Security;

  1. TLS第一次握手:
    客户端向服务器发起加密通信请求 ClientHello。客户端主要向服务器发送以下信息:
    (1)客户端支持的TLS协议版本
    (2)客户端生成的随机数(Client Random),后面用于生成会话密钥条件之一。
    (3)客户端支持的加密算法列表,如RSA加密算法。

  2. TLS第二次握手:
    服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。回应的内容包含以下:
    (1)确认TLS协议版本,如浏览器不支持,则关闭加密通信。
    (2)服务器生产的随机数(Sever Random),后面用于生成会话密钥条件之一。
    (3)服务器证书,包含服务器的公钥和其他信息。
    (4)服务器支持的加密算法列表,如RSA加密算法。

  3. TLS第三次握手:
    客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的CA公钥,确认服务器的数字证书真实性。
    若证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用他的加密报文,向服务器发送容下信息:
    (1)随机数(pre-master secret),该随机数会被服务器公钥加密(此随机数护法送个服务端,确保两端都是一样的)。
    (2)加密通信算法改变通知,表示随后的信息都将用会话密钥加密通信。
    (3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用于服务端校验。

  4. TLS第四次握手:
    服务器收到客户端的第三个随机数后(pre-master secret),通过协商的加密算法,计算出本次通信的会话密钥
    然后向客户端发送最后的信息:
    (1)加密通信算法改变通知,表示随后的信息都即将用会话密钥加密通信。
    (2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用于客户端校验。

4.TCP三次握手和四次挥手

4.1 TCP头部格式

TCP

TCP 头部格式

序列号:用来解决网络包乱序问题。
确认应答号:用来解决丢包的问题。
控制位:

  • ACK:确认应答位,用来确认上次发送的包到达了对方。
  • SYN:同步位,用来建立连接。
  • FIN:结束位,用来关闭连接。
  • RST:该位为1时,表示出现异常必须强制断开连接。

4.2 TCP三次握手过程

第一次握手:
客户端向服务器发起连接请求,发送SYN=1(同步标志位),并告知初始序列号。
状态变化:客户端进入SYN_SEND状态。
第二次握手:
服务器收到客户端的SYN=1请求后,向客户端发起确认应答,发送SYN=1ACK=1,并告知确认应答序列号。
状态变化:服务器进入SYN_RECV状态。
第三次握手:
客户端收到服务器的SYN=1ACK=1确认应答后,向服务器发起确认应答,发送ACK=1
状态变化:客服端进入ESTABLISHED状态。服务器端进入ESTABLISHED状态。

4.3 TCP四次挥手过程

4.3.1 具体过程

TCP Four-Wave

TCP 四次挥手过程

第一次挥手(FIN=1):
客户端向服务器发送FIN=1,请求关闭连接。
状态变化:客户端从ESTABLISHED状态进入FIN_WAIT_1状态。
含义:没有数据要发送,请求关闭连接。

第二次挥手(ACK=1):
服务器收到客户端的FIN=1请求后,向客户端发送确认应答,即ACK=1
状态变化:客户端从FIN_WAIT_1进入FIN_WAIT_2状态;服务器从ESTABLISHED状态进入CLOSE_WAIT状态。
含义:确认收到关闭请求,但还有数据发送。

第三次挥手(FIN=1):
服务器向客户端发送FIN=1,请求关闭连接。
状态变化:服务器从CLOSE_WAIT状态进入LAST_ACK状态。
含义:数据已发送完毕,准备关闭连接。

第四次挥手(ACK=1):
客户端收到服务器的FIN=1请求后,向服务器发送确认应答,即ACK=1
状态变化:客户端从FIN_WAIT_2进入TIME_WAIT状态,2MSL后进入CLOSED状态;服务器从LAST_ACK状态进入CLOSED状态。
含义:确认关闭,连接终止。

4.3.2 深入探究

  1. 为什么4次握手中间两次不能变成1次?
    服务器收到客户端的FIN报文时,内核会马上回一个ACK应答报文,但是服务端应用程序可能还有数据要发送,所以并不能马上发送FIN报文,而是将发送FIN报文的控制权交给服务端应用程序。
    关键在于”是否还有数据要发送“。如果没有数据要发送,则第二次和第三次挥手就会合并传输。

  2. 第三次挥手一直没发,会发生什么?
    客户端处于FIN_WAIT_2状态,表示客户端的发送通道已经关闭,等待对方发送FIN报文关闭对方的发送通道。
    连接是用shutdown函数关闭的,连接可以一直处于FIN_WAIT_2状态,因为他可能还可以发送或接收数据;
    但对于close函数关闭的孤儿连接,由于无法再发送和接收数据,所以这个状态不可以持续太久,tcp_fin_timeout控制了这个状态下连接的持续时长,默认值60s。

  3. 第二次和第三次挥手之间,主动断开的那端能干什么?
    主动断开一方如果是调用shutdown函数来关闭连接,并且只选择关闭发送能力且没有关闭接受能力,那主动断开的乙方还可以接收数据。

  4. 为什么四次挥手之后要等2MSL? (1) MSL MSL是Maximum Segment Lifetime,即报文最大生存时间;
    TCP报文基于IP协议,IP投中有一个TTL字段,是IP数据包可以经过的最大路由数,每经过一个处理数据报的路由器此值就减1,当TTL为0时,数据报将被丢弃。
    MSL与TTL的区别:
    MSL单位是时间,TTL是经过路由跳数。**MSL应该要大于等于TTL消耗为0的时间。 TTL 的值一般是 64,Linux 将 MSL 设置为 30 秒,意味着 Linux 认为数据报文经过 64 个路由器的时间不会超过 30 秒,如果超过了,就认为报文已经消失在网络中了。 (2) “2” TIME_WAIT等待2倍的MSL,比较合理的解释是:发送端–数据包–>接收端–响应–>发送端,一来一回需要等待2倍的时间;

4.4 cookie、session等用户状态技术

4.4.1 定义和区别

  1. cookie和session:

    • 都用于管理用户的状态和身份;cookie通过在客户端记录信息确定用户身份(cookie中存有sessionId标识);
    • session则通过在服务器端记录信息确定用户身份。
  2. token:是一种在客户端和服务端之间传递身份信息的方式。类似一个令牌,无状态;用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户。

  3. localStorage:是浏览器提供的一种客户端存储机制,用于在用户的浏览器中存储键值对形式的数据。
    如果需要永久性地存储数据,或者需要在不容标签页或窗口之间共享数据,可以使用localStorage;如果需要在会话期间存储临时数据,且数据不需要在不同的标签页或窗口之间共享,可以使用sessionStorage。

4.4.2 常见问题

  1. cookie和session的区别

    • 存储安全:cookie是存储在浏览器上的数据,session是存储在服务器上的数据。
    • 大小限制:cookie的大小限制为4kb,session的大小限制一般不受限制。
    • 安全性:cookie相对session更不安全;
    • 生命周期:cookie的默认生命周期是浏览器关闭,session的默认生命周期是会话结束。
  2. 如果我把数据存储到localStorage,和cookie有什么区别?

    • 存储容量: Cookie 的存储容量通常较小,每个 Cookie 的大小限制在几 KB 左右。而 LocalStorage 的存储容量通常较大,一般限制在几 MB 左右。
    • 数据发送: Cookie 在每次 HTTP 请求中都会自动发送到服务器,这使得 Cookie 适合用于在客户端和服务器之间传递数据。而 localStorage 的数据不会自动发送到服务器,它仅在浏览器端存储数据,因此 LocalStorage 适合用于在同一域名下的不同页面之间共享数据;
    • 生命周期:Cookie 可以设置一个过期时间,使得数据在指定时间后自动过期。而 LocalStorage 的数据将永久存储在浏览器中,除非通过 JavaScript 代码手动删除;
    • 安全性:Cookie 的安全性较低,因为 Cookie 在每次 HTTP 请求中都会自动发送到服务器,存在被窃取或篡改的风险。而 LocalStorage 的数据仅在浏览器端存储,不会自动发送到服务器,相对而言更安全一些。

    cookie和localStorage存储的数据性质上有什么区别? Cookie适合用于在客户端和服务器之间传递数据、跨域访问和设置过期时间,而 LocalStorage 适合用于在同一域名下的不同页面之间共享数据、存储大量数据和永久存储数据。

4.5 JWT等身份验证技术

4.5.1 JWT介绍

  1. JWT

    JWT(JSON Web Token)是一种开放标准,用于在网络应用间安全传递声明的紧凑格式。
    JWT令牌由三个部分组成:头部(header)、载荷(payload)、签名(signature)。其中头部和载荷均为json格式,使用Base64编码进行序列化;而签名部分是对头部、载荷和密钥进行签名后的结果。

    JWT

JWT 结构

  1. JWT和传统方式有什么区别?

    无状态性:JWT包含了所有必要的信息,如用户身份、权限等;这使得JWT在分布式系统中更加适用,能方便地进行扩展和访问。
    安全性:JWT使用密钥对令牌进行签名,确保令牌的完整性和真实性。
    跨域支持:JWT令牌可以在不同域之间传递,适用于跨域访问的场景。通过在请求的头部或参数中携带JWT令牌,可以实现无需Cookie的跨域身份验证。

4.5.2 常见问题

  1. 什么是集群部署?JWT为什么能解决集群部署?

    集群部署(Cluster Deployment)是指将多个服务器(节点)组合成一个逻辑单元,共同提供高可用、高性能的服务。
    传统的方式存在的问题:在传统的基于会话和Cookie的身份验证方式中,会话信息通常存储在服务器的内存或数据库中;但在集群部署中,不同的服务器之间没有共享的会话信息,这会导致用户在不同的服务器之间切换时需要重新登录(或这需要引入额外的共享机制(如Redis),增加了复杂性和性能开销。

    JWT是如何解决的:JWT令牌中包含了所有必要的身份验证和会话信息,使得服务器无需存储会话信息,从而解决了集群部署中的身份验证和会话管理问题。
    具体过程:当用户进行登录认证后,服务器将生成一个JWT令牌并返回给客户端。客户端在后续的请求中携带该令牌,服务器可以通过对令牌进行验证和解析来获取用户身份和权限信息,而无需访问共享的会话存储。由于JWT令牌是自包含的,服务器可以独立地对令牌进行验证,而不需要依赖其他服务器或共享存储。

  2. JWT的缺点?

    JWT一旦派发出去,在失效之前都是有效的,没办法及时撤销JWT;
    解决:在业务层增加判断逻辑,比如增加黑名单机制

  3. JWT令牌如果泄露了,怎么解决?

    及时失效令牌:立即将令牌标记为失效状态;
    刷新令牌:主动刷新令牌,及重新生成新的令牌,并将旧令牌标记为失效状态;
    使用黑名单:服务器维护一个令牌的黑名单,将泄露的令牌添加到黑名单中;

  4. 前端是如何存储JWT的?

    和传统用户状态管理方式(cookie和session)不同,JWT将所有数据都保存在客户端,每次请求都发回服务器。
    客户端收到服务器返回的JWT,可以存储在Local Storage、Session Storage或Cookie里。
    存储在各地方的优劣势主要体现在安全性、用户体验和性能方面。