跳转至

开篇

OSI & TCP/IP 模型

对比维度 OSI模型 TCP/IP 模型
设计目标 标准化理论,理论协议为主 互联网的核心架构基础
分层复杂度 7层,严格隔离 5层,简化并合并了高层功能
现实影响力 教学和理论的分析工具,应用较少 实际工程实现
分析视角 数据从应用层逐层封装,经过表示层加密、会话层建立连接,最终通过物理层传输 数据在应用层打包后,直接通过传输层(TCP/UDP)添加端口号,网络层(IP)添加IP地址,最后由数据链路层和物理层发送。
具体分层上的区别
应用层 应用层 OSI的应用层仅定义接口(即直接对外提供网络服务),而 TCP/IP 的应用层关注底层的协议转换,如 HTTP、 FTP 、 DNS 、 SMTF
表示层 (合并至应用层) OSI 独有的层,关注数据格式转换(如加密、转换、编码)
会话层 (合并至应用层) OSI 独有的层,OSI管理会话的建立/终止(RPC 协议),TCP/IP 将会话管理交给应用层自行处理
传输层 (合并至应用层) 两者功能一直,负责端到端之间的传输,TCP(可靠传输)、 UDP(不可靠传输)
网络层 网络层 负责寻址和路由(IP 协议),如路由器、 ARP 、防火墙等
数据链路层 数据链路层 负责相邻节点之间的帧传输(MAC 地址、以太网协议),如网卡、网桥、交换机(解析 MAC 地址,转发数据帧)
物理层 物理层 定义物理介质的特性,如集线器(广播物理信号)、中继器(放大物理信号)

老生常谈 Tcp

Tcp 三次🤝?

tcp的三次握手是建立可靠网络连接的核心机制,确保通讯双方能够同步初始序列号并确认彼此的发送和接受能力。

流程如下:

TCP三次握手流程(含字段解释)TCP三次握手流程(含字段解释)......客户端客户端服务器服务器1SYN(seq = x)SYN:同步标志,请求建立连接seq=x:客户端初始序列号,标识数据字节流的起点服务器状态:LISTEN → SYN_RCVD2SYN-ACK(ack = x+1, seq = y)SYN:服务器同步标志ACK:确认标志,表示已收到客户端SYNack=x+1:确认客户端的seq,期望下次收到x+1seq=y:服务器初始序列号客户端状态:SYN_SENT → ESTABLISHED(收到ACK后)3ACK(ack = y+1)ACK:确认标志ack=y+1:确认服务器的seq,期望下次收到y+1服务器状态:SYN_RCVD → ESTABLISHED4双向连接建立,开始传输数据
400. Welcome to PlantUML! You can start with a simple UML Diagram like: Bob->Alice: Hello Or class Example You will find more information about PlantUML syntax onhttps://plantuml.com (Details by typinglicensekeyword) PlantUML 1.2025.4beta3[From string (line 2) ] @startuml!include https://raw.githubusercontent.com/MikhailKravets/mkdocs_puml/master/themes/material/indigo-dark.pumlCannot open URL

TCP 四次👋

通过四次挥手,TCP 实现可靠的双向连接关闭,确保数据传输的完整性和资源的完整释放。 TCP 是全双工协议,双方可独立发送和接收数据。关闭连接时,需确保双方的数据均已传输完毕,且双向通道均安全释放,四次👋来保障这一点。

客户端 FIN:代表不再继续发送数据,但仍可接收数据。 服务端 FIN:代表已无要传输的数据,告知客户端可关闭通道,等待最终ACK 。

流程如下:

TCP四次挥手流程TCP四次挥手流程....................客户端(主动关闭方)客户端(主动关闭方)服务器(被动关闭方)服务器(被动关闭方)1FIN(seq = u)FIN:终止标志,表示客户端数据发送完毕客户端状态:ESTABLISHED → FIN_WAIT_12ACK(ack = u + 1)ACK:确认收到FIN服务器状态:ESTABLISHED → CLOSE_WAIT(此时服务器仍可发送剩余数据)3FIN(seq = v, ack = u + 1)FIN:服务器数据发送完毕服务器状态:CLOSE_WAIT → LAST_ACK4ACK(ack = v + 1)ACK:确认服务器FIN客户端状态:FIN_WAIT_2 → TIME_WAIT → CLOSED服务器状态:LAST_ACK → CLOSED
400. Welcome to PlantUML! You can start with a simple UML Diagram like: Bob->Alice: Hello Or class Example You will find more information about PlantUML syntax onhttps://plantuml.com (Details by typinglicensekeyword) PlantUML 1.2025.4beta3[From string (line 2) ] @startuml!include https://raw.githubusercontent.com/MikhailKravets/mkdocs_puml/master/themes/material/indigo-dark.pumlCannot open URL

TIME_WAIT 的 2MSL等待: - 目的:确保最后一个 ACK 能被服务端重传的 FIN 正确处理(若 ACK 丢失,服务端 TCP 重传机制会重发 FIN) - 时长:通常为 2 倍报文最大生存时间(MSL)

关键点总结:

阶段 客户端行为 服务端行为
ACK 丢失 出于 TIME_WAIT 状态,等待 2MSL 未收到 ACK,出发超市重传 FIN
收到重传的 FIN 立刻回复 ACK,并重置 2MSL 计时器 收到 ACK后关闭连接
2MSL超时 关闭连接 若始终未接收到 ACK,达到最大重传次数后强制会强制关闭

不妨思考下

三次🤝真的是必须的么?

1 、防止历史🔗的建立 - 若网络中存在客户端延迟的旧 SYN 请求(如客户端重连后),三次握手能确保客户端在第三次握手时拒绝过期的连接请求,避免服务端资源浪费。

2 、同步双方的初始序列编号 - 序列号用于标识数据字节流,确保数据按需传输、完整性以及去重校验,三次握手确保双方交换并确认初始序列号。

3 、验证双向通信能力 - 三次握手验证通信双方均具备首发能力。

为什么需要四次挥手?

1 、双向通道独立关闭 - TCP 是全双工协议,客户端和服务端需分别关闭自己的独立通道。 - 客户端发送 FIN仅表示不再发送数据,但仍可接收数据;服务端需在发送剩余数据后再发送 FIN。 2 、确保数据完整性 - 第二次挥手的 ACK 确保客户端知道服务端已接收到关闭请求。 - 第四次挥手的 ACK 确保服务端知道客户端已确认关闭。

延伸问题

能否用两次握手替代?

两次握手并不能防止旧的 SYN 导致的连接错误,并且服务端不知晓客户端是否能接收到自己的 SYN-ACK信号。

初始序列编号为什么随机?

防止网络攻击(猜测序列号并伪造数据包),同时避免不同连接的序列号冲突。

SYN Flood 洪泛攻击?

攻击者发送大量 SYN 后不回复 ACK,导致服务器半开连接耗尽资源。常见的防御措施包限制半连接数以及 SYN Cookies。

SYN Cookies 是一种防御 SYN 洪泛攻击的技术,其基于无状态的方式来去验证 TCP 链接请求,避免服务端因维护大量半开连接(Half-Open Connection)耗尽资源。

SYN Flood 背后原理 在 TCP 的三次握手中,服务端在接收到客户端 SYN 包后,会分配内存保存连接的初始状态(如序列号、端口等),并进入 SYN_RECEIVED 状态等待客户端的 ACK 。 攻击者通过伪造大量虚假的 SYN 请求(不发送最终的 ACK), 导致服务器内存被占满,无法处理合法请求,最终服务瘫痪。

核心思想: SYN Cookies 通过不保存连接状态的方式解决这一问题: 1 、无状态连接:服务器不存储半开连接的信息,而是通过加密哈希算法将连接信息编码到 SYN-ACK 包的初始序列号(基于无状态的方式)中。

2 、对客户端验证:只有当客户端返回合法的 ACK 包(携带正确确认号 ack = seq + 1),服务器才会分配资源建立连接。

通过 SYN Cookies,服务器在保障安全的同时,维持了对安全请求的高效处理能力。