计算机网络

1 分层模型

OSI七层模型:

image.png

  • 口诀:物联网书会使用
  • 优点:概念结构清楚,理论完整
  • 缺点:复杂不实用、某些功能在多个层中重复出现。

TCP/IP四层模型:

image.png

为什么要分层?

  • 使得各层之间独立。
  • 提高灵活性和可替换性(高内聚低耦合)。
  • 大问题化小,复杂问题分解。

2 常见网络协议

应用层:

  • HTTP
  • SMTP
  • POP3/IMAP
  • FTP
  • Telnet
  • SSH
  • RTP
  • DNS

传输层:

  • TCP
  • UDP

网络层:

  • IP
  • ARP
  • ICMP
  • NAT
  • OSFP
  • RIP
  • BGP

3 HTTP

image.png

3.1 从输入URL到页面展示发生了什么?

过程:

  1. 用户输入URL。
  2. 浏览器查找域名IP地址(通过DNS:浏览器缓存、路由器缓存、DNS缓存)。
  3. 浏览器根据IP地址和端口号,向目标服务器发起TCP连接请求。
  4. 浏览器与服务器建立TCP连接,并发送HTTP请求报文。
  5. 服务器收到报文进行处理请求,并返回HTTP响应报文给浏览器。
  6. 浏览器收到HTTP响应报文后,解析响应体中的内容,并进行网页渲染,同时根据HTML中其他资源URL再次发起HTTP请求,直到网页完全加载显示。
  7. 浏览器在不需要和服务器通信时,可主动关闭TCP连接,或者等待服务器关闭请求。

使用到的协议:DNS、TCP、IP、OPSF、ARP、HTTP

3.2 HTTP和HTTPS的区别

  • URL前缀不同(http和https)
  • 端口号不同(80和443)
  • 安全性,HTTPS大于HTTP
  • 资源消耗:HTTP优于HTTPS
  • SEO搜索引擎优化:优先显示HTTPS网页

::HTTPS中的S如何实现?::

3.3 HTTP/1.0和HTTP/1.1区别

  • 1.1实现了长连接
  • 1.1加入了大量状态码
  • 1.1有更多的缓存控制机制
  • 1.1支持断点续传

3.4 HTTP/1.1和HTTP/2.0区别

  • 2.0实现了多路复用
  • 2.0使用二进制帧传输(1.1使用文本格式报文)
  • 2.0支持对头部压缩(1.1仅 支持对body压缩)
  • 2.0支持服务器推送,可以减少客户端请求次数。

3.5 HTTP/2.0和HTTP/3.0区别

  • 传输协议:3.0基于QUIC(UDP升级版),提供与TLS/SSL相当的安全性
  • 连接建立:2.0需要经过TCP三次握手外加一个TLS安全握手,需约3个RTT;而3.0由于QUIC的特性,仅需要0个或1个RTT。
  • 队头阻塞:2.0复用一个TCP连接,一旦包丢失,会阻塞所有HTTP请求。3.0一个连接有多个不同的数据流,互不影响。
  • 错误恢复:3.0具有更快的恢复和重传机制,2.0需要依赖于TCP的错误恢复机制。
  • 安全加密:2.0使用TLS协议进行加密,3.0基于QUIC协议,内置加密和身份验证机制,可以提供更强的安全性。

3.6 HTTP是不保存状态的协议,那么如何保存用户状态?

Session机制:通过服务端记录用户状态,时间限制到后销毁Session

Cookie中加入Session ID跟踪。

Session 的主要作用就是通过服务端记录用户的状态。 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。

Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

3.7 GET和POST区别

  • 语义:GET用于查询和获取、POST用于创建和修改
  • 幂等:GET是幂等的,POST不是幂等的
  • 格式:GET将参数放在URL中,POST将参数放在请求体中
  • 缓存:GET适合缓存,POST不适合缓存,由于幂等的原因
  • 安全性:都不安全,但是GET更不安全

4 WebSocket

WebSocket是一种基于TCP连接的全双工通信协议。应用层协议,用于弥补HTTP在持久通信能力上的补足,仅需一次握手就可以创建持久性连接,并进行双向数据传输。

工作过程

  1. 客户端向服务端发送一个HTTP请求,包含Upgrade:websocket和Sec-webSocket-Key等字段;
  2. 服务器收到请求,如果服务器支持,则回复101状态码,表示升级到WebSocket协议
  3. 连接建立,双向传输,数据以帧的形式传输,每条消息可能会被划分为多个帧。
  4. 客户端或服务器主动发送关闭帧,接收方回复关闭帧关闭TCP连接。

