计算机网络
网络体系结构
常用的计算机网络体系结构有 OSI 七层模型和 TCP/IP 四层模型
- OSI 七层模型:分为应用层、表示层、会话传输层、网络层、数据链路层、物理层
- TCP/IP 四层模型:分为应用层、传输层、网络层、数据链路层
- 数据链路层:负责处理物理层,比如以太网、光纤
- 网络层:处理数据的路由和转发,主要的协议是 IP 协议
- 传输层:负责端到端通信,提供可靠性和错误检测,常用的协议有 TCP 和 UDP
- 应用层:包含各种应用程序,常用的协议有 HTTP
每层对应的协议
- 应用层:HTTP HTTPS FTP SMTP DNS
- 传输层:TCP UDP
- 网络层:IP
- 数据链路层:ARP
从浏览器地址栏输入 url 到显示主页的过程?
发送请求:
- 应用层:
- 用户在浏览器输入网址后,回车确认后
- 浏览器会发起一个 DNS 查询请求(使用 UDP 协议,端口 53),询问域名对应的 IP 地址
- DNS 服务器返回域名对应的 IP 地址
- 传输层:
- 浏览器使用 HTTP 协议(端口 80)或者 HTTPS 协议(端口 443)和网站的服务器建立连接
- 这涉及到三次握手过程(SYNSYN+ACKACK),确保客户端和服务器之间建立可靠的连接
- 网络层:
- IP 路由:在建立 TCP 连接后,数据包被封装到 IP 数据包中,并且通过路由器传输
- 在物理层和链路层,数据被转换成比特,并在网络硬件上进行传输
处理请求:
- 应用层:
- 服务器收到浏览器发来的 HTTP 请求后,处理请求,可能还会涉及到负载均衡等技术,确保请求被转发到最合适的服务器
- 服务器使用数据库和图像等资源构建网页,并将网页内容通过 HTTP 请求返回到浏览器
- 传输层:
- 服务器将网页内容封装在 TCP 数据包,建立 TCP 连接,同样通过网络层、链路层和物理层传给客户端
浏览器收到服务器发送的数据包后,开始解析响应内容,然后渲染页面,并显示页面给用户
- 服务器将网页内容封装在 TCP 数据包,建立 TCP 连接,同样通过网络层、链路层和物理层传给客户端
网络丢包怎么解决
网络丢包是指在数据包从源到目的地的传输过程中,某些数据包未能成功到达目的地。网络丢包可能由各种原因引起,包括网络拥塞、硬件问题、路由问题和安全策略等
- 检查本地网络:首先,检查本地网络连接,确保网线、无线连接和网络设备(路由器、交换机等)没有问题。不稳定的本地网络连接可能导致丢包。
- 检查目标服务器:
- 如果丢包问题只发生在特定目标服务器或服务上,尝试访问其他服务器以确定是否是目标服务器的问题。有时,问题可能是服务器端的网络配置或负载问题。
- Ping 测试:
- 使用 Ping 命令来测试网络连接,查看是否有数据包丢失 “`
- 如果您在 Ping 测试中看到丢包,注意 Ping 响应的时间,以确定是否有网络延迟或拥塞。
- 网络拥塞:
- 如果丢包是由网络拥塞引起的,可以尝试在非高峰时段进行操作
- 路由问题:
- 路由问题可能导致数据包在传输过程中走错路径。联系网络管理员,确保路由配置正确。
- 防火墙和安全策略:
- 防火墙和安全策略可能会丢弃某些数据包。检查防火墙和安全策略设置,确保它们不会导致数据包丢失。
- 更新驱动程序:
- 如果您使用网络适配器,确保您的网络适配器驱动程序是最新版本。过时的驱动程序可能导致网络问题。
- 检查硬件:
- 检查网络硬件,包括网线、路由器、交换机和网络适配器,确保它们没有故障或连接问题。
- 使用故障排除工具:
- 使用网络故障排除工具来捕获网络数据包以进一步分析问题。工具如 Wireshark 可以帮助您识别丢包的根本原因。
WebSocket 与 Socket
- WebSocket 是应用层通信协议,用来与服务器建立持久连接
- Socket 是网络编程的接口,对传输层协议进行封装
端口及服务
- 21:FTP(文件传输协议)
- 22:SSH
- 53:DNS(域名解析)
- 80:HTTP(超文本传输协议)
- 443:HTTPS
- 3306:MySQL 默认端口号
DHCP 协议
动态主机配置协议,用于自动分配 IP 地址,使用 UDP 协议工作
ICMP
功能?
- ICMP,网际控制报文协议
- 是一种面向无连接的协议,用于传输出错报告控制信息,是网络层协议
在本地 PC ping 到发出 ICMP echo request 的过程
ping 是一种网络工具,用来测试网络连接和确定设备之间的延迟,当 ping 命令被执行时
- 检查本地缓存和 hosts 文件:首先,Ping 命令首先会检查本地 DNS 缓存和本地的 hosts 文件,以查找目标 IP 地址。如果找到 IP 地址,那么 Ping 命令将不需要进行 DNS 解析
- DNS 解析:如果本地缓存和 hosts 文件中没有目标 IP 地址的记录,就进行 DNS 解析。从根域名服务器开始,经过顶级域名服务器和二级域名服务器,最终获取到目标域名对应的 IP 地址
- 路由表查找和 ARP 缓存:获得目标 IP 地址后,查询本地路由表,以确定如何将数据包发送到目标 IP 地址。路由表中通常包含了网关(下一跳路由器)的 IP 地址 然后查找 ARP(地址解析协议)缓存,获取网关的 MAC 地址。如果 ARP 缓存中没有网关的 MAC 地址,就进行 ARP 解析
- 构建 ICMP Echo Request 数据包:目标 IP 地址和网关的 MAC 地址确定后,构建一个 ICMP Echo Request 数据包。这个数据包包含了目标 IP 地址、源 IP 地址、以及 ICMP 包头信息,如 Type 8(Echo Request)、Code 0 等
- 数据包发送:将构建的 ICMP Echo Request 数据包发送到本地 PC 的网卡,并将其封装在数据链路层的帧中
- 目标主机响应:ICMP Echo Request 数据包到达目标主机后,目标主机将解析这个数据包,生成一个 ICMP Echo Reply 数据包,并将其发送回到 Ping 命令的发起者
- Ping 命令解析响应:Ping 命令会解析接收到的 ICMP Echo Reply 数据包,并计算往返时间(Round-Trip Time,RTT)等信息,然后在终端窗口中显示响应时间和其他相关信息
http 中的缓存过期时间
- 如果 HTTP 响应中包含 Cache-control: max-age 这个标头,缓存的过期时间就是 max-age 中指定的秒数
- 如果没有 Cache-control 标头,则查看是否包含 Expires 属性,通过比较 Expires 的值和标头里面 Date 属性的值来判断是否缓存还有效
- 如果都没有,查找 HTTP 响应中的 Last-Modified 信息。如果有,根据 rfc2626,缓存的过期时间就等于头里面 Date 的值减去 Last-Modified 的值除以 10
DNS
DNS,域名系统,是用于将域名转换为 IP 地址的分布式系统
解析过程
用户在浏览器输入域名后,浏览器向本地计算机的 DNS 客户端发出 DNS 查询请求
- 本地 DNS 首先检查本地 DNS 缓存,看是否已经解析过域名,如果已经解析过,会立即返回 IP 地址
- 如果本地 DNS 没有相关的记录,本地 DNS 会向上游 DNS 服务器发送查询请求
- 上游 DNS 服务器收到请求后,会查找它们的缓存,如果有相关记录,则返回 IP 地址
- 如果上游 DNS 服务器中没有相关记录,会继续向更高级别的 DNS 服务器发送查询请求,直到找到包含域名与 IP 地址对应关系的 DNS 服务器
- 找到后,将 IP 地址给本地 DNS 客户端
- 本地 DNS 客户端将 IP 地址存储在本地缓存中,并将其返回给 Web 浏览器
用途
- 域名解析:将域名解析成 IP 地址
- 负载均衡:DNS 可以配置多个 IP 地址与同一个域名相关联,将流量分散到不同的服务器
- DHCP 使用 DNS 为设备动态分配 IP 地址
- DNS 客户端通常会维护本地 DNS 缓存,加快域名解析过程
类型
- A 记录:将域名映射到 ipv4 地址
- AAAA 记录:将域名映射到 IPv6 地址
- CNAME 记录:创建域名的别名,将一个域名映射到另一个域名
- TXT 记录:用于存储文本信息
- MX 记录:指定接收域名的电子邮件的服务器
- PTR 记录:用于将 IP 地址映射回域名,通常用于反向 DNS 查找
命令 – DNS 协议问题排查
- nslookup 命令可用于查询域名的 DNS 信息,包括域名解析和反向 DNS 查找
- dig 命令可提供详细的 DNS 信息
- traceroute 命令可用于跟踪数据包从源到目标主机的路由路径。可以显示数据包在路由过程中经过的每个路由器,可以用于确定是否存在 DNS 解析问题
- ipconfig 命令用于显示网络接口的配置信息,包括 DNS 服务器
迭代和递归 DNS 查询
- 迭代查询是 DNS 服务器将查询请求逐级转发,直到找到答案或者到达终点(权威 DNS 服务器)为止。每个 DNS 服务器只回答下一个查询的目标 DNS 服务器,不负责查找完整的答案
- 而递归查询则是 DNS 服务器在查询过程中负责连续地向下级 DNS 服务器发起查询,直到找到完整的答案,然后一路返回答案给客户端
DNS 不起作用 – 情况
- 域名不能解析,只能使用 IP 地址访问网站
- DNS 不仅用于域名解析,还用于电子邮件路由,如果 DNS 不起作用,电子邮件服务器将无法查找目标服务器,会导致邮件传递失败
HTTP
状态码
- 1XX:信息性状态码
- 2XX:成功状态码
- 3XX:重定向状态码
- 4XX:客户端错误状态码
- 5XX:服务器错误状态码
- 101: 切换请求协议
- 200: 请求成功
- 301: 请求资源永久移动,返回新 URI
- 302: 请求资源临时移动
- 400: 客户端请求的语法错误
- 403: 服务端拒绝执行客户端请求
- 404: 请求资源找不到
- 500: 服务器内部错误
请求方式
- GET:请求获取资源
- POST:提交数据
- PUT:修改资源
- DELETE:删除资源
GET 和 POST
- 使用场景不同:GET 请求主要用于查询数据。POST 请求主要用于提交数据和修改数据
- 请求参数的传递方式不同:GET 请求的参数信息会附加在 URL 后面,POST 请求的参数信息在方法体中传递,不会在 URL 显示
- 数据安全性不同:GET 请求的信息在 URL 明文传输,不安全;POST 将请求信息放在方法体,相对而言更加安全
- 缓存机制不同:GET 请求可以被浏览器缓存,以提高页面加载速度;POST 请求不会被浏览器缓存
GET 的长度限制
- GET 请求的长度限制没有被明确定义
- 但是通常浏览器会限制发送的 GET 请求长度。
请求过程
- 建立 TCP 连接:客户端向服务器发送 TCP 连接请求,服务器接收到请求后建立 TCP 连接
- 发送 HTTP 请求报文:客户端向服务器发送 HTTP 请求报文,包括请求方法、URL、请求头信息等
- 服务器响应 HTTP 请求:服务器接收到请求报文后,根据请求内容进行处理,并向客户端发送 HTTP 响应报文,包括响应状态码、响应头信息、响应内容等
- 关闭 TCP 连接:客户端接收到服务器的响应后,关闭 TCP 连接
报文结构
HTTP 报文由三个部分组成:起始行、首部和消息实体
- 起始行:描述请求和响应的基本信息,包括方法、URL、协议版本等
- 首部:主要包含报文长度、报文类型等
- 消息实体:包含实际的请求或者响应的数据
URI 和 URL
- URI:Uniform Resource Identifier 统一资源标识符
- URL:Uniform Resource Location 统一资源定位符
- URL 是一种常用的 URI
HTTP 1.0,1.1,2.0
HTTP1.0 默认是短连接,可以强制开启长连接;HTTP1.1 默认长连接,HTTP2.0 采用多路复用
- HTTP1.0: 默认使用短连接,每次请求都需要建立一个 TCP 连接。可以强制开启长连接
- HTTP1.1: 默认使用长连接,连接默认不关闭,可以被多个请求复用
- HTTP2.0: 采用多路复用,客户端和服务器都可以同时发送多个请求或回应,不用按照顺序一一对应
HTTP 3
HTTP3 主要有两点变化:
- 传输层基于 UDP 进行通信
- 使用快速 UDP 网络连接 (QUIC,Quick UDP Connections) 保证安全性
长连接
- HTTP 长连接通过复用一个 TCP 连接,来发起多次的 HTTP 请求,这样可以减少资源的消耗
实现长连接?什么时候会超时?
- HTTP1.0 通过在头部设置 Connection 字段为 keep-alive,强制开启长连接
- HTTP1.1 以后默认都是长连接
- 长连接的超时时间内客户端没有发送 HTTP 请求到服务器,服务器就会关闭连接
HTTP 与 HTTPS 区别
- 安全性:HTTP 使用明文方式传输数据,不加密;HTTPS 使用 SSL 协议加密,更加安全
- 端口号:HTTP 使用端口号 80,HTTPS 使用端口号 443
- 效率:HTTPS 需要加密解密,所以 HTTPS 的效率比 HTTP 低
为什么用 HTTPS
- 使用 HTTPS 可以提高网络通信的安全性
- 解决的问题:窃听、篡改、冒充
HTTPS 工作流程?
- 客户端发送 HTTPS 请求
- 服务器收到请求后,发送证书给客户端
- 客户端收到证书后,验证证书的合法性。如果证书有效,生成随机秘钥,用证书的公钥加密,然后发送秘钥到服务器
- 服务器接收到秘钥后,用私钥解密得到客户端的秘钥
然后用秘钥对数据进行加密,然后将加密后的数据发送给客户端 - 客户端收到后,用密钥进行解密,得到服务器返回的数据
为什么 HTTPS 使用混合加密
直接使用非对称加密不行吗,为什么后面又使用对称加密?
非对称加密的安全性高,但是计算成本较高,HTTP 在握手过程使用非对称加密,这一阶段的目的是安全进行交换对称密钥,得到共享的对称密钥,后续通信采用对称加密,提高通信效率
HTTP 协议是无状态的
- HTTP 协议是无状态的,是指 HTTP 协议中服务端不会保存客户端的任何状态信息
- 主要有两个办法记录状态:Session Cookie
Session Cookie
Session 和 Cookie
- 联系:
- 都是用来保存用户信息的
- 都是在 HTTP 请求和响应中传递数据的
- 区别:
- Cookie 存储在客户端,Session 存储在服务器
- Cookie 的存储容量有限,Session 的存储容量没有限制
- Cookie 是浏览器自动发送到服务端,而 Session 需要手动创建和管理
- Cookie 可以设置过期时间,过期失效,而 Session 默认过期时间很短
- Cookie 可以被禁用,Session 不会受到影响
分布式环境下 Session
- 通常使用会话粘性技术,在一定时间内将同一个用户的请求转发到同一个服务器上
- 同时使用 Redis 等分布式缓存数据库来存储 Session
TCP
TCP 三次握手
- 第一次握手(SYN 连接请求):客户端发送 SYN 数据包到服务器,请求建立连接。该数据包包含一个随机序列号
- 第二次握手(SYN+ACK 确认请求):服务器收到客户端的数据包后,发送一个 SYN+ACK 数据包回应客户端
这个数据包也包含一个随机序列号,并设置确认号 ACK 为收到的随机序列号 +1,表示已经收到客户端请求 - 第三次握手(ACK 确认):客户端收到服务器的数据包后,对数据包进行回应,发送 ACK 数据包,并设置确认号为服务器的序列号 +1,表示已经确认收到服务器的数据包,并准备好与服务器进行通信,此时客户端进入连接建立完成状态
服务器收到 ACK 数据包后,也进入连接建立完成状态
为什么是三次
- 不能是两次?
- 防止服务器开启一些无用的连接增加服务器开销
- 防止服务器接收到已失效的连接请求,响应错误
- 不能是四次?
- 三次握手已经可以创建足够可靠的连接,多一次握手会造成额外的开销
三次握手中每一次没收到报文会发生什么情况?
- 第一次握手:服务器没收到报文,所以服务器不会进行任何操作,而客户端由于一段时间内没有收到服务端发来的确认报文,等待一段时间会重新发送。直到发送次数超过最大重传次数限制,就会返回连接建立失败
- 第二次握手:客户端没收到服务器的响应报文,客户端会继续重传,直到次数限制;服务器会阻塞在 accept() 处,等待客户端发送 ACK 报文
- 第三次握手:服务器没收到客户端的报文,服务端也采用超时重传机制,如果重传超过次数限制,会返回服务端建立连接失败
此时客户端认为自己已经建立连接成功,因此对服务器发送数据,但是此时服务器不在监听状态,因此服务端收到客户端发送来的消息的时候会发送报文给客户端,消除客户端单方面建立连接的状态
第二次握手传回了 ACK,为什么还要传回 SYN?
- ACK:是为了告诉客户端,服务器接收成功数据
- SYN:是为了告诉客户端,服务端响应的是客户端发送的报文
第 3 次握手可以携带数据吗?
- 可以,因为此时对于客户端来说,已经成功建立连接
- 第一次不可以是出于安全的考虑。如果允许携带数据,攻击者会在报文中携带大量的数据,就会消耗服务器的资源
半连接队列和 SYN Flood 攻击的关系
- 半连接队列:TCP 三次握手的过程中,服务器在收到客户端的 SYN 后,会将 SYN 放入队列,等待客户端发送 ACK 确认消息,建立连接
全连接队列:服务器收到客户端的 ACK 消息后,将连接推入 accept 接收队列,即全连接队列 - SYN Flood 攻击:一种常见的 DDoS 攻击,攻击者会发送大量的虚假的 TCP 连接请求,服务器为了处理这些请求而将大量的资源用于维护半连接队列,从而无法正常响应正常的请求
- 可以采用的应对方案:限制半连接队列长度,配置防火墙,使用 SYN Cookie 等
TCP 四次挥手
- 第一次挥手:客户端向服务器发送 FIN 报文段,表示不会再有数据发送到服务端
- 第二次挥手:服务端返回 ACK 报文段,表示服务端已经收到客户端的 FIN
- 第三次挥手:服务端向客户端发送 FIN 报文段,表示不会再向客户端发送数据,并且停止接收客户端发送的数据,
- 第四次挥手:客户端发送 ACK 报文段,表示已经收到服务端的 FIN,并进入 time_wait 状态,等待固定时间后,没有收到服务端的 ACK,认为服务器已经正常关闭,关闭连接。服务器收到这个 ACK 报文后,关闭连接。
挥手为什么四次
- 服务器收到客户端的 FIN 报文时,此时服务器可能还有数据需要处理和发送,所以先回答一个确认收到
- 直到服务器不再发送数据的时候,发送一个 FIN 报文表示现在可以关闭连接
等待 2MSL
- 为了避免客户端发送的报文段在网络中丢失,而服务端又没有收到关闭连接的消息,从而导致服务器的资源一直被占用(MSL 是报文最大生存时间,超过这个时间报文将被废弃)
保活计时器
- 在客户端意外关闭的时候,保证服务器能够关闭连接
- 服务器每次收到客户端的数据,就重新设置保活计时器,若超过时间,服务端就发送探测报文段,如果连续发送多个无响应,则服务端就认为客户端故障,关闭连接
CLOSE-WAIT 和 TIME-WAIT
- CLOSE-WAIT:服务器收到客户端的 FIN 报文后,就会进入 CLOSE-WAIT 状态,此时服务器可能还有数据没有传输完成,不能立即关闭连接
- TIME-WAIT:第四次挥手时,客户端向服务器发送 ACK 报文段后,就会进入 TIME-WAIT 状态,避免出现僵尸连接,即客户端发送的报文段在网络中丢失,而服务端又没有收到关闭连接的消息,从而导致服务器的资源一直被占用
TIME_WAIT 状态过多问题
- 占用内存资源和端口资源
- 怎么解决:
- 使用 so_reuseassr 选项,允许端口被重复使用,减少 TIME_WAIT 状态的生成数量
- 使用长连接的方式来减少 TCP 的连接和断开
TCP 报文首部的格式
TCP 可靠性
- 连接管理:TCP 使用三次握手和四次挥手保证了创建连接和关闭连接的可靠性
- 校验和:使用首部和数据的校验和来检测数据在传输过程中是否发生变化
- 序列号/确认应答:每个数据包都有序列号,接收方会将已经成功接收成功的数据包的序列号发送给对方作为下一次的发送位置的确认号
- 流量控制:TCP 会根据接收方的接收速度来控制发送方的发送速度
- 超时重传:每次发送数据包后,都会等待对方的确认。如果在一定时间内没有收到确认的数据包,就会重传数据包
- 拥塞控制:TCP 会检测网络拥塞的程度来调整发送速度
TCP 的流量控制
- TCP 的流量控制是通过使用滑动窗口机制来实现的
- 发送方在发送数据时会根据对方反馈的窗口大小,控制发送的速率
- 如果发送方发送的数据窗口超过了接收方的窗口大小,接收方会发送一个通知,告知发送方需要减慢发送速度
TCP 的滑动窗口
- TCP 的滑动窗口是用于流量控制和堵塞控制的一个功能,用来限制发送端向接收段发送的数据量,以防止网络堵塞
- 滑动窗口的大小由发送方和接收方的通信双方协商决定,是一个动态的值,根据网络的状况不断变化
- 接收方接收数据后,将收到的数据逐个进行确认,并将下一个期待接收的序列号发送给发送方
- 发送方维护一个滑动窗口,该窗口的大小和对方接收缓存的大小相同,用于控制发送的速率
- 发送方每发送一个数据包后,将滑动窗口的窗口向前移动一个数据段的大小。如果发送方没有收到确认,就会继续发送数据
- 如果滑动窗口的大小为零,停止发送数据,直到接收到确认信息并滑动窗口变的大于零为止
Nagle 算法和延迟确认
- Nagle 算法:将小数据包集成到一个大的数据包中一次性发送,从而减少网络资源的消耗,主要通过在发送端对数据进行缓存和批量处理来实现
- 延迟确认:接收方收到数据包后,不会立即向发送方发送确认报文,而会等待一段时间,如果在这个时间收到其他数据包,会一起确认
TCP 的拥塞控制
TCP 的拥塞控制是指在网络拥塞的情况下,TCP 协议进行流量控制来减少网络拥塞程度,保证数据传输的可靠性
具体来说,TCP 的拥塞控制分为四个流程:
- 慢开始:设置一个拥塞窗口变量。当连接建立后,成功发送一个报文段,就将拥塞窗口增加一倍,呈指数增长,如果出现丢包,拥塞窗口减半
- 拥塞避免:TCP 会跟踪网络的负载情况,如果检测到网络拥塞,拥塞窗口立即返回一个较小的初始值来避免堵塞
- 快重传:发送方连续接收到三个重复的 ACK 时,就会立即重传数据,不等待重传请求包
- 快恢复:TCP 被强制中断的情况下,若收到重复的 ACK,拥塞窗口只增加 1
TCP 的重传机制
- 超时重传:在发送方发送一个数据包后,会设置一个定时器,如果在规定的时间内没有收到接收方的确认,则发送方会进行超时重传
- 快速重传:当发送方连续收到接收方的 3 个重复的确认时,就会触发快速重传,这时发送方会立即重传数据,不等待重传请求包
- SACK:一种选择性确认的机制,接收方可以指定已经接收的数据包序列范围,发送方可以根据这些信息进行重传
TCP 的粘包和拆包
TCP 的粘包和拆包是由于 TCP 协议是面向流的协议,它只关心字节流的传输,不知道数据的边界。因此,在发送端和接收端可能会出现数据粘在一起的情况,也可能会出现将一个完整的数据包拆成了多个数据包的情况,这就是 TCP 粘包和拆包问题
解决方法:
- 定长传输:发送端将每个数据包封装成固定长度
- 加载特殊字符:在数据尾部增加特殊字符进行分割
- 实现自定义协议:在协议中定义数据包的格式
TCP UDP
TCP 和 UDP 的区别
- TCP 是面向连接的,UDP 是无连接的
- TCP 数据传输是可靠的,UDP 数据传输不可靠
- TCP 有流量控制和拥堵控制机制
- TCP 适合对可靠性要求高的场景,例如文件传输和邮件传输;UDP 适合要求效率高,对可靠性要求低的场景,例如视频、音频等
为什么 QQ 采用 UDP 协议?
- QQ 不是完全基于 UDP 协议的,在进行文件传输的时候,会使用 TCP 保证可靠传输
- 使用 UDP 进行通信效率高,延迟低,占用资源小,对服务器的压力小。TCP 需要建立连接,网络开销比较大
DNS 为什么要用 UDP?
DNS 使用 UDP 也使用 TCP
- 进行数据同步传送时,为了保证数据的正确性,需要使用基于可靠连接的 TCP
- 客户端查询域名的时候,不需要创建连接,使用 UDP 可以提高响应速度
IP
IP 协议的定义和作用
- IP 协议,也称为互联网协议,定义了数据包在网络间的传输方式和地址规范。
- 它的作用是将数据包从源主机路由到目标主机,从而实现网络上的数据通信
- 具体来说,IP 协议的主要作用包括:
- 定义了 IP 地址
- 划分了 IP 地址的地址空间
- 使用寻址和路由将数据包从源设备发送到目标设备
- 使用分组交换技术,将数据分割封装
- 支持多种写一个,如 TCP 和 UDP 等
分类
- IPv4:分为 ABCDE 类地址
- IPv6:表示为 8 组 4 位的十六进制数
域名和 IP 的关系
- 域名和 IP 之间有一一对应的关系
- 每个域名都对应唯一的 IP 地址,一个 IP 地址可以对应多个域名
IPV4 地址不够如何解决
- DHCP:动态主机配置协议,同一个 MAC 地址的设备,每次接入互联网的 IP 地址不一定相同
- CIDR:无类别域间路由,消除传统 ABC 类地址和划分子网的概念
- NAT:网络地址转换协议,使不同局域网主机可以使用相同 IP 地址
- IPv6 协议:可以实现 2 的 128 次方个地址
ARP 协议的工作过程
ARP 协议,地址解析协议,用于实现 IP 地址到 MAC 地址的映射。工作过程如下:
- 当主机 A 要发送数据包给主机 B 时,首先查找本地的 ARP 缓存,看是否有目标地址的映射表
如果能找到,就直接讲数据包发送给目标主机 B - 如果 ARP 缓存中没有目标地址的映射表,主机 A 就会向本地子网内所有主机发送 ARP 广播包
- 其他主机收到 ARP 广播后,首先比较广播包中的目标 IP 地址是否与自己的 IP 地址相同
如果相同,就向主机 A 发送 ARP 响应包,包含自己的 Mac 地址 - 主机 A 收到 ARP 响应包后,将其缓存到本地 ARP 缓存中,并使用获取到的 MAC 地址向目标主机 B 发送数据包
- 主机 B 收到数据包后,会检查目标 MAC 地址是否和自己的 MAC 地址匹配。如果匹配,则接收数据包,如果不匹配,则丢弃该数据包
为什么有 IP 地址,又有 MAC 地址
- MAC 地址:是数据链路层和物理层使用的地址,是写在网卡上的物理地址,用来定义网络设备的位置,不可变更
- IP 地址:是网络层以上使用的地址,是一种逻辑地址,用来区别网络上的计算机
安全
说说有哪些安全攻击?
- 被动攻击:攻击者窃听
- 主动攻击:篡改、恶意程序,如病毒木马等、拒绝服务 DDos
DNS 劫持了解吗?
- DNS 即域名劫持,是通过将原域名对应的 IP 地址进行替换,从而使用户访问到错误的网站
什么是 CSRF 攻击?如何避免?
- CSRF:跨站请求伪造,是一种挟持用户在当前已登录的程序上执行非本意操作的攻击方法
- 如何避免:
- 添加校验 token
- 敏感操作多重校验
什么是 DoS、DDoS、DRDoS 攻击?
- DoS:拒绝服务
- DDoS:分布式拒绝服务
- DRDoS:分布式反射拒绝服务
什么是 XSS 攻击,如何避免?
- XSS:跨站脚本攻击,恶意攻击者往 Web 页面里插入恶意的 html 代码
- 限制输入长度;HTML 转义
对称加密与非对称加密有什么区别?
- 对称加密:加密和解密使用同一密钥,如 AES
- 非对称加密:加密和解密使用不同的密钥,即公钥和私钥,公钥和私钥是成对存在的,常见如 RSA
RSA 和 AES 算法有什么区别?
- RSA:非对称加密算法
- AES:对称加密算法