Linux网络进阶:TCP三次握手和四次挥手与TCP连接状态

Linux 网络基础与进阶:从网络介质到 TCP 连接状态

一、网络先从"怎么连"开始

网络可以先用一句大白话理解:多个设备通过某种介质连接起来,然后按照约定好的协议交换数据

这里面有三个关键词:

  • 设备:电脑、服务器、手机、交换机、路由器等;
  • 介质:网线、光纤、无线电波等;
  • 协议:双方都能理解的数据格式和通信规则。

1. 网线、光纤、WiFi 的区别

常见接入方式主要有三类:网线、光纤和 WiFi。

介质 传输方式 典型特点 常见场景
网线 铜线电信号 稳定、成本适中、一般 100 米内效果好 办公网络、家庭宽带、机房短距离连接
光纤 光信号 带宽高、距离远、抗电磁干扰强 数据中心、楼宇互联、长距离传输
WiFi 无线电波 接入方便、移动性强,但容易受墙体和干扰影响 家庭、办公区、公共无线网络

网线又常叫双绞线。所谓"双绞",就是线芯按一定方式两两缠绕,用来抵消一部分电磁干扰。常见线序标准有 T568AT568B

网线还会分为直通线和交叉线:

  • 直通线 :两端线序一致,比如两端都是 T568B
  • 交叉线 :一端 T568A,另一端 T568B

现在很多网卡和交换机支持自动翻转,实际使用时不用像早期设备那样频繁区分直通线和交叉线。但理解线序仍然有价值,尤其是在现场排查"线做了但链路不亮"的问题时。

光纤使用光信号传输,优势是距离远、带宽高、抗干扰强。缺点也明显:模块、跳线、熔接和维护成本都比普通网线高。

WiFi 的优势是不用布线,设备移动方便;问题是信号会受墙体、距离、同频干扰、安全配置影响。排查无线网络时,不能只看"有没有连上",还要看信号强度、频段、信道、认证方式和终端位置。

2. bit、Byte 和数制

网络速率里最容易混淆的是 bitByte

  • bit 是比特,是信息传输的基本单位;
  • Byte 是字节,1 Byte = 8 bit
  • Mbps 表示每秒多少兆比特;
  • MB/s 表示每秒多少兆字节。

所以看到宽带、网卡、交换机标注 100Mbps1Gbps10Gbps 时,它们说的是 bit 速率,不是直接等于文件下载时看到的 MB/s

运维还经常会遇到二进制和十六进制:

  • IP 地址、子网掩码的本质离不开二进制;
  • MAC 地址通常使用十六进制表示;
  • 权限位、协议字段、抓包内容里也经常出现不同进制。

十进制转二进制可以使用"除 2 取余,倒序排列"的方法。

数制不是为了背公式,而是为了看懂网络里的地址、掩码、协议字段。比如子网划分时,为什么 /24255.255.255.0,继续往下拆就一定会回到二进制。

二、交换机:局域网里的二层转发设备

交换机主要工作在 OSI 的数据链路层,也就是二层。它的核心任务是:根据 MAC 地址在局域网内转发数据帧

交换机和集线器最大的区别在于:交换机会学习 MAC 地址,并把每个端口变成相对独立的冲突域。这样同一台交换机上的多台主机通信时,不需要所有设备都挤在同一条共享链路里抢着发数据。

1. MAC 地址

MAC 地址是网卡在数据链路层的标识,长度是 48 位,也就是 6 字节,通常写成十六进制格式:

text 复制代码
00:1A:2B:3C:4D:5E

它可以拆成两部分:

部分 含义
前 24 位 OUI,厂商标识,由 IEEE 分配
后 24 位 设备标识,由厂商分配

MAC 地址解决的是"在同一个局域网内找到哪块网卡"的问题。它和 IP 地址不是一回事:

  • MAC 地址偏二层,负责本地链路上的帧转发;
  • IP 地址偏三层,负责跨网段寻址和路由。

2. 以太网数据帧格式

交换机转发的基本单位是数据帧。一个以太网帧里,最关键的是目的 MAC、源 MAC、类型/长度、数据和 FCS 校验。

字段 作用
目的 MAC 接收方网卡地址
源 MAC 发送方网卡地址
类型/长度 标记上层协议类型或数据长度
Payload 上层交给数据链路层的数据
FCS 用于检查帧在传输过程中是否损坏

交换机做转发时,重点看的是目的 MAC;做学习时,重点看的是源 MAC。

3. 交换机如何学习和转发

交换机内部维护一张 MAC 地址表,可以理解为:

text 复制代码
MAC 地址 -> 交换机端口

它的工作过程可以分成四步。

第一步,交换机收到数据帧后,先学习源 MAC。比如主机 A 从 1 号口发来数据,交换机就把"主机 A 的 MAC 在 1 号口"记录下来。

