为什么 psql 会打开两个到 PostgreSQL 的 tcp 连接?

Eva*_*oll 2 postgresql psql connectivity

例如,如果我放置一个 iproute,就像这样

sudo iptables -I INPUT -p tcp --syn -m conntrack --ctstate NEW --ctstatus CONFIRMED --dport 5433 -j LOG
Run Code Online (Sandbox Code Playgroud)

我可以看到每次尝试连接到我的数据库时都有两个条目。

[598519.458578] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=49795 DF PROTO=TCP SPT=58554 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0 
[598520.875428] IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=192.168.0.101 DST=192.168.0.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=65392 DF PROTO=TCP SPT=58560 DPT=5433 WINDOW=43690 RES=0x00 SYN URGP=0 
Run Code Online (Sandbox Code Playgroud)

为什么 psql 需要在两个单独的端口(58554 和 58560)上连接到 PostgreSQL 服务器?也就是说,当我运行一次时,我会收到两条类似上面的消息..

psql -d test -h 192.168.0.101 -p 5433
Run Code Online (Sandbox Code Playgroud)

Dan*_*ité 5

这种双重连接取决于客户端是否必须提交密码(根据pg_hba.conf),如果是,则该-W选项是否传递给psql

事实上,避免第二次连接尝试是此选项的唯一存在理由。根据psql 联机帮助页

-W --密码

强制 psql 在连接到数据库之前提示输入密码。

这个选项从来都不是必需的,因为如果服务器要求密码认证,psql 会自动提示输入密码。但是,psql 会浪费一次连接尝试,发现服务器需要密码。在某些情况下,值得输入 -W 以避免额外的连接尝试。

请注意,此选项将在整个会话中保持设置,因此它会影响元命令 \connect 的使用以及初始连接尝试。

我认为使用来自 iptables 的这个日志,您只是注意到提到的“浪费的连接尝试”。请注意两个连接之间经过的时间: [598519.458578][598520.875428]。大概这是您输入密码所花费的时间:大约1.42几秒钟。

如果您尝试使用-W它进行相同的测试,则应在尝试连接之前询问密码并仅进行一次连接。