目录

  • 概述
  • HTTP/HTTPS (应用层)
  • DNS(应用层)
  • TCP/UDP(传输层)
  • NAT(网络层)
  • ARP(网络层)
  • ICMP(网络层)
  • 网络攻击
  • 网络编程

一、概述

OSI 和 TCP/IP 网络分层模型

OSI 和 TCP/IP 网络分层模型
各层传输的数据单位

单位层级描述
数据(Data)应用层例如 HTTP 请求、FTP 数据等
报文段(Segment)传输层TCP 使用报文段
数据报(Datagram)传输层UDP 使用数据报
数据包(Packet)网络层包含 IP 地址,用于跨网络的节点通信
帧(Frame)链路层包含 MAC 地址,用于同一局域网内的节点通信
比特(Bits)物理层最基本的传输单位,通过物理介质传输 0/1

二、HTTP/HTTPS (应用层)

HTTP vs HTTPS

  • HTTP 运行在 TCP 之上,传输的内容都是明文,客户端和服务端间无法验证身份。
  • HTTPS 运行在 SSL/TLS 之上,SSL/TLS 运行在 TCP 之上,建立连接时,通过证书颁发机构(CA,Certificate Authority)颁发的证书进行非对称加密,此后传输的内容采用对称加密(非对称加密效率低且加密的数据长度受限),但对称加密的密钥用服务器方的证书进行了非对称加密,相比 HTTP 安全性更高,但会耗费更多服务器资源。

HTTPS 请求流程

设有客户端 C,服务器 S,第三方信赖机构 CA,攻击者 A:

如果攻击者 A 向 C 发送一个诈包,假装是 S 公钥,C 后续就会用 A 的公钥对数据进行加密,在公开信道传输,那么 A 将捕获这些加密包,用 A 的私钥解密,就截获了 C 本要给 S 发送的内容。

为解决这一问题,SSL/TLS 采用了数字签名:CA 采用散列技术对证书生成摘要,通过 CA 私钥对其加密,附在证书下方。

  1. TLS Handshake:C 向 S 发送 ClientHello(包含支持的加密算法、协议版本等)。
  2. S 返回证书:S 选择加密算法,并向 C 发送 CA 颁发的证书(包含 S 的公钥和域名、CA 信息、证书有效期、数字签名)。
  3. C 验证证书:C 根据本地的 CA 信任列表验证 CA 是否可信,确认证书是否已过期,以及检查证书上的域名是否与访问的域名匹配;之后 C 获取 CA 公钥,将签名解密成摘要,并对证书进行相同散列处理得到摘要,两个摘要如果相同,则信任 S 的公钥。
  4. C 发送预主密钥:C 生成一个随机的预主密钥,用 S 的公钥加密并发送给 S。
  5. 双方计算会话秘钥:S 用自己的私钥解密后,C 和 S 共同计算最终的对称会话密钥。

    预主密钥(Pre-Master Secret)作用:前向安全性(即使 S 私钥泄露,过去的会话密钥仍然安全);master secret 长度非常大,会增加通信延迟。

HTTP/1.0 vs HTTP/1.1

  • 连接方式:HTTP/1.0 为短连接,HTTP/1.1 支持长连接。
  • 状态响应码:HTTP/1.1 中新加入了大量的状态码。
  • 缓存机制:HTTP/1.0 中主要使用 Header 里的 If-Modified-SinceExpires 作为缓存判断的标准,HTTP/1.1 引入了更多的缓存控制策略,如 Entity tagIf-Unmodified-SinceIf-Match 等。
  • 带宽:HTTP/1.1 在请求头引入了 range 头域,它允许只请求资源的某个部分而非整个对象,返回码为 206(Partial Content),避免了带宽浪费的现象。
  • Host 头:HTTP/1.1 引入了 Host 头字段,允许在同一IP地址上托管多个域名,从而支持虚拟主机的功能。