第二步,交换机查看目的 MAC。如果 MAC 地址表里有对应端口,就单播转发;如果表里没有,就会向除入端口之外的其他端口泛洪。

第三步,对端主机回应时,交换机会继续学习回应帧里的源 MAC。

第四步,当双方 MAC 都被学习到以后,再通信就可以直接单播,不需要继续泛洪。

MAC 地址表不是永久不变的。常见交换机会给动态学习到的表项设置老化时间,如果某个 MAC 长时间没有通信,对应记录会被清理。后续再次通信时,交换机会重新学习。

4. 单工、半双工和全双工

双工模式描述的是通信双方能不能同时收发数据。

模式 含义 类比
单工 只能单向传输 广播喇叭
半双工 可以双向,但不能同时 对讲机
全双工 可以双向同时传输 打电话

现代交换网络中,大多数场景都是全双工。接口两端如果双工协商异常,可能出现丢包、重传、速率低、连接不稳定等问题。现场排查链路质量时,速率、双工、错误包统计都值得一起看。

三、路由器:跨网段转发数据包

交换机主要解决同一局域网内的二层通信,路由器解决的是不同网络之间的三层通信。

路由器的核心任务是:根据目标 IP 地址查路由表,选择下一跳或出接口,把数据包继续转发出去

1. 路由器的基本工作流程

路由器转发数据包时,一般会经过这些步骤:

  1. 从某个接口收到数据包;
  2. 查看数据包里的目标 IP 地址;
  3. 判断目标 IP 是否属于自己的直连网段;
  4. 如果不是直连网段,就查询路由表;
  5. 找到最匹配的路由后,从对应接口或下一跳转发;
  6. 如果没有匹配路由,通常走默认路由;没有默认路由时,可能返回目标不可达。

一个常见场景是:主机要访问其他网段的目标地址时,会先把数据交给自己的网关。网关通常就是本网段出口路由器的接口地址。后续每一台路由器都重复"查目标 IP、查路由表、选下一跳"的动作,直到数据到达目标网段。

2. 路由表是怎么来的

路由表可以理解为路由器手里的"地图"。常见来源有三类:

路由类型 来源 特点
直连路由 接口配置 IP 且接口处于 up 状态 自动生成,最基础
静态路由 管理员手工配置 稳定、可控,但维护成本高
动态路由 路由协议学习 适合网络规模大、拓扑变化多的环境

默认路由也很重要。它可以理解为"找不到更精确路线时的兜底出口"。在 Linux 主机上,默认网关本质上就是主机路由表里的默认路由。

交换机和路由器可以这样区分:

对比项 交换机 路由器
主要层级 数据链路层 网络层
主要依据 MAC 地址 IP 地址
主要范围 同一局域网 不同网段之间
核心表项 MAC 地址表 路由表

四、OSI 七层模型:把复杂通信拆开看

OSI 七层模型是一个理论框架,它把网络通信拆成七层。分层的价值不在于背表,而在于排查问题时能快速定位:到底是物理链路、二层转发、三层路由,还是上层服务出了问题。

层级 名称 主要作用 常见例子
7 应用层 面向应用提供网络服务 HTTP、FTP、DNS
6 表示层 数据格式、加密、压缩 TLS、MIME
5 会话层 建立和管理会话 RPC、NetBIOS
4 传输层 端到端传输 TCP、UDP
3 网络层 寻址和路由 IP、ICMP、OSPF
2 数据链路层 成帧、MAC 地址、局域网转发 Ethernet、PPP
1 物理层 比特流在介质上传输 网线、光纤、无线信号

排查网络故障时,可以按层次往下拆:

  • 网卡灯不亮、链路不稳定,优先看物理层;
  • 同网段不通,重点看二层、ARP、交换机、VLAN;
  • 跨网段不通,重点看 IP、网关、路由、防火墙;
  • 端口不通,重点看传输层和服务监听;
  • 域名解析异常,重点看 DNS 和应用层配置。

五、TCP/IP 模型:现实网络里的协议栈

OSI 更像理论地图,TCP/IP 模型更贴近日常使用的互联网协议栈。常见说法是四层或五层:

  • 应用层;
  • 传输层;
  • 网络层;
  • 数据链路层;
  • 物理层。

各层常见协议可以这样记:

TCP/IP 层级 常见协议或对象 重点
应用层 HTTP、HTTPS、FTP、SMTP、DNS 应用之间怎么交流
传输层 TCP、UDP 进程之间怎么传输
网络层 IP、ICMP、ARP 等 主机之间怎么寻址和转发
数据链路层 Ethernet、MAC、帧 同一链路怎么交付
物理层 网线、光纤、无线信号 比特怎么变成物理信号

