关于远程连接mysql报错
问题描述:
客户通过vpn,内网访问云平台rds数据库,出现navicat连接rds后打开库卡死的问题
命令行登陆mysql报错reading table information for completion of table and column names
原因分析:
了解到mtu和mss相关;
Mtu:以太网帧都有最小64bytes,最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
以太网最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址 48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分 4Bytes(这个部分有时候也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。
Mss:建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下:客户机发出syn报文,其中option选项填充的mss字段一般为1460,同样服务器收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。
为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。
个人理解
由于默认mss值使用了mtu最大值1500,因此在传输是封包过程中加上包头达到了以太网帧最大值;由于通过vpn连接,因此可能过程中还需添加vpn相关包头,是以太网帧大于1518,变为错误帧,导致传输失败。