HTTP/1.1 vs HTTP/2.0

  • 多路复用:HTTP/1.1 为了弥补串行化(一个请求完成后才能处理下一个请求)的限制,通常会打开多个 TCP 连接;而 HTTP/2.0 在同一连接上可以并行传输多个请求和响应,减少了 TCP 连接数量和网络延迟。
  • 二进制帧:HTTP/1.1 使用文本格式的报文进行数据传输;HTTP/2.0 使用更加紧凑的二进制帧,减少了数据传输量和带宽消耗。
  • 头部压缩:HTTP/1.1 仅支持对 Body 压缩,HTTP/2.0 支持对 Header 压缩。
  • 服务器推送:HTTP/2.0 支持服务器推送,在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数。

    RPC(Remote Procedure Call)基于 TCP 或 HTTP/2,采用了 Protobuf 二进制序列化格式,无 HTTP 多余的头部信息,并支持多路复用。

HTTP/2.0 vs HTTP/3.0

  • 传输协议:HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC(Quick UDP Internet Connections)协议来实现可靠传输,在 UDP 的基础上新增了加密、重传等机制,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。
  • 连接建立:HTTP/2.0 需要经过 TCP 三次握手(HTTPS 还需要 TLS 握手,共需要约3个RTT)。而 QUIC 协议采用的 TLS 1.3 连接建立仅需0/1个RTT。
  • 连接迁移:HTTP/3.0 支持连接迁移,因为 QUIC 使用64位ID标识连接,只要ID不变就不会中断,即使从 WiFi 切换到移动数据也能保持连接。而 TCP 连接中一旦源IP/端口,目的IP/端口任意一项发生改变,连接就不能用了
  • 队头阻塞:HTTP/2.0 多请求复用一个 TCP 连接,一旦丢包,就会阻塞所有的请求。HTTP/3.0 在一定程度上解决了队头阻塞问题,一个连接建立多个不同的数据流,某个数据流发生丢包了,其它数据流不受影响(多路复用+轮询)。
  • 头部压缩:HTTP/3.0 采用更高效的 QPACK 头部压缩算法。
  • 错误恢复:HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地恢复和重传;HTTP/2.0 则依赖于 TCP 的错误恢复机制。
  • 安全性:HTTP/2.0 中,TLS 不会对 TCP 头部以及 TLS 记录层头部进行加密,可能被攻击者篡改;HTTP/3.0 对整个数据包(包括报文头和报文体)进行了加密。

GET vs POST

  • 语义:GET 通常用于获取资源;POST 通常用于创建或修改资源。
  • 缓存:GET 请求是幂等的,多次重复执行不会改变资源的状态,因此响应可以被缓存;POST 则不适合被缓存,每次执行可能需要实时响应。
  • 格式:GET 的请求参数通常在 URL 中,有长度限制;POST 的请求参数通常在 Body 中,无长度限制,有multipart/form-dataapplication/json 等多种编码格式。

WebSocket

一种全双工协议,允许客户端和服务器一直保持连接(通过心跳机制保持活跃状态),随时互相发送数据,直到显式关闭连接。客户端通过向服务器发送一个请求头中包含 Upgrade: websocket 等字段的 HTTP 请求,服务器响应同意后,将连接升级为 WebSocket。由于使用长连接更简洁的消息头部,WebSocket 在实时性要求高的场景下性能更优,能够减少开销并提升数据传输的效率。


三、DNS(应用层)

DNS 服务器

DNS 服务器自底向上可以依次分为以下几个层级:

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

DNS 工作流程

有如下图两种方式:迭代递归
DNS查询解析过程
以迭代为例,假设主机 cis.poly.edu 想查询 gaia.cs.umass.edu 的 IP 地址。主机 cis.poly.edu 的本地 DNS 服务器为 dns.poly.edugaia.cs.umass.edu 的权威 DNS 服务器为 dns.cs.umass.edu

  1. 主机 cis.poly.edu本地 DNS 服务器 dns.poly.edu 发送一个 DNS 请求,查询域名 gaia.cs.umass.edu
  2. 本地 DNS 服务器 dns.poly.edu 发现本地无此缓存记录,向根服务器发送请求。
  3. 根服务器eduTLD DNS 服务器地址返回给本地 DNS 服务器
  4. 本地 DNS 服务器TLD DNS 服务器请求 gaia.cs.umass.edu 的地址。
  5. TLD DNS 服务器仍不知道 gaia.cs.umass.edu 的地址,将 umass.edu权威 DNS 服务器地址返回给本地 DNS 服务器
  6. 本地 DNS 服务器权威 DNS 服务器 dns.cs.umass.edu 发送请求。
  7. 权威 DNS 服务器返回 gaia.cs.umass.edu 的地址给本地 DNS 服务器
  8. 本地 DNS 服务器将地址返回给主机