这里要注意:ARP 常被放在网络层与数据链路层之间讨论,因为它解决的是"已知 IP,如何找到对应 MAC"的问题。实际排查时不用纠结它到底归哪一层,知道它连接了三层 IP 和二层 MAC 就够用了。

六、数据封装与解封装

数据从应用发出去,不是直接"裸奔"到网络里,而是会经过一层层封装。可以把它类比成寄快递:

网络过程 快递类比
用户数据 要寄出的物品
传输层封装 加上快递单,标明端口等信息
网络层封装 加上收件地址,也就是 IP 信息
数据链路层封装 加上快递袋,标明 MAC 信息
物理层发送 快递员真正把包裹送出去
接收端解封装 对端逐层拆开,拿到原始数据

1. 发送端封装

发送端从上往下走:

  1. 应用层产生数据;
  2. 传输层加 TCP/UDP 头,形成段;
  3. 网络层加 IP 头,形成包;
  4. 数据链路层加以太网头和尾,形成帧;
  5. 物理层把帧转换成比特流,通过介质发送。

这里有几个常见名称:

层级 数据单元
应用层 Data
传输层 Segment
网络层 Packet
数据链路层 Frame
物理层 Bits

也就是说,运维里常说的"数据包""数据帧""TCP 段"不是完全同一个东西,它们对应不同层级。

2. 接收端解封装

接收端从下往上走:

  1. 物理层把信号还原成比特;
  2. 数据链路层检查目的 MAC,如果不是发给自己的,通常直接丢弃;
  3. 网络层检查目标 IP;
  4. 传输层根据端口号交给对应进程;
  5. 应用层拿到最终数据。

封装和解封装这条线很重要。很多网络问题看似复杂,其实是在问:数据在哪一层被挡住了,或者哪一层的头部信息不对。

七、TCP 三次握手:连接建立前先确认双方能力

TCP 是面向连接的可靠传输协议。正式传数据之前,客户端和服务端要先建立连接,这个过程就是三次握手。

三次握手可以这样理解:

  1. 第一次握手:客户端发送 SYN

    客户端告诉服务端:"我要建立连接",并带上自己的初始序列号 seq=x。客户端进入 SYN_SENT 状态。

  2. 第二次握手:服务端发送 SYN+ACK

    服务端收到后,回复确认号 ack=x+1,同时带上自己的初始序列号 seq=y。服务端进入 SYN_RCVD 状态。

  3. 第三次握手:客户端发送 ACK

    客户端确认服务端的序列号,回复 ack=y+1。双方进入 ESTABLISHED 状态,连接建立完成。

几个字段要分清:

字段 作用
SYN 请求建立连接,并同步初始序列号
ACK 确认收到对方数据
seq 当前发送方向的数据序列号
ack 期望对方下次发送的序列号

1. 为什么不是两次握手

两次握手最大的问题是:服务端无法确认客户端是否收到了自己的回复。

如果客户端发送的旧 SYN 因为网络延迟很久后才到达服务端,而服务端两次握手就直接建立连接,就可能产生一个客户端根本不需要的历史连接,浪费服务端资源。

三次握手要求客户端必须再发一次 ACK,服务端才能确认:客户端能发、服务端能收;服务端能发、客户端也能收。

2. 为什么不是四次握手

四次也能做到可靠建立连接,例如:

  1. 客户端发送 SYN;
  2. 服务端回复 ACK;
  3. 服务端再发送 SYN;
  4. 客户端回复 ACK。

但第二步和第三步可以合并成 SYN+ACK,没有必要拆成两次。TCP 的三次握手就是在可靠性和效率之间做的平衡。

八、TCP 四次挥手:全双工连接要分方向关闭

TCP 连接是全双工的。也就是说,客户端到服务端是一条方向,服务端到客户端又是一条方向。关闭连接时,两个方向都要分别确认"我这边没有数据要发了"。

四次挥手可以拆成这样:

  1. 第一次挥手:主动关闭方发送 FIN

    主动关闭方表示:"我这边数据发完了,准备关闭发送方向。"随后进入 FIN_WAIT_1

  2. 第二次挥手:被动关闭方回复 ACK

    被动关闭方确认收到 FIN,但它可能还有数据没发完,所以先进入 CLOSE_WAIT。主动关闭方收到 ACK 后进入 FIN_WAIT_2

  3. 第三次挥手:被动关闭方发送 FIN

    当被动关闭方也没有数据要发了,再发送 FIN,进入 LAST_ACK

  4. 第四次挥手:主动关闭方回复 ACK

    主动关闭方确认收到对端 FIN,进入 TIME_WAIT,等待一段时间后最终进入 CLOSED

为什么建立连接是三次,断开连接是四次?