Socket建立后,通过心跳机制保持连接稳定性和活跃性。

WebSocket和Http的区别

  • 通信:websocket是双向实时的,而http只能由客户端主动发起。
  • 前缀:websocket使用ww://或wws://
  • 扩展:websocket支持扩展
  • 网络开销:websocket数据格式轻量,开销更小。

Websocket与SSE区别

  • SSE基于HTTP协议,不需要特殊协议或服务器即可实现工作;WebSocket需要单独的服务器处理协议
  • SSE单向通信,只能由服务端向客户端。WebSocket全双工。
  • SSE实现简单,开发成本低;WebSocket传输数据需要做二次解析。
  • SSE默认支持断线重连,WebSocket需要自己实现。
  • SSE只能传送文本消息,二进制数据需要编码后传送,WebSocket默认支持传送二进制数据。

如何选择:对于游戏、即时通信以及需要双向近乎实时更新的场景,拥有双向通道更具吸引力。站内信、未读消息数、状态更新、股票行情、监控数量等场景,SEE 不管是从实现的难易和成本上都更加有优势。此外,SSE 具有 WebSocket 在设计上缺乏的多种功能,例如:自动重新连接、事件 ID 和发送任意事件的能力。

5 TCP & UDP

TCPUDP
是否面向连接
是否可靠
是否有状态
传输效率较慢较快
传输形式字节流数据报文段
首部开销20~60bytes8bytes
支持广播/多播

5.1 TCP三次握手

image.png

过程:

  1. 客户端发送SYN(SEQ=X)标志的数据包到服务器,然后客户端进入SYN_SEND状态等待确认;
  2. 服务端发送带有SYN+ACK(SEQ=Y, ACK=X+1)标志的数据包到用户端,然后进入SYN_RECV状态;
  3. 客户端发送带有ACK(ACK=y+1)标志的数据包给服务端,然后客户端和服务端进入ESTABLISHED状态。

为什么要三次握手:

  1. 第一次握手:S确认接受正常、对方发送正常;
  2. 第二次握手:C确认发送、接受正常,对方发送、接收正常;
  3. 第三次握手:S确认对方接受正常,自己发送正常。

两次握手服务端无法确认自己消息是否被接受,四次效率较低。

第二次握手传回了ACK为什么还要传回SYN?

ACK表示服务端确认收到客户端消息,SYN是为了建立并确认从服务端到客户端的通信。

为什么两次握手不可以?

  1. 避免历史连接: 假设客户端发起连接,但是该请求因为网络阻塞,没有到达服务器,此时客户端尝试重写发起,但是随后历史请求到达服务器,服务器建立连接并发送数据,客户端发现这个数据并不是此时需要的,于是RST终止连接,过了一段时间后,新的请求才到达服务器,建立起真正需要的连接。这种情况下,两次握手由于没有中间的服务器状态,无法过滤历史连接,会造成资源浪费。
  2. **同步双方序列号:**TCP的可靠传输是基于序列号的,而双方相互确认序列号,都需要向对方发送序列号并得到确认,进一步可以优化为3次握手,而两次握手只能确认一方的序列号被对方接受。
  3. **避免资源浪费:**与第一种情况类似(第一种情况时旧的请求先到,这种情况是旧的请求后到,导致建立无用的空连接)。

为什么不使用四次握手?

双方建立起一个可靠的TCP连接,需要相互确认序列号,而服务器确认客户端序列号时,可以同时把自己的序列号也送出,可以减少开销。

为什么每次建立TCP连接时,初始化的序列号都要求不一样?

为了防止在网络中阻塞的历史报文被新的连接接受,导致数据错乱。

为了防止黑客伪造相同序列号的TCP报文被对方接受。

5.2 TCP四次挥手

image.png

过程:

  1. C发送FIN(SEQ=X)标志的数据包到服务端,用来关闭客户端到服务端的数据传送。客户端进入FIN-WAIT-1状态
  2. S收到FIN(SEQ=X)标志数据包,发送ACK(ACK=X+1)标志的数据包到客户端,服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
  3. 服务端发送一个FIN(SEQ=Y)标志的数据包到客户端,请求关闭连接,然后服务器进入LAST-ACK状态。
  4. 客户端发送ACK(ACK=Y+1)标志的数据包给服务端,然后客户端进入TIME-WAIT状态,服务端收到后,进入CLOSE状态。此时客户端等待2MSL后依然没有收到回复,就证明服务端正常关闭,客户端关闭连接。