DNS 记录

资源记录(Resource Record,RR):DNS 服务器的数据库条目,是一个包含了 Name, Value, Type, TTL 四个字段的四元组。TTL 指该记录的生存时间,决定了什么时候从缓存中删除;而 NameValue 字段的取值取决于 Type 的类型:

  • A:IPv4,Name 为主机名,Value 为主机名对应的 IP 地址。
  • AAAA:IPv6,同上。
  • CNAMEValue 是别名为 Name 的主机对应的规范主机名,能够为现有的 A 记录创建别名。
  • MXValue 是别名为 Name 的邮件服务器的规范主机名,使邮件服务器可以和其他服务器使用相同的别名。
  • NS:由 TLD 服务器发布,Name 是个域,Value 是个知道如何获得该域中主机 IP 地址的权威 DNS 服务器的主机名。

五、TCP/UDP(传输层)

TCP vs UDP

  1. 是否面向连接:TCP 在传送数据前必须建立连接,传送结束后要释放连接。UDP 在传送数据之前无需先建立连接。
  2. 是否可靠传输:TCP 提供可靠的传输服务,在数据传递前,通过三次握手建立连接;在数据传递时,有确认、窗口、重传、拥塞控制等机制,保证数据无差错、不丢失、不重复、且按序到达。UDP 传输是不可靠的,远地主机在收到 UDP 报文后,不需要给出任何确认,不保证数据不丢失以及是否按序。
  3. 是否有状态:TCP 传输是有状态的(即记录消息的状态,如是否发送成功、是否被接收等),需要维持复杂的连接状态表。UDP 是无状态服务,消息发出去后就不管了。
  4. 传输效率:UDP 的传输效率要比 TCP 高很多,实时性更高。
  5. 传输形式:TCP 面向字节流(数据分割成报文段),UDP 面向报文(完整数据包)。
  6. 首部开销:TCP 首部开销(20~60 字节)比 UDP(8 字节)更大。
  7. 是否能广播/多播:TCP 只支持一对一,UDP 还支持一对多、多对一、多对多。
  8. 应用场景:TCP 用于对传输准确性要求特别高的场景,如邮件、文件传输、远程登录等。UDP 一般用于即时通信,如语音、 视频、直播、游戏等,这些场景对传输数据的准确性要求不是特别高,少个一两帧区别也不大。

    协议名传输协议描述
    HTTPTCP(3.0之前)/ UDP超文本传输协议
    HTTPSTCP更安全的超文本传输协议
    FTPTCP文件传输协议
    SMTPTCP简单邮件传输协议
    POP3 / IMAPTCP邮件接收协议
    TelnetTCP远程登录协议
    SSHTCP更安全的远程登录协议
    DHCPUDP动态主机配置协议
    DNSUDP / TCP域名解析

TCP 三次握手

TCP三次握手

第一次握手Server 确认对方发送正常,自己接收正常。
第二次握手Client 确认自己发送正常、接收正常,对方发送正常、接收正常。
第三次握手Server 确认自己发送正常、接收正常,对方发送正常、接收正常。

(1)第三次握手是可以携带数据的,如果携带数据的包中包含了 ACK 标记,服务端会将其视为有效的第三次握手确认。
(2)若服务端收到 RST ,会回到 LISTEN 状态。

