星级打分
平均分:0 参与人数:0 我的评分:未评
* |# B& F6 T* V" U6 e; a
0 U0 `5 ^- t% [1 w拔网线这个动作在不同场景下到底"重置"了什么、TCP连接拔掉网线后为什么可能"死而复生"、广播风暴导致网络瘫痪的成因和拔网线为什么能救回来、交换机环路和端口自环的区别,以及网络工程师面对"拔网线就好了"时的技术判断逻辑。以后别人再说你"玄学修网",你可以甩这篇给他看。
6 S0 |# J0 V# D! y" i# \& u
2 J+ R' [! A5 [ P% ?) d1 b! i# b8 F01 那次我拔了一根网线,被同事说“IT也就会拔网线”
4 ^+ ~) _5 t! Q2 W) s记得刚入职那会儿,有次整个办公室网络卡得不行,ping网关丢包超过50%。领导在群里@我:“网络怎么回事?赶紧处理一下!”我跑去机房,排查了路由、检查了DHCP、看了交换机日志,都没发现异常。当时急得满头汗,突然发现交换机上有一根网线的灯闪得特别不正常——比别的端口快很多。
3 f* O: `, A+ s我犹豫了一下,伸手把那根网线拔了。不到五秒,群里有人说“好像好了”。然后我又插回去,一切正常。
4 J3 r# a3 R0 S9 e; o后来同事开玩笑说:“你也就这点本事,拔网线谁不会啊。”我当时没说话,但后来我发现,这根网线连着的是一个测试交换机,那台交换机上有一个端口自环了,导致广播包在整个网络里乱窜。我拔的那一下,等于切断了风暴源。
7 D/ s$ p( J1 d+ t2 M J
不是因为我会拔网线,而是因为我知道该拔哪一根。
* B- }/ X% D4 J: z" w. Z
" t/ R, ]$ z6 ?* J0 t8 [02 拔网线到底“重置”了什么?取决于你在哪拔
8 Q8 W+ z- W$ A& A拔网线这个动作,在不同网络层级上“重置”的东西完全不一样。分三种情况说:
. b6 k8 v) M) U* z, j1 p }$ u# d. p X5 V* q# g
情况一:拔的是你电脑到墙上的那根网线重置的是网卡和交换机的物理链路状态。你拔出网线,电脑网卡检测到链路断开,操作系统知道这个网卡没有物理连接了。插回去之后,网卡重新协商速率(10/100/1000Mbps自动协商),重新建立链路。
: a- L, v8 p- U# ~/ }7 N0 S/ b$ _* ?" T& V8 S1 n! D
情况二:拔的是交换机之间或交换机到路由器的主干网线这种操作能救回网络的概率最高,原因往往是广播风暴。广播风暴就是网络中充斥着大量广播数据包,把正常的点对点通信全挤死了。当广播包数量占到通讯总量的30%时,网络传输效率就会明显下降。
( Q/ f, `( ]' N! a# m有网络工程师回忆过一个真实场景:2006年F1上海国际赛车场新闻中心,刚插上一根网线,然后很多用户立马无法上网,也无法登录交换机。检查后发现网线有问题,拔掉故障线路后,网络立马恢复。
! F6 U) W) Y, k2 L什么情况会导致广播风暴?一块故障网卡、一个故障端口,甚至是一根网线收发线短接,都可能导致广播包在环路中无限循环。拔掉主干网线,相当于切断了风暴的源头,等风暴平息了再插回去,网络恢复正常。
$ v2 Q' ~- _" f5 t( [ U8 W0 v
+ ~/ Z1 Q5 |) ^7 B情况三:拔的是服务器网线这个场景和前面两种情况完全不同。拔服务器网线解决的不是网络堵塞问题,而是TCP连接状态的问题。
7 e- ]! U1 ?. g03 TCP连接拔了网线还能恢复?答案分两种情况
7 E% [ s2 e5 H; s# [! H; }1 f0 V很多人以为网线都拔了,TCP连接肯定断了。这个理解不全对。TCP连接在Linux内核中是一个结构体,拔掉网线并不会改变这个结构体的任何内容,所以TCP连接的状态不会因为网线被拔而自动变化。
0 o, Y# X9 Z" P' `& [5 v" E
4 S o3 u* g3 K关键在于拔了网线之后,有没有数据传输。
/ ?6 |, f# y, t* W/ g5 X, E* q) r0 M( w% A7 E' [7 t6 v+ ~* O5 N( g
场景一:拔了网线之后,有数据传输假设服务端正好往客户端发了数据,收不到ACK确认包,就会触发TCP超时重传。Linux系统有个参数叫tcp_retries2,默认值15,控制超时重传的最大次数。
; u) M$ W) T4 c6 g
如果在服务端重传还没达到最大次数之前,你插回了网线,客户端TCP连接状态还是ESTABLISHED,能正常接收数据包,然后回ACK。这时候,连接恢复了,上层应用根本感觉不到网线被拔过。
" D" W7 x$ Y( V( t' M但如果插回网线之前,服务端重传次数已经用完了,服务端判定连接出问题,主动断开。等客户端插回网线再发数据,服务端已经没有对应的连接信息了,回复RST报文。这时候,TCP连接就彻底断了。
8 I- B/ R# _. g) p: g( g# y( Y" ~. Q1 M' l- @
场景二:拔了网线之后,没有任何数据传输如果双方都没有开启TCP KeepAlive(保活机制),又没有数据传输,TCP连接理论上可以一直保持ESTABLISHED状态。即使网线拔了一天再插回去,连接可能还在。
5 @" {- f7 L$ h7 ? A h, A
如果开启了TCP KeepAlive,Linux默认配置是:7200秒(2小时)没有活动才开始探测,每75秒探测一次,连续9次无响应才判定连接死亡。也就是说,至少需要2小时11分才能发现一个“死亡”连接。
, a. M9 C$ t. O& b! q
所以,你平时拔一下网线再插回去,大概率TCP连接还在——因为时间太短,系统还没来得及判定它死了。
/ Y0 _/ X9 B) D2 A* v0 I; ], z7 p) i5 {& o' W" U' _
04 那交换机环路呢?拔网线为什么能救?
' {* J, `/ x/ ?. O* ^" Z5 W% X/ Y
交换机环路是另一种完全不同的场景。一根网线插到交换机的两个不同端口上,或者网线收发线短接,都会形成环路。广播包在环路中无限循环,大量消耗交换机CPU,网络瘫痪。
) x5 p% p3 R4 A2 w' J6 @
排查环路最直接的方法就是物理拔线:把网线一根根拔掉,拔到哪根网络恢复正常,那根线就是问题所在。这就是“拔网线就好了”的另一个技术场景——拔掉了环路的“元凶”。
- [7 A6 N+ {$ g# pTP-Link官网的技术文档也明确提到:对于不支持环路检测功能的非网管交换机,只能采用手动拔线的方式排查。
' }5 [4 z6 Y$ P6 {0 d8 S( D6 v8 @
M( E1 C; D1 E8 e6 ]7 N/ R+ C
05 写在最后
1 h- P1 O% G( J& B: e
“拔网线”听起来像玄学,但背后是有技术逻辑的。现在我能理直气壮地跟同事解释:拔电脑网线:重置物理链路协商,网卡和交换机重新“握手”拔主干网线:切断了广播风暴的源头,或者拔掉了造成环路的线路拔服务器网线:TCP连接可能还在(拔的时间短+重传没超时),也可能断了(重传超时了)所以别再觉得网管只会拔网线了。拔哪根、什么时候拔、拔完会触发什么机制,这里面全是技术判断。
9 U/ E* A( Q P1 s g. s6 f. [+ @+ d6 [: H3 I
END
# _. x/ u7 M) r/ j+ w
以上就是“拔网线就好了”的完整技术拆解。
0 R1 d. @& _, k- S6 q8 w9 X+ s# t' `/ V1 g- m
3 x# y/ [3 i0 A7 q7 s0 C! N- s
# l/ Y/ r0 S; L; u7 C! H- d1 k8 Z" t
当然你也可以直接拨打电话13101986181,让我帮你组装电脑,装机!
/ m( C& C( |6 s* ]1 `
1 j! O/ m9 }( L) y5 A; g7 l