为什么要四次挥手:

TCP全双工,任何一方发出结束通知后,会进入半关闭状态,当另一方没有数据传输时,发出关闭通知,释放连接。

为什么不能把服务器发送的ACK和FIN结合起来,变成三次挥手?

全双工,服务器可能还有数据要传送给客户端。

第二次挥手时服务器的ACK没有送达客户端怎么办?

客户端会重新发送FIN请求。

为什么第四次挥手客户端需要等待2*MSL(报文最长寿命)后才进入CLOSE状态?

第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。

5.3 可靠传输

RTT:数据发送时刻到接收到确认的时刻的差值,也就是包往返时间。

RTO:Retransmission Timeout 超时重传时间,应该略大于报文往返 RTT 的值

5.3.1 重传机制

基于序列号与确认应答。

  • 超时重传:发送数据报时,设定定时器,超过RTO后,重新发送数据,并将RTO加倍,两次超时说明网络环境较差,不宜频繁发生。
  • 快速重传:接收方收到不按顺序传递的报文,会重复对已收到的连续报文发送确认消息,发送方连续收到三个重复的ACK后,进行重传。
  • SACK:选择性确认,TCP头部增加SACK选项,发送方可以收到接收方已收到的数据范围,连续收单三次相同的ACK后,进行重传,但是仅重传缺失部分。
  • D-SACK:重复选择性确认,可以让发送方知道是数据包丢失还是接收方的ACK包丢失。

5.3.2 滑动窗口

窗口大小指的是,无需等待确认应答,而可以继续发送数据的最大值。

途中接收方的ACK如果丢失,可以通过下一个ACK来进行确认,也就是累计确认

发送方窗口

image.png

接收方窗口

image.png

接收窗口和发送窗口是约等于关系。

通常窗口的大小是由接收方的窗口大小决定的。TCP头中有一个字段叫Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据接收端的处理能力来发送数据。

5.3.3 流量控制

  1. 发送方收到ACK确认后,才可以进行窗口的移动,使得发送方可以根据接收方的实际接受能力控制发送的数据量。
  2. TCP规定不可以同时减少缓存和收缩窗口,应先收缩窗口,后减少缓存(与操作系统的缓冲区有关)
  3. 窗口大小为0时,就会阻止发送方给接收方传递数据,知道窗口变为非零。这就是窗口关闭。针对窗口非零的通知报文丢失的问题,接收方在接收到窗口关闭的通知后,会进行发送窗口探测报文。
  4. 如果接收方腾出几个字节并告诉发送方现在有几个字节的窗口,而发送方会义无反顾地发送这几个字节,这就是糊涂窗口综合症。解决方式:发送方使用Nagle算法,延时处理,接收方不通知小窗口。

5.3.4 拥塞控制

image.png

  • **慢启动:**当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1(表现到每一轮数据发送和拥塞窗口大小关系上是指数增加),直到达到慢启动门限(ssthresh,slow start threshold)。
  • **拥塞避免:**每当收到一个 ACK 时,cwnd 增加 1/cwnd(表现到每一轮数据发送和拥塞窗口大小关系上是线性增加)。
  • 拥塞发生:
    • 发生超时重传时,会使用拥塞发生算法,ssthresh设置为cwnd/2,cwnd重置为1;
    • 发生快速重传时,会将cwnd设置为cwnd/2,然后再将ssthresh设置为cwnd当前的大小,随后进入快速恢复算法。
  • 快速恢复:
    • 拥塞窗口cwnd = ssthresh+3;
    • 重传丢失的数据包;
    • 如果再收到重复的ACK,那么cwnd增加1;
    • 如果收到新数据的ACK,那么把cwnd设置为ssthresh值,因为该ACK确认了丢失数据已经收到,恢复结束,进入拥塞避免状态。

5.4 ARQ协议

自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息(Acknowledgements,就是我们常说的 ACK),它通常会重新发送,直到收到确认或者重试超过一定的次数。

ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。

6 Ping

PING 命令是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。

