Computer Network Notes
计算机网络笔记与知识点
TCP/IP网络模型
- 应用层(application layer):工作在操作系统中的用户态,应用软件都在应用层实现,包括HTTP,DNS,FTP协议
- 传输层(transport layer):为应用层提供网络支持,传输协议TCP(Transmission Control Protocol)/UDP(User Datagram Protocol), 80端口通常是Web服务器,22端口是远程登录服务器用的,包括TCP,UDP协议
- 网络层(Internet layer):主要是IP协议(Internet protocol),负责将数据从一个设备传输到另外一个设备,实现主机与主机之间的通信。包括IP,ICMP协议
- 链路层(link layer):当网络层生成IP头部后,链路层在IP前面加入MAC头部,封装为数据帧(data frame)进行发送。链路层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标识网络上的设备
- MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息,我们可以通过 ARP协议获取对方的 MAC 地址。
- MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息,我们可以通过 ARP协议获取对方的 MAC 地址。
网址到网页显示
- 首先浏览器解析URL(http://www.server.com/files/README.html),解析出相关信息后,生成HTTP(Hypertext Transfer Protocol)请求消息。目标服务器域名为server.com, 访问文件夹为files,访问文件为README.html
- DNS查询目标服务器域名对应的IP并获取
- 然后HTTP请求消息可以基于TCP协议进行传输,TCP协议可以包装HTTP请求消息,加上一个TCP头部进行可靠传输,然后再加上一个IP头。所以目前,整个网络包的报文结构就是IP头+TCP头+HTTP报文
- 再在IP头前加上一个MAC头部(以太网使用的头部,包含发送方接收方的MAC地址等信息),一般在TCP/IP协议里,MAC包头的协议类型使用IP或ARP协议。所以目前,整个网络包的报文结构就是MAC头+IP头+TCP头+HTTP报文
- 出口:网卡。接收数据包,头部加上报头和起始帧分界符,结尾加上检测错误的帧校验序列,然后把二进制数据转换为电信号,发送
对称加密/非对称加密
- 对称加密(Symmetric Encryption):对称加密使用同一个密钥进行加密和解密。也就是说,发送方和接收方必须共享同一个密钥,用来对数据进行加密和解密
- 加密和解密使用相同的密钥,同时加密速度快,但是安全性会依赖于密钥管理,如果密钥泄露,信息将不再保密
- 常见算法:AES(高级加密标准),DES(三重DES),RC4
- 非对称加密(Asymmetric Encryption):非对称加密使用一对密钥,即公钥和私钥。加密和解密过程使用不同的密钥。公钥用于加密,任何人都可以使用公钥加密信息。私钥用于解密,只有拥有私钥的人才能解密用公钥加密的数据
- 加密速度慢,安全性高
- 常见算法:RSA,ECC(椭圆曲线加密),DSA(数字签名算法)
SSL/TLS加密协议
- SSL(Secure Sockets Layer)是早期的加密协议,不再安全。而TLS(Transport Layer Security)是SSL升级版。目前SSL/TLS用于HTTPS提供安全传输协议
- 在握手阶段,客户端与服务器使用非对称加密交换密钥,用于后续通信的对称加密
- 在验证服务器证书是否可信后,生成对称加密密钥。后面双方使用对称加密算法(如AES)加密后续的通信数据
MD5
- MD5(Message Digest Algorithm 5,消息摘要算法5)是一种广泛使用的哈希函数,它将任意长度的输入数据通过一系列复杂的运算转换为固定长度的输出(通常是128位,也就是16字节)。它主要用于生成数据的哈希值(也称为摘要),用于验证数据的完整性
- 特性:不可逆,定长输出(128位16字节的输出),相同输入相同输出,输入敏感性,计算高效性
- 用途:数据完整性验证(文件传输中可以保证传输的文件数据未被篡改)也可以用作数字签名
- MD5 在许多网络协议中得到了广泛应用,比如:
- HTTPS 和 TLS:MD5 曾被用于 HTTPS 和 TLS 协议中的数字签名和证书验证。
- IPSec:IPSec 协议中的一些组件使用了 MD5 进行数据完整性验证。
- 其他网络应用:MD5 也常用于 P2P 网络、文件传输工具、软件分发平台等场景,以验证下载文件的完整性。
HTTP和HTTPS
- HTTP是明文传输,HTTPS通过SSL/TLS进行了加密
- 端口号分别是80和443
- HTTPS需要申请证书
- HTTP连接简单,是无状态的。HTTPS更安全
- HTTPS使用对称加密,非对称加密,哈希函数(主要用于数据完整性验证,如SHA-256)
DNS
- DNS(Domain Name System),解决域名与IP地址映射的问题。实际上就是找要访问URL的网站的IP地址
- 端口号 53:DNS 服务通常使用 UDP 和 TCP 协议进行通信,默认的通信端口是 53。
- UDP 端口 53:用于常规的 DNS 查询(如解析域名到 IP 地址)。
- TCP 端口 53:用于当查询的数据量过大(超过 512 字节)或用于某些特别的操作(如区域传输,Zone Transfer)
- TTL(Time to Live) 是 DNS 记录中的一个字段,用于指定该记录在 DNS 解析器(缓存服务器)中存储的有效时间。在 TTL 到期后,缓存的记录将失效,需要重新向权威 DNS 服务器发起查询
- DNS 中毒(DNS Cache Poisoning):是一种DNS攻击方式。可能会造成网络欺诈,流量劫持,数据泄露,阻断访问
TCP连接如何确保稳定性
- 工作过程:
- 三次握手(建立连接)
- 数据传输
- 四次挥手(四次挥手)
- 优势
- 可靠性(保证数据传输的可靠,适用于高可靠性传输的场景),有序性(数据包按序到达)
- 流量控制和拥塞控制(动态调整,避免网络过载和数据丢失)
- 数据块大小控制
- 序列号
- 校验和
- 流量控制
- 拥塞控制
- 慢启动
- 拥塞避免
- 超时重传
- 快速重传
- 拥塞窗口调整
- 确认应答
- 超时重传
TCP和UDP区别
| 特性 | TCP | UDP |
|---|---|---|
| 连接类型 | 面向连接(需要建立和关闭连接) | 无连接 |
| 可靠性 | 提供可靠传输,数据包有序且无丢失 | 不保证可靠性,可能丢包、乱序 |
| 数据校验 | 有错误检测和校验 | 没有可靠的错误检测机制 |
| 流量控制和拥塞控制 | 有 | 没有 |
| 速度 | 较慢(因可靠性机制引入的开销) | 较快(无额外的可靠性开销) |
| 适用场景 | 文件传输、电子邮件、网页等 | 流媒体、在线游戏、VoIP 等实时应用 |
- 当然也可以实现可靠传输的UDP协议,只需要把TCP的特性在应用层上实现,就可以实现一个可靠传输的UDP协议
相关协议
- ICMP(Internet control message protocol):互联网控制报文协议。告知网络包传送过程中产生的各种错误和各种控制信息,确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等
- ARP:根据IP地址查询相对应的以太网MAC地址,具有ARP缓存,可以存储部分MAC地址(查询是在以太网中以广播的方式查询)
- RARP:已知MAC地址查找IP地址,例如将打印机连入网络,一般就用这个
- DHCP:电脑通过DHCP动态获取IP地址
- IP
- 具有寻址能力(寻找IP地址),路由能力(找到目标地址子网然后发送数据)
- 通常可以分为网络号(标识IP地址属于哪个子网)和主机号(标识同一子网下的不同主机)
- 将子网掩码与IP按位与计算,就可以得到网络号和主机号
- IP和MAC的区别就是,IP在两台没有直连的网络之间通信传输,而MAC在两台直连的网络之间传输
- HTTP
- HTTPS
- TCP(Transmission Control Protocol,传输控制协议)是网络通信中最重要的协议之一,属于 TCP/IP 协议栈的传输层。TCP 主要用于在计算机网络中提供可靠、有序、面向连接的数据传输服务
- ARQ(Automatic Repeat Request,自动重传请求):当接收方接收到数据包,向发送方发送确认(ACK)。当发送方发送数据包后,等待一段时间如果没有收到确认,则重新发送
- SSL/TLS
- NAT(网络地址转换):将私有IP地址转换为公有IP地址。例如一个子网下的两台主机与网络外的某台主机通信的时候,可以使用NAPT(网络地址与端口转换)协议,规定第一台使用1025端口第二台使用1026端口进行通信,而这两台主机使用相同的公有IP地址,这样就减少了IP地址的消耗速度
全双工,半双工,单工
- 全双工(Full-Duplex):双方可以同时发送消息和接收消息。电话,以太网,WIFI
- 半双工(Half-Duplex):双方只能交替发送或接收消息,同一时刻只能有一方在发送消息。对讲机
- 单工(Simplex):一方接收,一方发送。广播,电视
网络文件系统
- CLient-side caching: 客户端缓存,将经常访问的数据存储在客户端本地,从而减少了每次都需要从服务器获取数据的次数,显著降低了延迟并加快了访问速度,减少对文件服务器的网络请求,也能降低服务器的负载,从而进一步提升分布式文件访问的系统性能(高频访问数据的系统,离线系统,Web应用静态资源)
- Server-side compression: 减少带宽占用,但压缩和解压文件会引入额外的开销,可能增加延迟(适用于带宽受限的环境(压缩减小文件大小),内容传输网络(CDN,压缩加快传输速度))
- Encrypted File Transmission:文件加密传输(安全性高的应用,VPN保证远程访问的安全性,电子邮件/文件传输)
- Synchronous Replication: 同步复制(保证数据一致性,适用于高可靠性和容错要求极高的系统,应用在分布式数据库)
IP协议
- IPV4:共32位,分为ABCDE类地址,ABC类主要分为两个部分网络号和主机号。
- 主机号全为1代表指定网络下的所有主机,用于广播
- 主机号全为0指定某个网络
- CIDR无分类地址
- 形式为a.b.c.d/x,x代表前x位属于网络号,x范围是0~32
- 子网掩码:可以掩盖掉主机号只得到网络号。将子网掩码和IP地址按位AND,就可以得到网络号。同时子网掩码可以进一步做网络划分(将主机号划分为子网网络地址和子网主机地址)
- 私有IP和公有IP:私有IP可以重复,由内部管理员自行管理;公有IP由权威机构进行管理
- 环回地址localhost: 127.0.0.1, 使用这个IP时,数据包不会流向网络
- IPV6:128位地址,16位为一组
- 有以下几种类型地址:单播地址(一对一),组播地址(一对多),任播地址(用于通信最近的节点)
- ICMP协议
- 可以实现ping的功能,向目标主机发送查询报文类型,利用回送消息(这个消息可以判断发送的数据包是否成功到达另一端)
- ICMP报文是包括在IP包里面的,工作在网络层(IP也工作在网络层)
- 包头类型字段分为查询报文类型和差错报文类型
回环地址
- IPV4中是127.0.0.1,IPV6中是::1(::代表前面全部都是0)
- 127.0.0.1是回环地址,localhost是域名,但默认等于127.0.0.1
- ping回环地址和ping本机地址是一样的,走的是lo0”假网卡”,都会经过网络层和数据链路层等逻辑,但是在最后在快要出网卡前,将数据插入到一个链表后就软中断通知ksoftirgd来进行收数据的逻辑,不会出本机网络。所以断网了也能ping通回环地址
- 如果服务器listen的是0.0.0.0地址,代表监听了本机所有的IPV4地址,包括127地址与本机IP地址,所以使用127与IP,都可以访问到
网络系统
- 包括Linux通信与网络通信,Socket,TCP通信等等,具体可以看下面这个文章
- 小林coding:解释select/poll/epoll -> https://xiaolincoding.com/os/8_network_system/selete_poll_epoll.html#%E6%80%BB%E7%BB%93
- 相关的内容在Linux_Network.md中也有
RPC(Remote Procedure Call)方法
- 是一个协议,基于TCP协议衍生的一个RPC协议。基于TCP衍生的协议比如就有HTTP与RPC协议
- RPC即是希望像调用本地Function一样调用远程服务器上的Function,常见的有gRPC协议。比如可以用做公司内部集群的通信,用于公司内部微服务通信
高性能网络模式
阻塞IO,非阻塞IO,同步IO,异步IO
- 阻塞IO:当用户程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到到应用程序的缓冲区中,当拷贝过程完成,read才会返回。阻塞等待的是内核数据准备和数据拷贝的过程
- 非阻塞IO:应用程序发送read请求,若数据未准备好,直接返回,此时用户程序可以继续往下执行。然后应用程序不断使用read轮询内核,如果还是没有准备好数据,依然会立即返回。直到数据准备好,内核将数据拷贝到应用程序缓冲区,read调用获取到结果。
在这种情况下,非阻塞IO的应用程序仍然需要等待数据拷贝的时间 - 阻塞IO和非阻塞IO其实都是同步IO,因为用户程序发出的read指令都需要进行等待(最少都需要等待数据拷贝的时间)
- 异步IO:用户程序发送read,若数据未准备好,直接返回并继续执行。内核准备好数据后自动将数据进行拷贝,从内核拷贝到应用程序,当拷贝完成向应用程序发送消息通知。应用程序再调用read直接读取即可
Reactor
- 非阻塞同步的网络IO多路复用
- redis,nginx,netty都采用这个模式设计的思想,同时Muduo网络库也采用这个模型
- 实际上是IO多路复用的一层封装,收到事件后,根据事件类型分配给某个进程/线程(Dispatch)
- Reactor主要由Reactor和处理资源池组成:
- Reactor 负责监听和分发事件,事件类型包含连接事件、读写事件。可以单个reactor也可以多个
- 处理资源池负责处理事件,如read -> 业务逻辑 -> send。可以单个进程/线程,也可以多个进程/线程
- 因此主要有下面几种模型:
- 单Reactor单进程/线程: 不适合计算密集型的场景,只适用于业务处理非常快速的场景。如果一下子有大量请求访问,会比较慢,同时只有一个进程,无法利用多核CPU的性能。同时因为只有单进程,在业务处理时是不能处理其他事务的
- 单Reactor多线程/进程:可以利用多核CPU的性能。但是只有一个Reactor承担所有事件的通知和响应,在面对瞬间高并发请求时候是性能瓶颈
- 多Reactor多进程/线程(主要)
多Reactor多进程/线程

- 主要工作流程:
- 主线程中的MainReactor对象通过select监控连接建立事件,收到事件后通过Acceptor对象中的accept获取连接,将新的连接分配给某个子线程;
- 子线程中的SubReactor对象将MainReactor对象分配的连接加入select继续进行监听,并创建一个Handler用于处理连接的响应事件。
- 如果有新的事件发生时,SubReactor对象会调用当前连接对应的Handler对象来进行响应。
- Handler对象通过read -> 业务处理 -> send的流程来完成完整的业务流程
- 优点和与其他模型对比:
- 主线程和子线程分工明确,主线程只负责接收新连接,子线程负责完成后续的业务处理
- 主线程和子线程的交互很简单,主线程只需要把新连接传给子线程,子线程无须返回数据,直接就可以在子线程将处理结果发送给客户端
Proactor
- 异步网络模式,就如异步IO一样,Reactor感知的是就绪的可读写事件,而proactor感知的是已经完成的可读写事件

- 工作过程
- Proactor Initiator负责创建Proactor和Handler对象,并将Proactor和Handler都通过Asynchronous Operation Processor注册到内核;
- Asynchronous Operation Processor负责处理注册请求,并处理I/O操作
- Asynchronous Operation Processor完成I/O操作后通知Proactor
- Proactor根据不同的事件类型回调不同的Handler进行业务处理
- Handler完成业务处理
一致性哈希算法
- 一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时,发生过多的数据迁移的问题
- 基本思路:将所有节点映射在一个哈希环上。当进行查询的时候,对查询键值进行哈希运算后,可以确定在环上的位置,此时向后顺时针找到的第一个节点就是想要找到的节点(当节点数量变化的时候,只影响后续第一个位置的节点映射关系,大大减小开销)
- 在一致哈希算法中,如果增加或者移除一个节点,仅影响该节点在哈希环上顺时针相邻的后继节点,其它数据也不会受到影响(缺点是存在雪崩问题)
- 为了提高均衡度,可以把向哈希环添加真实节点变为添加虚拟节点,虚拟节点会映射到真实节点。每个真实节点可以包含多个虚拟节点(如nginx中权重为1的节点有160个虚拟节点)
- 虚拟节点除了会提高节点的均衡度,还会提高系统的稳定性。当节点变化时,会有不同的节点共同分担系统的变化,因此稳定性更高。也可以为硬件配置更好的节点增加权重,比如对权重更高的节点增加更多的虚拟机节点即可