客户端登录到MySQL的方式,是经典的三次握手方式,相关资料网上都有,不再赘述。但今天采用php5.5的mysql_connect方式登陆mysql5.6以上版本时, 发现登陆方式不是3次握手,而是5次握手。 这是tcpdump出来的包:
22:04:17.476594 IP 10.10.225.193.mysql > 10.10.117.26.50666: Flags [S.], seq 1383769468, ack 3669311543, win 14020, options [mss 1414,sackOK,TS val 2879321384 ecr 2223682561,nop,wscale 9], length 0
0x0000: 4500 003c 0000 4000 3f06 d0cc 0a0a e1c1 E..<..>
0x0010: 0a0a 751a 0cea c5ea 527a a57c dab5 4037 ..u.....Rz.|..@7
0x0020: a012 36c4 e75b 0000 0204 0586 0402 080a ..6..[..........
0x0030: ab9e f528 848a b401 0103 0309 ...(........
22:04:17.476623 IP 10.10.117.26.50666 > 10.10.225.193.mysql: Flags [.], ack 1, win 111, options [nop,nop,TS val 2223682562 ecr 2879321384], length 0
0x0000: 4500 0034 f438 4000 4006 db9b 0a0a 751a E..4.8@.@.....u.
0x0010: 0a0a e1c1 c5ea 0cea dab5 4037 527a a57d ..........@7Rz.}
0x0020: 8010 006f 4c50 0000 0101 080a 848a b402 ...oLP..........
0x0030: ab9e f528 ...(
22:04:17.477131 IP 10.10.225.193.mysql > 10.10.117.26.50666: Flags [P.], seq 1:94, ack 1, win 28, options [nop,nop,TS val 2879321384 ecr 2223682562], length 93
0x0000: 4500 0091 5055 4000 3f06 8022 0a0a e1c1 E...PU@.?.."....
0x0010: 0a0a 751a 0cea c5ea 527a a57d dab5 4037 ..u.....Rz.}..@7
0x0020: 8018 001c 253c 0000 0101 080a ab9e f528 ....%<.........>
0x0030: 848a b402 5900 0000 0a35 2e36 2e32 302d ....Y....5.6.20-
0x0040: 7563 6c6f 7564 7265 6c31 2d6c 6f67 0088 ucloudrel1-log..
0x0050: e873 0147 5a71 4956 562f 2500 fff7 2102 .s.GZqIVV/%...!.
0x0060: 007f 8015 0000 0000 0000 0000 0000 6860 ..............h`
0x0070: 2b51 3659 4071 3a6a 2c38 006d 7973 716c +Q6Y@q:j,8.mysql
0x0080: 5f6e 6174 6976 655f 7061 7373 776f 7264 _native_password
0x0090: 00 .
22:04:17.477156 IP 10.10.117.26.50666 > 10.10.225.193.mysql: Flags [.], ack 94, win 111, options [nop,nop,TS val 2223682562 ecr 2879321384], length 0
0x0000: 4500 0034 f439 4000 4006 db9a 0a0a 751a E..4.9@.@.....u.
0x0010: 0a0a e1c1 c5ea 0cea dab5 4037 527a a5da ..........@7Rz..
0x0020: 8010 006f 4bf3 0000 0101 080a 848a b402 ...oK...........
0x0030: ab9e f528 ...(
22:04:17.477265 IP 10.10.117.26.50666 > 10.10.225.193.mysql: Flags [P.], seq 1:116, ack 94, win 111, options [nop,nop,TS val 2223682562 ecr 2879321384], length 115
0x0000: 4500 00a7 f43a 4000 4006 db26 0a0a 751a E....:@.@..&..u.
0x0010: 0a0a e1c1 c5ea 0cea dab5 4037 527a a5da ..........@7Rz..
0x0020: 8018 006f 6b89 0000 0101 080a 848a b402 ...ok...........
0x0030: ab9e f528 6f00 0001 85a2 0e00 0000 00c0 ...(o...........
0x0040: 2100 0000 0000 0000 0000 0000 0000 0000 !...............
0x0050: 0000 0000 0000 0000 7461 6e67 646f 755f ........tangdou_
0x0060: 7465 7374 0014 ca42 1c92 ae99 b645 52b2 test...B.....ER.
0x0070: e534 c9b7 f7ed f325 c41a 006d 7973 716c .4.....%...mysql
0x0080: 5f6e 6174 6976 655f 7061 7373 776f 7264 _native_password
0x0090: 0015 0c5f 636c 6965 6e74 5f6e 616d 6507 ..._client_name.
0x00a0: 6d79 7371 6c6e 64 mysqlnd
22:04:17.477384 IP 10.10.225.193.mysql > 10.10.117.26.50666: Flags [.], ack 116, win 28, options [nop,nop,TS val 2879321384 ecr 2223682562], length 0
0x0000: 4500 0034 5056 4000 3f06 807e 0a0a e1c1 E..4PV@.?..~....
0x0010: 0a0a 751a 0cea c5ea 527a a5da dab5 40aa ..u.....Rz....@.
0x0020: 8010 001c 4bd3 0000 0101 080a ab9e f528 ....K..........(
0x0030: 848a b402 ....
22:04:17.477520 IP 10.10.225.193.mysql > 10.10.117.26.50666: Flags [P.], seq 94:142, ack 116, win 28, options [nop,nop,TS val 2879321385 ecr 2223682562], length 48
0x0000: 4500 0064 5057 4000 3f06 804d 0a0a e1c1 E..dPW@.?..M....
0x0010: 0a0a 751a 0cea c5ea 527a a5da dab5 40aa ..u.....Rz....@.
0x0020: 8018 001c 9b39 0000 0101 080a ab9e f529 .....9.........)
0x0030: 848a b402 2c00 0002 fe6d 7973 716c 5f6e ....,....mysql_n
0x0040: 6174 6976 655f 7061 7373 776f 7264 0047 ative_password.G
0x0050: 5a71 4956 562f 2568 602b 5136 5940 713a ZqIVV/%h`+Q6Y@q:
0x0060: 6a2c 3800 j,8.
22:04:17.477591 IP 10.10.117.26.50666 > 10.10.225.193.mysql: Flags [P.], seq 116:140, ack 142, win 111, options [nop,nop,TS val 2223682563 ecr 2879321385], length 24
0x0000: 4500 004c f43b 4000 4006 db80 0a0a 751a E..L.;@.@.....u.
0x0010: 0a0a e1c1 c5ea 0cea dab5 40aa 527a a60a ..........@.Rz..
0x0020: 8018 006f 6b2e 0000 0101 080a 848a b403 ...ok...........
0x0030: ab9e f529 1400 0003 ca42 1c92 ae99 b645 ...).....B.....E
0x0040: 52b2 e534 c9b7 f7ed f325 c41a R..4.....%..
22:04:17.477813 IP 10.10.225.193.mysql > 10.10.117.26.50666: Flags [P.], seq 142:153, ack 140, win 28, options [nop,nop,TS val 2879321385 ecr 2223682563], length 11
0x0000: 4500 003f 5058 4000 3f06 8071 0a0a e1c1 E..?PX@.?..q....
0x0010: 0a0a 751a 0cea c5ea 527a a60a dab5 40c2 ..u.....Rz....@.
0x0020: 8018 001c 4470 0000 0101 080a ab9e f529 ....Dp.........)
0x0030: 848a b403 0700 0004 0000 0002 0000 00 ...............
其原因大概是mysql从某个版本后,开始支持插件式登陆。 而php5.5并不支持这个方式,无法按这个方式发送正确协议;为了容错, mysql再次向php5.5发送按照native password登陆的消息, 此后php5.5发送原生的登录包:
22:04:17.477591 IP 10.10.117.26.50666 > 10.10.225.193.mysql: Flags [P.], seq 116:140, ack 142, win 111, options [nop,nop,TS val 2223682563 ecr 2879321385], length 24
0x0000: 4500 004c f43b 4000 4006 db80 0a0a 751a E..L.;@.@.....u.
0x0010: 0a0a e1c1 c5ea 0cea dab5 40aa 527a a60a ..........@.Rz..
0x0020: 8018 006f 6b2e 0000 0101 080a 848a b403 ...ok...........
0x0030: ab9e f529 1400 0003 ca42 1c92 ae99 b645 ...).....B.....E
0x0040: 52b2 e534 c9b7 f7ed f325 c41a R..4.....%..
这个包内容很简单。除了4个字节的头之外,剩下20字节,就是根据密码经过加盐后生成的挑战鉴权数据。 这20个字节,其实在客户端发送的第一个鉴权包中就有:
image.png