计算机网络
网络分层
最初,不同公司由于网络体系结构不同,产品很难互相连通。国际标准化组织 ISO 提出一个试图使各种计算机在世界范围内互连成网的标准框架 OSI:开放系统互连基本参考模型(Open Systems Interconnection Reference Model);
由于因特网已抢先在全世界覆盖了相当大的范围,在市场化方面 OSI 则失败了,使得最广泛应用的不是法律上的国际标准 OSI,而是非国际标准 TCP/IP;

从实质上讲,TCP/IP 只有最上面的三层,因为最下面的网络接口层基本上和一般的通信链路在功能上没有多大差别,在学习计算机网络的原理时往往采取折中的办法,即综合 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
应用层
应用层协议定义的是应用进程间通信和交互的规则。
运输(传输)层
运输层的任务就是负责向两个主机中进程之间的通信提供通用的数据传输服务。一台主机可同时运行多个进程,因此运输层有复用和分用的功能。
复用:多个应用层进程可同时使用运输层的服务(TCP/UDP)。 分用:与复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
网络层
为不同主机提供通信服务。例如在发送数据时,网络层把运输层产生的报文封装成分组或包进行传送;
选择合适的路由,使源主机运输层所传下来的分组(各层传送的数据单元,可用分组表示)能够通过网络中的路由器找到目的主机。
数据链路层
两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。
数据链路层将网络层交下来的分组组装成贞,其中包含原始数据和其他描述信息,例如接收端可根据描述信息检查有无差错,如发现有错,数据链路层就丢掉这个错误的贞(可根据具体协议决定是丢贞还是纠错),防止继续传递浪费网络资源。相当于数据链路层不仅要检错,而且要纠错。
物理层
在物理层上所传数据的单位是比特。数据链路层会将数据帧编码成比特流传递给物理层;
物理层主要负责将已经编码成比特序列的数据在传输介质上(电信号或光信号等)传输。
网络协议
TCP/IP
TCP/IP 是互联网的基础协议,它是一个通信协议簇。包括一系列用于在网络中传输数据的协议。其中包含 TCP、IP、UDP 等。
IP
IP(Internet Protocol) 是网络层协议,是互联网的基石协议,它负责将数据包从源主机发送到目标主机。IP 协议本身是不可靠的传输协议,所有上层协议(TCP/UDP/ICMP)都依赖 IP。
IP 协议核心功能是寻址(通过 IP 地址唯一标识网络设备)和路由(选择数据包从源到目的地的路径),发送数据前不需要建立连接(无连接) ,发送数据后也不需要确认对方是否收到(不可靠传输)。IP 可在任意底层网络上运行(如以太网、无线网、5G、卫星链路等)。
TCP
TCP(传输控制协议) 是网络分层中的传输层协议,依赖 IP 协议。TCP 每一次连接的建立和拆除都会经历三次握手和四次挥手,性能和效率是比较低的。
TCP 是一个面向连接的、可靠的传输协议,提供一种可靠的字节流,能保证数据完整、无损并且按序到达。
三次握手
- 客户端发送 SYN(报文标志,值为 1)请求服务端建立连接。
- 服务端接收到 SYN 后,返回 SYN(值为 1)和 ACK(报文标志,值为 1)给 client,告诉对方准备成功。
- 客户端接收到 SYN 和 ACK 后,发送 ACK 确认,建立连接成功。
四次挥手
- 主动断开方 A(客户或服务端)向对方 B 发送 FIN(报文标志),准备关闭 socket 连接。
- B 收到 FIN 后,向 A 发送 ACK 同意断开请求。
- B 会待数据发送截止后,再次向 A 发送 FIN 和 ACK,表示数据都发送完啦。
- A 收到 FIN 和 ACK,向 B 发送 ACK 确认报文,断开连接成功。
HTTP、HTTPS
HTTP(超文本传输协议) 是一种应用层协议,下层的传输层协议使用 TCP(可靠传输),通常用于传输超文本文档,例如网页、图片、视频等。因为 TCP 是无状态的,每次请求都会打开和关闭连接,为提升高并发通信的能力,可使 HTTP 传输层的连接通道具备可复用的能力。
HTTP 连接复用实质上指的是承载 HTTP 报文的传输层 TCP 连接的复用。
目前主流的 http2.0 版本实现了 IO 多路复用的概念,持久连接主要包括以下几个方面:
通过 Connection 头部字段值为"keep-alive"时,表示该连接是持久连接,客户端和服务器会保持连接打开状态以便后续的请求和响应。
多个请求共享同一个连接:在持久连接中,客户端可以在同一个 TCP 连接上发送多个 HTTP 请求。
使用连接池。在持久连接中,客户端可以维护一个连接池,用于存储已经建立的连接。当需要发送新的请求时,客户端会首先检查连接池中是否有可用的连接,如果有,则直接使用该连接,否则会创建一个新的连接。
UDP
UDP(用户数据报协议) 和 TCP 一样,都是传输层协议,它们为应用层提供数据传输服务,它依赖于 IP 协议完成数据传输,UDP 是传输层最简洁的协议,其设计哲学是 “轻量级、无约束、尽最大努力交付”。
UDP 是无连接的,不需要建立连接,也不需要确认对方是否收到数据,因此 UDP 传输效率比 TCP 高,但可靠性不如 TCP。
UDP 适用于实时性要求高的场景,例如音视频通话、直播、在线游戏、DNS 查询、物联网传感器、广播/组播(TCP 无法支持一对多传输)等。
RPC
RPC 是一种远程过程调用的通信机制,它允许一个应用程序调用另一个地址空间(通常是不同的进程或计算机)中的函数或过程,就像调用本地函数一样。
RPC 可以基于不同的传输协议实现,包括 HTTP、TCP、UDP 等。常见的 RPC 框架有 Dubbo、gRPC、Apache Thrift 等。
WebSocket
WebSocket 通信在 TCP 连接上进行,所以属于应用层协议,浏览器和服务器只需要完成一次升级握手就直接可以创建持久性的连接,并进行双向数据传输。
DNS
DNS(Domain Name System)是互联网的核心服务之一,它负责将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址(如 192.0.2.1)。这个转换过程称为域名解析。
CDN
CDN(Content Delivery Network)内容分发网络是一种通过将内容缓存到离用户更近的服务器上,从而提高内容访问速度和可用性的技术。
Socket
Socket 套接字可以理解为网络通信的端点或门户,它是一个抽象的概念,用于表示网络通信的一端。在网络通信中,每个 Socket 都有一个 IP 地址和端口号,用于标识通信的一端。它支持不同协议,主要是 TCP(可靠连接)和 UDP(快速无连接)。
想象两个人打电话。每个人都需要一部电话(端点)才能通话。在网络通信中,两个想要交换数据的程序(进程)也需要各自的“电话”——这就是 Socket。
http 长连接和短连接
HTTP 长连接和 HTTP 短连接指的是传输层的 TCP 连接是否被多次使用。
短连接
在 HTTP 的 1.0 版本协议中,HTTP 在每次请求结束后都会主动释放 TCP 连接,因此 HTTP 连接是一种“短连接”,在这种情况下,客户端需要不断向服务器发送“保持连接”的请求,以保持在线状态,在高并发场景下使用 HTTP“短连接”进行通信肯定是不行的。
长连接
TCP 连接建立后该传输层连接不再进行释放,供应用层反复使用;一般需要一个连接池来对可供复用的 TCP 长连接进行管理和监测。
数据库连接池、HTTP 连接池本质上都属于 TCP 连接池。
SSL/TLS
TCP 是传输层的协议,但它是明文传输的。SSL 给 TCP 通信提供安全及数据完整性保护。TLS 只是 SSL 的升级版,它们的作用是一样的。TLS 协议是更新、更安全的 SSL 协议版本。
SSL/TLS 位于应用层和传输层之间,除了 HTTP 外,它可以为任何基于 TCP 传输层以上的应用层协议(如 WebSocket 协议)提供安全性保证。
加密算法
基础的加密算法主要有哈希(Hash,或称为散列)、对称加密(Symmetric Cryptography)、非对称加密(Asymmetric Cryptography)、数字签名(Digital Signature)。
哈希单向加密算法
单向加密不可逆,为待加密的任意大小的信息生成一个固定大小(比如通过 MD5 加密之后是 32 个字符)的字符串摘要;除了 MD5(32 个字符 128 位),Java 还提供了 SHA1(160 位)、SHA256(256 位)、SHA512(512 位)等哈希摘要函数的实现。
对称加密
加密和解密使用同一密钥,常见的对称加密算法有 DES、AES 等。
非对称加密
加密和解密使用不同密钥(公/私钥);如使用公钥加密,必须私钥解密;使用私钥加密,必须公钥解密;典型的非对称加密算法有 RSA、DSA 等。
一般的,公钥公开分享给任何需要加密消息的机器,而私钥则是保密的,只有持有私钥才能解密;即使公钥被泄露,也无法解密;
数字签名
和非对称加密类似,也会用到公/私钥,但是密钥的用途有区别;非对称加密中,公钥加密,私钥解密;而数字签名中,私钥签名,公钥验证签名;
数字签名主要关注数据的完整性,确保数据在传输过程中不被篡改;
非对称加密中,发送者使用接收者的公钥加密数据,只有接收者才能使用其私钥解密消息;数字签名中,发送者使用自己的私钥对数据进行签名,接收者使用发送者的公钥验证签名,以确保消息的来源和完整性;