丢包情况分析

  1. 第一次握手被丢:A 周期性超时重传,直到收到 B 的确认。
  2. 第二次握手被丢:B 周期性超时重传,直到收到 A 的确认。
  3. 第三次握手被丢:A 单方面 Established

    • A 无数据发送,B 周期性超时重传,直到收到 A 的确认。
    • A 有数据发送,B 收到 AData + ACK,自动切换为 Established ,并接受 Data

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

  • ACK: 表示服务器确认收到了客户端的 SYN 请求:“我收到了你的请求”
  • SYN: 表示服务器愿意与客户端建立连接:“我也愿意建立连接”

 
半连接队列和全连接队列

Linux 内核维护两个队列来处理并发的连接请求。当队列达到上限时,新的连接请求会被拒绝或忽略。

  • 半连接队列(SYN Queue):服务端收到 SYN 请求时,还没有完全建立连接,服务端会把半连接状态的连接放在半连接队列。
  • 全连接队列(Accept Queue):服务端收到 ACK 响应时,三次握手成功完成,服务端会把连接从半连接队列移动到全连接队列。如果未收到 ACK 响应,则会进行重传:重传的等待时间通常是指数增长的;如果重传次数超过系统规定的最大次数,连接会从半连接队列中删除。

TCP 四次挥手

TCP四次挥手

MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间。如果直到 2MSL(一个发送和一个回复所需的最大时间),客户端都没有再次收到 FIN,就可以推断 ACK 已被成功接收,结束连接。

第一次挥手A 说 “我没啥要说的了”。
第二次挥手B 说 “我知道了”,但 B 可能还有要说的话(非三次挥手的原因)。
第三次挥手B 可能巴拉巴拉说了一通后,最后说 “我说完了”。
第四次挥手A 说 “知道了”,这样通话才算结束。

为什么要四次挥手?
TCP 是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

丢包情况分析

  1. 第一/二次挥手被丢:客户端没有收到 ACK 确认,会重新发送 FIN 请求。
  2. 第三次挥手被丢:服务端没有收到 ACK 确认,会重新发送 FIN 请求。
  3. 第四次挥手被丢:服务端没有收到 ACK 确认,会重新发送 FIN 请求。如果客户端在 2MSL 时间内再次收到了 FIN ,就会重新发送 ACK 并再次等待 2MSL ,防止服务端不断重发 FIN

 
Linux 存在大量 TIME_WAIT 状态的连接怎么办?

  • 应用层:尽量使用长连接;通过负载均衡分发流量。
  • 调整 /etc/sysctl.conf 中的内核参数,并执行 /sbin/sysctl -p 使其生效。

    net.ipv4.tcp_max_tw_buckets = 5000  # TIME-WAIT Socket 最大数量
    net.ipv4.tcp_tw_recycle = 1  # 开启 TIME-WAIT sockets 的快速回收
    net.ipv4.tcp_tw_reuse = 1  # 允许将 TIME-WAIT sockets 重用于新的连接,不建议开启(NAT 模式下可能引起连接 RST)

TCP 同时打开/关闭

同时打开:共 4 次数据交换,只打开 1 个连接。
TCP 同时打开

同时关闭:如果应用程序发送 FIN 进入 FIN_WAIT_1 状态后,收到了来自对端的 FIN ,则回复一个 ACK ,并进入叫作 CLOSING 的特有状态。之后收到对端的 ACK 后,进入 TIME_WAIT 状态。


TCP 可靠传输

  1. 差错检测

    • 基于数据块传输:应用数据被分割成 TCP 认为最适合发送的数据块,再传输给网络层,数据块被称为报文段或段。
    • CRC校验:TCP 将保持它首部和数据的检验和,如果收到段的检验和有差错,TCP 将丢弃这个报文段(不确认收到)。
    • 按序到达和去重:TCP 为防止丢包,给每个包一个序列号,将接收到的数据按序列号排序,并且去掉重复序列号的数据。
    • 重传:在数据包丢失或延迟的情况下重新发送数据包,直到收到对方的 ACK

     

  2. 拥塞控制:慢开始、 拥塞避免、快速重传和恢复。
    TCP拥塞控制
  3. 流量控制滑动窗口控制发送方发送速率,通过接收方发送的确认报文中窗口字段来控制发送方窗口大小。
    TCP发送窗口结构
    TCP接收窗口结构

UDP 多播

