TCP的sn和ack_sn

发起端或客户端:10.0.0.1 接收端或服务端:10.0.0.78:7891

第一个包:发起新建连接序列号:2640889442


第二个包:
接受确认新新建序列号:2640889443
接受响应新建序列号:2170956858

第三个包:
确认发起序列号:2640889443
确认响应序列号:2170956859

总结:

  1. 首次发起包的序列号,第一个发起包的序列号+1
  2. 其次响应包的序列号,第二个响应包的序列号+1
  3. 最终确认发起新建序列号:2640889443;确认响应序列号:2170956859。
  4. TCP三次握手建立完成!!!
  5. TCP三次握手第一次开始发送数据包sn:2640889443,ack_sn:2170956859
  6. TCP三次握手第二次接受对方发送数据包:sn:2170956859 ack num:2640889446
  7. TCP三次握手第三次开发发送数据包sn:2640889446 ack_sn:2170956861
  8. 接受对方发送数据包:sn:2170956861 ack_num:2640889485
  9. 开发发送数据包sn:2640889485 ack_sn:2170956871
  10. 数据包及四次挥手过程:只需关注ack_sn包序列号。
  11. TCP四次挥手第一次发送sn:2170960460 ack_sn:2640890376
  12. TCP四次挥手第二次发送sn:2640890376 ack_sn:2170960970
  13. TCP四次挥手第三次发送sn:2170960970 ack_sn:2640890377
  14. TCP四次挥手第四次发送sn:2640890377 ack_sn:2170960971


postgres启动服务状态卡前台窗口

问题描述

执行systemct start postgresql-16.service,前台窗口一直不退出。检查postgres服务状态,运行正常。

问题分析

症状就是 systemctl start 一直卡在前台窗口。
因为 systemd 没收到 PostgreSQL 服务启动完成的状态通知,才会一直卡在前台窗口。这种问题主要出现在自编译安装或第三方安装的postgres数据库中,如编译过程中没有添加参数 --with-systemd

cat /usr/lib/systemd/system/postgresql-16.service
[Unit]
Description=PostgreSQL 16 database server
Documentation=https://www.postgresql.org/docs/16/static/
After=network.target
[Service]
Type=notify #问题点,编译未添加 --with-systemd
User=postgres
Group=postgres
Environment=PGDATA=/xxx/pgdata/
ExecStart=/xxx/bin/postgres -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0
[Install]
WantedBy=multi-user.target

问题解决

将notify更改为simple, systemd 只要看到主进程postgres启动就当服务已启动,不等待额外通知。
[Service]
Type=simple