PING 命令的输出结果通常包括以下几部分信息:

  1. ICMP Echo Request(请求报文)信息:序列号、TTL(Time to Live)值。
  2. 目标主机的域名或 IP 地址:输出结果的第一行。
  3. 往返时间(RTT,Round-Trip Time):从发送 ICMP Echo Request(请求报文)到接收到 ICMP Echo Reply(响应报文)的总时间,用来衡量网络连接的延迟。
  4. 统计结果(Statistics):包括发送的 ICMP 请求数据包数量、接收到的 ICMP 响应数据包数量、丢包率、往返时间(RTT)的最小、平均、最大和标准偏差值。

如果 PING 对应的目标主机无法得到正确的响应,则表明这两个主机之间的连通性存在问题(有些主机或网络管理员可能禁用了对 ICMP 请求的回复,这样也会导致无法得到正确的响应)。如果往返时间(RTT)过高,则表明网络延迟过高。

Ping工作原理

PING 基于网络层的 ICMP(Internet Control Message Protocol,互联网控制报文协议),其主要原理就是通过在网络上发送和接收 ICMP 报文实现的。

ICMP 报文中包含了类型字段,用于标识 ICMP 报文类型。ICMP 报文的类型有很多种,但大致可以分为两类:

  • 查询报文类型:向目标主机发送请求并期望得到响应。
  • 差错报文类型:向源主机发送错误信息,用于报告网络中的错误情况。

PING 用到的 ICMP Echo Request(类型为 8 ) 和 ICMP Echo Reply(类型为 0) 属于查询报文类型 。

  • PING 命令会向目标主机发送 ICMP Echo Request。
  • 如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply。

7 DNS

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题

目前 DNS 的设计采用的是分布式、层次数据库结构,DNS 是应用层协议,它可以在 UDP 或 TCP 协议之上运行,端口为 53

DNS服务器有哪些

DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):

  • 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
  • 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如comorgnetedu等。国家也有自己的顶级域,如ukfrca。TLD 服务器提供了权威 DNS 服务器的 IP 地址。
  • 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
  • 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构。

DNS解析过程

  • 迭代
  • 递归

DNS劫持

DNS 劫持是一种网络攻击,它通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址,从而导致用户无法访问正常的网站,或者被引导到恶意的网站。DNS 劫持有时也被称为 DNS 重定向、DNS 欺骗或 DNS 污染。

8 ARP

ARP 协议,全称 地址解析协议(Address Resolution Protocol),它解决的是网络层地址和链路层地址之间的转换问题。因为一个 IP 数据报在物理上传输的过程中,总是需要知道下一跳(物理上的下一个目的地)该去往何处,但 IP 地址属于逻辑地址,而 MAC 地址才是物理地址,ARP 协议解决了 IP 地址转 MAC 地址的一些问题。

MAC地址长度为6字节(48bit)

MAC 地址具有可携带性、永久性,身份证号永久地标识一个人的身份,不论他到哪里都不会改变。而 IP 地址不具有这些性质,当一台设备更换了网络,它的 IP 地址也就可能发生改变,也就是它在互联网中的定位发生了变化。

最后,记住,MAC 地址有一个特殊地址:FF-FF-FF-FF-FF-FF(全 1 地址),该地址表示广播地址。

工作原理

ARP 协议工作时有一个大前提,那就是 ARP 表

在一个局域网内,每个网络设备都自己维护了一个 ARP 表,ARP 表记录了某些其他网络设备的 IP 地址-MAC 地址映射关系,该映射关系以 <IP, MAC, TTL> 三元组的形式存储。其中,TTL 为该映射关系的生存周期,典型值为 20 分钟,超过该时间,该条目将被丢弃。

A. 同一局域网内:

  1. A 检查自己ARP表,没找到B
  2. A构造ARP查询分组(包括A的IP、MAC,B的IP、广播MAC),广播到局域网
  3. 局域网内其他设备检查自己IP是否与查询IP相同:相同则返回ARP响应(B的IP、MAC、A的IP、MAC),并在自己的ARP表中构造映射,否则丢弃。
  4. A提取信息加入到自己ARP表中。

B. 不同局域网内MAC寻址:

  1. A查表找目标路由器,没找到
  2. 与局域网内相同的方式寻找目标路由器MAC地址。
  3. A收到目标路由器MAC,构造IP数据报,单播发给路由器
  4. 路由器查ARP表,没找到B
  5. 路由器用ARP找B
  6. 路由器重新封装IP数据报,单播给B。

