BGP的“聪明选路”遇上了TCP的“路径洁癖”,需人工调和

在路由器R1上有两条外网,WAN1和WAN2。

R1上做了域名分流功能,全局网址分到WAN1,指定域名分到WAN2(优先级更高)。

症状是用户反馈部分网页无法打开。

于是各种检查尝试...... 2天过去了......

最终结论是:即使SYN请求通过R1的Wan1发出,服务器响应的目标IP(wan1的公网地址)可能被BGP策略判定为"通过wan2更优",导致响应包从wan2进入用户网络。

分析过程:

对TCP三次握手的影响:路径不对称导致连接失败

TCP协议要求连接路径​​双向一致​​(对称性),否则会破坏传输层的可靠性机制。以下是具体冲突点:

​​1.TCP序列号(Sequence Number)校验失败​​ ​​

请求阶段​​:客户端通过wan1发送SYN包(序列号Seq=X),服务器记录此序列号。 ​​

响应阶段​​:若SYN-ACK通过wan2返回,客户端预期确认号为Ack=X+1,但wan2转发的包可能因路径延迟或修改导致序列号不匹配。 ​​

结果​​:客户端丢弃SYN-ACK包,重传SYN请求(Wireshark显示TCP Retransmission) 。 ​​

2.NAT会话表失效

路由器在转发SYN请求时执行​​SNAT​​(源地址转换),将客户端内网IP替换为R1的公网IP,并记录会话表。

当SYN-ACK从wan2进入时,路由器发现此包不匹配R1的会话表条目,可能丢弃或错误转发。

3.实际现象​​

Chrome开发者工具显示ERR_CONNECTION_RESET或超时。

TCP状态机因路径不一致进入死锁(客户端等待SYN-ACK,服务器等待ACK确认)

NAT会话表失效​​

路由器在转发SYN请求时执行​​SNAT​​(源地址转换),将客户端内网IP替换为wan1的公网IP,并记录会话表。 当SYN-ACK从wan2进入时,路由器发现此包不匹配wan1的会话表条目,可能丢弃或错误转发 。 ​​实际现象​​ Chrome开发者工具显示ERR_CONNECTION_RESET或超时。 TCP状态机因路径不一致进入死锁(客户端等待SYN-ACK,服务器等待ACK确认)

以下是BGP的逐包独立选路特性,​​ BGP路由器对每个数据包的转发决策是独立的,基于以下优先级顺序 :

​​本地优先级​​:若wan2所在路径的优先级更高(如运营商策略优化),则优先选择;

AS路径长度(AS Path)​​:若通过wan2的路径经过的AS数量更少(如AS Path更短),则优选; ​​

MED值(多出口鉴别器)​​:若wan2所在入口的MED值更小(如成本更低),则流量被导向wan2;

​​其他规则​​:如权重(Weight)、下一跳IGP开销等。

ps:路由器R1的两个wan口分别对应两个不同的公网ip,请问运营商的设备是如何知道这两个ip就插在同一台设备上的?

答:运营商设备会记录R1的AS号,这个号是唯一的,所以两个ip对应as号一样,它就知道是同一台设备,所以会选对最短路。

相关推荐
二狗mao5 小时前
Uniapp使用websocket进行ai回答的流式输出
websocket·网络协议·uni-app
7***u2165 小时前
显卡(Graphics Processing Unit,GPU)架构详细解读
大数据·网络·架构
河北瑾航科技8 小时前
广西水资源遥测终端 广西水利遥测终端 广西用水监测遥测终端 河北瑾航科技遥测终端机HBJH-B01说明书
网络·科技·水文遥测终端机·遥测终端机·广西水资源遥测终端机·广西水利遥测终端·广西用水终端
羑悻的小杀马特9 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
愚戏师10 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max10 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
1560820721910 小时前
基于7VX690T FPGA实现万兆TCP/IP资源和性能测试
网络协议·tcp/ip·fpga开发
赖small强11 小时前
【Linux 网络基础】libwebsockets HTTPS 服务端实现机制详解
linux·网络·https·tls·libwebsockets
大白的编程日记.11 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
踏浪无痕13 小时前
线上偶发 502 排查:用 Netty 成功复现 KeepAlive 时间窗口案例实战(附完整源码)
运维·网络协议