关键点在于:建立连接时,服务端的 ACKSYN 可以合并;断开连接时,收到对方 FIN 只代表"对方不发了",不代表"我自己也发完了"。因此关闭两个方向通常需要拆成两轮确认。

九、TCP 11 种状态速查

TCP 状态很多,但不要死背。先按两条主线看:

  • 建立连接:LISTENSYN_SENTSYN_RCVDESTABLISHED
  • 释放连接:FIN_WAIT_1FIN_WAIT_2CLOSE_WAITLAST_ACKTIME_WAITCLOSINGCLOSED
状态 常见位置 含义
CLOSED 双方 没有连接,或连接已经关闭
LISTEN 服务端 服务端正在监听端口,等待客户端连接
SYN_SENT 客户端 客户端已发送 SYN,等待服务端响应
SYN_RCVD 服务端 服务端收到 SYN,并已发送 SYN+ACK
ESTABLISHED 双方 TCP 连接已建立,可以传输数据
FIN_WAIT_1 主动关闭方 已发送 FIN,等待对方 ACK
FIN_WAIT_2 主动关闭方 已收到 ACK,等待对方 FIN
CLOSE_WAIT 被动关闭方 已收到对方 FIN,等待本地应用关闭连接
LAST_ACK 被动关闭方 已发送 FIN,等待对方最后 ACK
TIME_WAIT 主动关闭方 已发送最后 ACK,等待 2MSL 后关闭
CLOSING 双方同时关闭时可能出现 双方几乎同时发送 FIN,等待最终 ACK

排查时有几个状态特别常见:

  • LISTEN:说明服务端进程已经在监听端口;
  • ESTABLISHED:说明连接已经建立;
  • SYN_SENT 长时间存在:常见于目标不通、防火墙拦截、服务端无响应;
  • CLOSE_WAIT 过多:常见于本地应用没有及时关闭连接;
  • TIME_WAIT 较多:通常出现在主动关闭连接的一方,数量多不一定就是故障,要结合端口耗尽和连接复用情况判断。

十、常见易错点

1. 把 MAC 地址和 IP 地址混在一起

MAC 地址用于本地链路交付,IP 地址用于跨网络寻址。主机访问同网段目标时,最终还是要知道目标 MAC;访问不同网段目标时,主机通常会把数据帧交给网关的 MAC,再由网关继续路由。

2. 以为交换机会根据 IP 转发

普通二层交换机主要根据 MAC 地址表转发数据帧。它学习源 MAC,查询目的 MAC,找不到就泛洪。IP 路由是三层设备的工作。

3. 只看"能不能 ping 通"

ping 主要基于 ICMP,能说明一部分网络可达性,但不能证明业务端口一定可用。端口监听、防火墙策略、应用进程、DNS 解析、路由路径都可能影响最终访问。

4. 把网络速率和文件传输速度直接画等号

1Gbps 是每秒 1 千兆 bit,换算成字节理论上约等于 125MB/s,实际还会受到协议开销、磁盘性能、窗口大小、丢包重传等因素影响。

5. 看到 TIME_WAIT 就认为一定异常

TIME_WAIT 是 TCP 正常关闭流程的一部分,用来确保最后一个 ACK 有机会被对端收到,也避免旧连接的数据影响后续新连接。是否异常,要看数量、持续时间、端口资源和业务表现。

十一、总结

Linux 网络基础可以按一条链路理解:

  1. 物理介质负责把设备连接起来;
  2. 交换机根据 MAC 地址在局域网内转发帧;
  3. 路由器根据 IP 地址在网段之间转发包;
  4. OSI 和 TCP/IP 模型帮助拆解通信层次;
  5. 数据发送时逐层封装,接收时逐层解封装;
  6. TCP 使用三次握手建立连接,使用四次挥手释放连接;
  7. TCP 状态能帮助判断连接卡在哪个阶段。

真正排查网络故障时的思路是顺着层次往下拆:物理链路是否正常,二层是否能找到 MAC,三层路由是否可达,传输层端口是否通,上层服务是否真正响应。

相关推荐
旗开得胜马到成功1 小时前
可信备份技术解析:中科热备如何防范备份数据被攻击
运维·服务器
NJCloud2 小时前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
晓晓_za8986682 小时前
Geo 优化源码蒸馏词机制:地域词库构建与匹配逻辑详解
运维·tcp/ip·spring·缓存·ci/cd
mounter6252 小时前
将 RDMA 引入容器:Soft-RoCE (RXE) 网络命名空间支持深度解析
linux·linux kernel·kernel·rdma·net namespace
xier_ran2 小时前
【infra之路】GPU 存储层次总结:L1 / L2 / HBM
java·网络·数据库
奈斯先生Vector2 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
wuminyu2 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
小网洞3 小时前
免费WPA无线握手包在线分析跑包网站
网络·网络安全·密码学·wps
Android系统攻城狮3 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