9 NAT

NAT 协议(Network Address Translation) 的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,Local Area Network,LAN)内,各主机使用的是同一个 LAN 下的 IP 地址,但在该 LAN 以外,在广域网(Wide Area Network,WAN)中,需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。

路由器内部运行NAT协议,维护NAT转换表。

  1. 主机10.0.0.1向 IP 地址为128.119.40.186的 Web 服务器(端口 80)发送了 HTTP 请求(如请求页面)。此时,主机10.0.0.1将随机指派一个端口,如3345,作为本次请求的源端口号,将该请求发送到路由器中(目的地址将是128.119.40.186,但会先到达10.0.0.4)。
  2. 10.0.0.4即路由器的 LAN 接口收到10.0.0.1的请求。路由器将为该请求指派一个新的源端口号,如5001,并将请求报文发送给 WAN 接口138.76.29.7。同时,在 NAT 转换表中记录一条转换记录138.76.29.7:5001——10.0.0.1:3345
  3. 请求报文到达 WAN 接口,继续向目的主机128.119.40.186发送。

之后,将会有如下响应发生:

  1. 主机128.119.40.186收到请求,构造响应报文,并将其发送给目的地138.76.29.7:5001
  2. 响应报文到达路由器的 WAN 接口。路由器查询 NAT 转换表,发现138.76.29.7:5001在转换表中有记录,从而将其目的地址和目的端口转换成为10.0.0.1:3345,再发送到10.0.0.4上。
  3. 被转换的响应报文到达路由器的 LAN 接口,继而被转发至目的地10.0.0.1

总结 NAT 协议的特点,有以下几点:

  1. NAT 协议通过对 WAN 屏蔽 LAN,有效地缓解了 IPv4 地址分配压力。
  2. LAN 主机 IP 地址的变更,无需通告 WAN。
  3. WAN 的 ISP 变更接口地址时,无需通告 LAN 内主机。
  4. LAN 主机对 WAN 不可见,不可直接寻址,可以保证一定程度的安全性。

10 IP

IP(Internet Protocol,网际协议) 是 TCP/IP 协议中最重要的协议之一,属于网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。

目前 IP 协议主要分为两种,一种是过去的 IPv4,另一种是较新的 IPv6,目前这两种协议都在使用,但后者已经被提议来取代前者。

当网络设备发送 IP 数据包时,数据包中包含了 源 IP 地址目的 IP 地址 。源 IP 地址用于标识数据包的发送方设备或域,而目的 IP 地址则用于标识数据包的接收方设备或域。这类似于一封邮件中同时包含了目的地地址和回邮地址。

IPv4和IPv6

IPv4(Internet Protocol version 4) 是目前广泛使用的 IP 地址版本,其格式是四组由点分隔的数字,例如:123.89.46.72。IPv4 使用 32 位地址作为其 Internet 地址,这意味着共有约 42 亿( 2^32)个可用 IP 地址。

IPv6 地址使用更复杂的格式,该格式使用由单或双冒号分隔的一组数字和字母,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334 。IPv6 使用 128 位互联网地址,这意味着有 2^128(3 开头的 39 位数字,恐怖如斯) 个可用 IP 地址。

IPv6优势:

无状态地址自动配置(Stateless Address Autoconfiguration,简称 SLAAC):主机可以直接通过根据接口标识和网络前缀生成全局唯一的 IPv6 地址,而无需依赖 DHCP(Dynamic Host Configuration Protocol)服务器,简化了网络配置和管理。

NAT(Network Address Translation,网络地址转换) 成为可选项:IPv6 地址资源充足,可以给全球每个设备一个独立的地址。

对标头结构进行了改进:IPv6 标头结构相较于 IPv4 更加简化和高效,减少了处理开销,提高了网络性能。

可选的扩展头:允许在 IPv6 标头中添加不同的扩展头(Extension Headers),用于实现不同类型的功能和选项。

ICMPv6(Internet Control Message Protocol for IPv6):IPv6 中的 ICMPv6 相较于 IPv4 中的 ICMP 有了一些改进,如邻居发现、路径 MTU 发现等功能的改进,从而提升了网络的可靠性和性能。

11 网络攻击

  • IP欺骗
  • SYN Flood
  • UDP Flood
  • Http Flood
  • DNS Flood
  • TCP重置攻击
  • 中间人劫持