允许将单个数据包同时发送到多个接收端,而无需为每个接收方单独发送数据,常用于实时数据分发,例如视频直播、网络游戏、股票行情推送等场景。发送方将数据发送到一个多播组地址(特殊的 IP 地址范围,如 224.0.0.0 - 239.255.255.255),任何接收方都可以通过订阅(Join)多播组来接收数据。


六、NAT(网络层)

网络地址转换(Network Address Translation),解决 IPv4 地址数量有限的问题,通过端口映射的方式将私有网络中的内部 IP 地址转换为公共网络中的外部 IP 地址。


七、ARP(网络层)

地址解析协议(Address Resolution Protocol),解决网络层地址(IP)和链路层地址(MAC)间的转换问题。

FF-FF-FF-FF-FF-FF(全1地址):表示广播地址。

  • ARP表:局域网中,每个网络设备都维护了一个 ARP 表,用于记录其他网络设备的 IP 地址 - MAC 地址的映射关系(<IP, MAC, TTL>)。
  • 广播问询:若表中无要找的 IP 地址的映射,则构造一个查询分组在局域网内广播。
  • 单播响应:收到查询分组的主机验证是否是对自己的问询,如果不是,则丢弃;如果是,则构造一个响应分组单播返回,且双方都将对方的 IP-MAC 映射关系加入到自己的 ARP 表中。

 
同局域网内的 MAC 寻址

不同局域网内的 MAC 寻址
不同局域网内的 MAC 寻址


八、ICMP(网络层)

互联网控制报文协议(Internet Control Message Protocol)是传输网络状态和错误消息的协议,常用于网络诊断和故障排除,其报文类型主要分为查询报文差错报文

Ping 命令使用了其中两种查询报文,它会向目标主机发送 ICMP Echo Request;如果两个主机的连通性正常,目标主机会返回一个对应的 ICMP Echo Reply

❯ ping -c 4 www.baidu.com
PING www.a.shifen.com (183.2.172.42) 56(84) bytes of data.
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=1 ttl=52 time=3.70 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=2 ttl=52 time=3.72 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=3 ttl=52 time=3.75 ms
64 bytes from 183.2.172.42 (183.2.172.42): icmp_seq=4 ttl=52 time=3.71 ms

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 3.700/3.719/3.749/0.047 ms

九、网络攻击

DDoS 攻击

分布式拒绝服务(Distributed Denial of Service)攻击:处于不同位置的多个攻击者同时向一个或数个目标发动攻击,使网站服务器充斥大量要求回复的信息,消耗网络带宽或系统资源,导致网络或系统不胜负荷以至于瘫痪而停止提供正常的网络服务。
TODO...


DNS 劫持

通过修改 DNS 服务器的解析结果,使用户访问的域名指向错误的 IP 地址。解决方案:

  • 更换公共 DNS 服务‌:绕过本地互联网服务提供商(ISP)可能存在的劫持行为。‌
  • 清除 DNS 缓存‌:定期清除 DNS 缓存防止旧的或错误记录导致的问题。
  • 本地 HOST 文件‌:手动添加条目,把域名和其对应的IP地址直接关联起来。‌
  • VPN:帮助绕过 DNS 劫持,并建立一个加密隧道来保护用户的网络通讯。
  • HTTPS:确保网站使用 HTTPS 协议,保证数据在传输过程中的加密。
  • ‌DNS 加密‌:采用 DNS over HTTPS (DoH) 或 DNS over TLS (DoT) 等技术,保护 DNS 查询免遭篡改。
  • ‌安全软件‌:安装并运行防病毒软件等安全工具,防御恶意软件对DNS设置的篡改。

十、网络编程

select/poll/epoll

epoll LT/ET
TODO...


网络序与主机序

字节序

网络字节序采用大端,高位存放在低地址,符合人类的正常思维

不同的 CPU 处理数据有不同的字节序类型,一般为小端,高位存放在高地址

htons()htonl()inet_pton()inet_ntop()

inet_addr()inet_aton()inet_ntoa()


参考资料:CSDN1JavaGuide

2024-12-03 八股文·none