SSH协议连接过程
流程为个人总结,如有不对还请指正
连接过程

连接过程表格
| 序号 | 连接过程(按时间顺序详细拆分) | TCP裸连 | SSH | 数据包 |
|---|---|---|---|---|
| 1 | 连接初始化 | 客户端准备连接,指定服务器IP和端口 | 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 | 无(本地准备阶段,未产生网络报文) |
| 2 | TCP三次握手 - 第一步 | 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) | 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) | [包 978](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 3 | TCP三次握手 - 第二步 | 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) | 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) | [包 980](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 4 | TCP三次握手 - 第三步 | 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 | 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 | [包 982](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 5 | 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 | 无 | 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) | [包 985](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 6 | 服务器接收客户端版本字符串,回复自身SSH版本字符串 | 无 | 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) | [包 990](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 7 | 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 | 无 | 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 | [包 992](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 8 | 服务器接收算法列表,选择双方共有的最优算法组合 | 无 | 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 | [包 998](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 9 | 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 | 无 | 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 | [包 1010](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) [包 1012](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401)(第1个消息:SSH_MSG_KEX_ECDH_REPLY) |
| 10 | 双方基于共享密钥派生各类会话密钥 | 无 | 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 | 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; |
| 11 | 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 | 无 | 服务器将自己的主机公钥发送给客户端 | [包 1012](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401)(第1个消息:SSH_MSG_KEX_ECDH_REPLY) |
| 12 | 客户端验证服务器主机公钥指纹 | 无 | 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 | 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 |
| 13 | 主机身份验证通过 | 无 | 客户端确认主机可信,向服务器发起用户身份认证请求 | 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 |
| 14 | 服务器侧密钥切换通知 | 无 | 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 | [包 1012](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401)(第2个消息:SSH_MSG_NEWKEYS) |
| 15 | 客户端侧密钥切换通知 | 无 | 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 | [包 1014](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 16 | 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 | 无 | 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 | [包 1016](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 17 | 服务器验证用户身份合法性 | 无 | 服务器校验客户端提交的认证信息,验证失败则拒绝连接 | 无独立网络报文,验证结果随[包1020](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401)的加密响应一并返回 |
| 18 | 用户身份验证通过 | 无 | 服务器向客户端发送认证成功消息 | [包 1020](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 19 | 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 | 无 | 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) | 抓包中未展示的加密业务包(封装会话类型请求) |
| 20 | 服务器分配会话资源,建立SSH加密会话 | 无 | 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) | 抓包中未展示的加密业务包(封装会话建立确认响应) |
| 21 | 数据传输 - 应用层数据准备 | 应用层生成待传输的明文业务数据 | 应用层生成待传输的明文业务数据(如Shell命令、文件内容) | 抓包中未展示的后续加密包 |
| 22 | 数据传输 - TCP报文封装 | 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 | 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 | 抓包中未展示的后续加密包 |
| 23 | 数据传输 - 报文发送 | TCP明文报文通过网络层、数据链路层发送至接收端 | TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) | 抓包中未展示的后续加密包 |
| 24 | 数据传输 - 接收TCP报文 | 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 | 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 | 抓包中未展示的后续加密包 |
| 25 | 数据传输 - 获取应用层数据 | 原始明文数据直接交付上层应用程序处理 | SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 | 抓包中未展示的后续加密包 |
| 26 | 主动关闭方先发送SSH断开连接消息(包含断开原因) | 无 | 主动关闭方先发送SSH断开连接消息(包含断开原因) | [包 2351](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 27 | 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 | 无 | 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 | [包 2353](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 28 | TCP关闭 - 第一步(主动方发起) | 主动关闭方发送FIN报文,请求断开TCP底层连接 | 主动关闭方发送FIN报文,请求断开TCP连接 | [包 2397](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
| 29 | TCP关闭 - 第二步(被动方确认) | 被动关闭方回复ACK,确认收到FIN断开请求 | 被动关闭方回复ACK,确认收到FIN断开请求 | [包 2399](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) |
| 30 | TCP关闭 - 第三步(被动方发起) | 被动关闭方剩余数据发送完毕,发送FIN收尾报文 | 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 | [包 2399](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) |
| 31 | TCP关闭 - 第四步(主动方确认) | 主动方回复最终ACK,TCP双向连接完全释放断开 | 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 | [包 2401](#序号 连接过程(按时间顺序详细拆分) TCP裸连 SSH 数据包 1 连接初始化 客户端准备连接,指定服务器IP和端口 客户端准备SSH连接,指定服务器IP、端口(默认22)和目标登录用户名 无(本地准备阶段,未产生网络报文) 2 TCP三次握手 - 第一步 客户端发送SYN包(包含初始序列号ISNc,请求建立连接) 客户端发送SYN包(包含初始序列号ISNc),请求建立TCP底层连接(SSH基于TCP协议) 包 978 3 TCP三次握手 - 第二步 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 服务器接收SYN包,回复SYN+ACK包(包含服务器初始序列号ISNs,确认客户端ISNc) 包 980 4 TCP三次握手 - 第三步 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs) ✅TCP连接正式建立,立即传输明文业务数据 客户端接收SYN+ACK包,发送ACK包(确认服务器ISNs),TCP连接正式建立,启动SSH协议握手流程 包 982 5 【SSH协议阶段1:版本协商】 客户端发送自身SSH版本字符串 无 客户端发送格式为SSH-<主版本>.<次版本>-<软件标识>的版本字符串 如 SSH-2.0-nsssh2_8.0.0022 NetSarang Computer, Inc. - SSH-2.0: 使用 SSH-2协议(当前通用标准,SSH-1已经淘汰) - nsssh2_8.0.0022: NetSarang SSH客户端版本(对应Xshell 8.0.0022版本) - NetSarang Computer, Inc.: 客户端所属厂商(Xshell的开发公司) 包 985 6 服务器接收客户端版本字符串,回复自身SSH版本字符串 无 服务器回复自身SSH版本字符串,双方确认使用SSH-2协议(版本不兼容则直接断开连接) 包 990 7 【SSH协议阶段2:算法协商】 客户端发送支持的算法套件列表 无 客户端按优先级发送支持的密钥交换、对称加密、哈希、压缩算法列表 包 992 8 服务器接收算法列表,选择双方共有的最优算法组合 无 服务器从客户端列表中选择匹配的最优算法,回复选中的算法套件 包 998 9 【SSH协议阶段3:密钥交换】 双方执行密钥交换算法 无 执行协商好的密钥交换算法(如Curve25519-SHA256),生成共享密钥材料 包 1010 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 10 双方基于共享密钥派生各类会话密钥 无 派生临时会话密钥、加密密钥、完整性校验密钥、初始化向量等所有加密所需密钥 双方本地计算/校验操作: 步骤 10:双方基于ECDH共享密钥本地派生会话加密密钥、MAC密钥,不产生网络报文; 11 【SSH协议阶段4:主机身份认证】 服务器发送自身主机公钥 无 服务器将自己的主机公钥发送给客户端 包 1012(第1个消息:SSH_MSG_KEX_ECDH_REPLY) 12 客户端验证服务器主机公钥指纹 无 客户端对比本地~/.ssh/known_hosts文件中的指纹,首次连接需人工确认是否信任该主机 双方本地计算/校验操作: 步骤 12:客户端本地对比主机公钥指纹、校验签名合法性,不产生网络报文。 13 主机身份验证通过 无 客户端确认主机可信,向服务器发起用户身份认证请求 为客户端本地逻辑,验证通过后由后续加密包承载用户认证请求。 14 服务器侧密钥切换通知 无 服务器发送密钥切换通知,宣告己方已启用新会话密钥,后续数据全部加密,是步骤10派生密钥后的标准切换流程。 包 1012(第2个消息:SSH_MSG_NEWKEYS) 15 客户端侧密钥切换通知 无 客户端回复SSH_MSG_NEWKEYS,宣告己方已启用新会话密钥;至此双向全部进入加密传输模式,是加密会话的正式起点。 包 1014 16 【SSH协议阶段5:用户身份认证】 客户端发送用户认证信息 无 支持密码认证、公钥认证、主机认证等方式,企业环境主流使用公钥认证 包 1016 17 服务器验证用户身份合法性 无 服务器校验客户端提交的认证信息,验证失败则拒绝连接 无独立网络报文,验证结果随包1020的加密响应一并返回 18 用户身份验证通过 无 服务器向客户端发送认证成功消息 包 1020 19 【SSH协议阶段6:会话建立】 客户端发送会话类型请求 无 请求交互式Shell、远程命令执行、SFTP文件传输或端口转发等会话类型 加密的SSH_MSG_CHANNEL_OPEN(客户端请求打开Shell会话通道) 抓包中未展示的加密业务包(封装会话类型请求) 20 服务器分配会话资源,建立SSH加密会话 无 服务器分配会话资源,SSH加密会话正式建立,后续所有数据均通过加密通道传输 加密的SSH_MSG_CHANNEL_OPEN_CONFIRMATION(服务器确认通道建立) 抓包中未展示的加密业务包(封装会话建立确认响应) 21 数据传输 - 应用层数据准备 应用层生成待传输的明文业务数据 应用层生成待传输的明文业务数据(如Shell命令、文件内容) 抓包中未展示的后续加密包 22 数据传输 - TCP报文封装 直接对明文原始数据添加TCP头部(端口、序列号、确认号),组成TCP明文报文段 明文数据先交给SSH传输层,使用协商好的对称加密算法加密并添加完整性校验码,再对加密后的SSH数据包添加TCP头部,组成TCP报文段 23 数据传输 - 报文发送 TCP明文报文通过网络层、数据链路层发送至接收端 TCP报文通过网络层、数据链路层发送至接收端(载荷为加密后的SSH数据) 24 数据传输 - 接收TCP报文 接收端接收TCP报文,剥离TCP头部,直接提取原始明文 接收端接收TCP报文,剥离TCP头部,提取加密后的SSH数据包 25 数据传输 - 获取应用层数据 原始明文数据直接交付上层应用程序处理 SSH传输层对数据包进行解密和完整性校验,验证通过后将明文数据交付上层应用程序处理 26 主动关闭方先发送SSH断开连接消息(包含断开原因) 无 主动关闭方先发送SSH断开连接消息(包含断开原因) 包 2351 27 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 无 服务器收到断开消息后,SSH层处理断开逻辑,回复自身的断开确认/断开消息。 包 2353 28 TCP关闭 - 第一步(主动方发起) 主动关闭方发送FIN报文,请求断开TCP底层连接 主动关闭方发送FIN报文,请求断开TCP连接 包 2397 29 TCP关闭 - 第二步(被动方确认) 被动关闭方回复ACK,确认收到FIN断开请求 被动关闭方回复ACK,确认收到FIN断开请求 包 2399 服务器将「确认客户端FIN的ACK」和「服务器主动关闭的FIN」合并为一个FIN+ACK报文(TCP延迟确认机制的常规优化,即三次挥手) 30 TCP关闭 - 第三步(被动方发起) 被动关闭方剩余数据发送完毕,发送FIN收尾报文 被动关闭方所有加密数据发送完毕,发送TCP FIN收尾报文 31 TCP关闭 - 第四步(主动方确认) 主动方回复最终ACK,TCP双向连接完全释放断开 主动方回复最终ACK,TCP双向连接完全释放,SSH会话同步销毁 包 2401) |
SSH 时序图UML
服务器 客户端 服务器 客户端 #mermaid-svg-dnSLz1rIXe0fUZT0{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dnSLz1rIXe0fUZT0 .error-icon{fill:#552222;}#mermaid-svg-dnSLz1rIXe0fUZT0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dnSLz1rIXe0fUZT0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dnSLz1rIXe0fUZT0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dnSLz1rIXe0fUZT0 .marker.cross{stroke:#333333;}#mermaid-svg-dnSLz1rIXe0fUZT0 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dnSLz1rIXe0fUZT0 p{margin:0;}#mermaid-svg-dnSLz1rIXe0fUZT0 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dnSLz1rIXe0fUZT0 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dnSLz1rIXe0fUZT0 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-dnSLz1rIXe0fUZT0 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-dnSLz1rIXe0fUZT0 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-dnSLz1rIXe0fUZT0 .sequenceNumber{fill:white;}#mermaid-svg-dnSLz1rIXe0fUZT0 #sequencenumber{fill:#333;}#mermaid-svg-dnSLz1rIXe0fUZT0 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-dnSLz1rIXe0fUZT0 .messageText{fill:#333;stroke:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dnSLz1rIXe0fUZT0 .labelText,#mermaid-svg-dnSLz1rIXe0fUZT0 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .loopText,#mermaid-svg-dnSLz1rIXe0fUZT0 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dnSLz1rIXe0fUZT0 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-dnSLz1rIXe0fUZT0 .noteText,#mermaid-svg-dnSLz1rIXe0fUZT0 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-dnSLz1rIXe0fUZT0 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dnSLz1rIXe0fUZT0 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dnSLz1rIXe0fUZT0 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dnSLz1rIXe0fUZT0 .actorPopupMenu{position:absolute;}#mermaid-svg-dnSLz1rIXe0fUZT0 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-dnSLz1rIXe0fUZT0 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dnSLz1rIXe0fUZT0 .actor-man circle,#mermaid-svg-dnSLz1rIXe0fUZT0 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-dnSLz1rIXe0fUZT0 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 【阶段1】TCP 三次握手 · 建立底层连接 TCP连接正式建立 【阶段2】SSH 版本协商(明文传输) 双方确认使用SSH-2协议,版本不兼容则直接断开 【阶段3】算法套件协商(明文传输) 协商确定全程使用的密码学算法 【阶段4】ECDH密钥交换 + 主机身份认证(明文传输) 本地计算(无网络报文): 1. 基于ECDH计算共享密钥 2. 派生会话加密密钥、MAC密钥 3. 校验主机公钥指纹与签名合法性 本地计算(无网络报文): 1. 基于ECDH计算共享密钥 2. 派生会话加密密钥、MAC密钥 【阶段5】密钥切换 · 进入加密模式 ⚠️ 此后所有消息均为对称加密+完整性校验传输 【阶段6】用户身份认证(加密传输) 用户身份验证通过,进入会话建立阶段 【阶段7】会话通道建立(加密传输) SSH加密会话正式建立,可开始业务数据传输 【阶段8】业务数据加密传输 所有数据分片传输,全程保证机密性与完整性 【阶段9】SSH 应用层优雅关闭(加密传输) 应用层完成关闭通知,双方SSH层资源准备释放 【阶段10】TCP 传输层连接释放 TCP连接完全释放,操作系统回收端口与会话资源 SYN (携带客户端初始序列号ISNc) SYN+ACK (携带服务器初始序列号ISNs,确认ISNc) ACK (确认ISNs) SSH版本字符串(SSH-2.0-客户端标识) SSH版本字符串(SSH-2.0-OpenSSH_xxx) SSH_MSG_KEXINIT(客户端支持的密钥交换/加密/MAC/压缩算法列表) SSH_MSG_KEXINIT(服务器选中的最优算法组合) SSH_MSG_KEX_ECDH_INIT(客户端临时ECDH公钥Qc) SSH_MSG_KEX_ECDH_REPLY(服务器主机公钥 + 临时公钥Qs + 签名) SSH_MSG_NEWKEYS(服务器宣告启用新会话密钥) SSH_MSG_NEWKEYS(客户端宣告启用新会话密钥) 加密 SSH_MSG_USERAUTH_REQUEST(密码/公钥等认证信息) 加密 SSH_MSG_USERAUTH_SUCCESS / FAILURE(认证结果) 加密 SSH_MSG_CHANNEL_OPEN(请求Shell/命令/SFTP等通道) 加密 SSH_MSG_CHANNEL_OPEN_CONFIRMATION(通道建立确认) 加密 业务数据(Shell命令、文件上传、端口转发数据等) 加密 业务数据(命令回显、文件下载、响应数据等) 加密 SSH_MSG_DISCONNECT(携带断开原因码与描述) 加密 SSH_MSG_DISCONNECT(断开确认) FIN+ACK(发起TCP层连接关闭) FIN+ACK(合并确认与关闭,即三次挥手优化) ACK(最终确认关闭)
Wireshark 抓包分析
包 978 TCP三次握手 第一步
- 客户端通过 SYN 包向服务器发起连接请求,同时协商 MSS、窗口缩放、SACK 等 TCP 扩展选项。

包 980 TCP三次握手 第二步
- 此包是对包 978(客户端 SYN 包)的直接响应,Ack=1(原始值2620931998)与包 978 的客户端序列号完全匹配,完成了 "确认客户端请求" 的步骤。
- 同时,服务器通过SYN=1标志发起自身的连接请求,同步服务器侧初始序列号,为后续客户端回复 ACK 包(三次握手第三步)做准备。
- 核心特征是Flags: 0x012 (SYN, ACK),这是区分三次握手第二步包的唯一标识。

包 982 TCP三次握手 第三步
- 此包是对包 980(服务器 SYN+ACK 包)的直接响应,Ack=1(原始值1734002015)与包 980 的服务器序列号完全匹配,完成了 "确认服务器请求" 的步骤。
- 同时,客户端通过Seq=1(原始值2620931998)继续同步自身的序列号,此时 TCP 连接的三次握手已全部完成,双方进入数据传输阶段。
- 核心特征是Flags: 0x010 (ACK),这是区分三次握手第三步包的唯一标识(仅 ACK 标志位为 1,无 SYN 标志)。

包 985 SSH 连接建立阶段的客户端版本协商包
- 此包为SSH 连接建立阶段的客户端版本协商包,是 SSH 连接中唯一明文传输的阶段之一。

包 990 SSH 连接建立阶段的服务器版本协商包
- 此包为SSH 连接建立阶段的服务器版本协商包,是对客户端此前发送的版本包的回复,也是 SSH 连接中少数明文传输的阶段之一。

包 992 SSH2协议 密钥协商阶段 客户端Key_Exchange_Init(密钥交换初始化)包
- 此包是 SSH 连接中算法协商的核心,后续服务器会回复 SSH_MSG_KEXINIT 包,双方根据协商好的算法(如 Curve25519 密钥交换、ChaCha20-Poly1305 加密)生成会话密钥,之后的所有交互数据将通过协商好的算法加密传输,不再明文暴露任何信息。

包 998 SSH2协议 密钥协商阶段 服务器Key_Exchange_Init(密钥交换初始化)包
- 此包与客户端的包 992 共同完成了 SSH 算法协商:双方在密钥交换、加密、MAC 算法上均达成了一致,后续将使用协商好的
curve25519-sha256@libssh.org密钥交换算法和chacha20-poly1305@openssh.com加密算法生成会话密钥,之后的所有交互数据将通过协商好的算法加密传输,不再明文暴露任何信息。

包 1010 SSH2协议 密钥协商阶段 客户端ECDH密钥交换初始化包
- 此包是 SSH 密钥协商的核心步骤之一,后续服务器会回复 SSH_MSG_KEX_ECDH_REPLY(消息码 31),携带服务器的临时 ECDH 公钥和服务器主机公钥的签名。客户端验证签名有效性后,双方将基于协商好的 ECDH 算法计算出共享密钥,并派生会话密钥、加密密钥和完整性校验密钥。密钥协商完成后,所有交互数据将通过协商好的算法加密传输,不再明文暴露任何信息。

包 1012 SSH2协议 密钥协商阶段 服务器发送的多消息TCP段
此包为SSH-2 密钥协商阶段服务器发送的多消息 TCP 段,由服务器(10.93.110.205)发送给客户端(10.93.98.19),TCP 载荷内包含 3 个连续的 SSH 消息:
- SSH_MSG_KEX_ECDH_REPLY(消息码 31):ECDH 密钥交换回复,携带服务器主机公钥、临时 ECDH 公钥及签名;
- SSH_MSG_NEWKEYS(消息码 21):密钥切换通知,宣告后续会话进入加密模式;
- 首个加密 SSH 数据包:加密后的会话数据,无明文解析。

此包完成了 SSH 密钥协商的最后两步:
- 客户端收到 SSH_MSG_KEX_ECDH_REPLY 后,需完成三项验证:
① 用服务器主机公钥验证签名有效性;
② 用自身临时私钥与服务器临时公钥计算共享密钥;
③ 派生会话密钥、加密密钥和完整性校验密钥。- 验证通过后,客户端发送自身的 SSH_MSG_NEWKEYS 消息,双方正式进入加密会话阶段,后续所有交互数据均以密文形式传输,无法通过抓包获取明文内容。
包 1014 SSH2协议 密钥协商阶段 客户端发送的SSH_MSG_NEWKEYS消息(消息码21)
- 此包为 SSH-2 密钥协商阶段客户端发送的 SSH_MSG_NEWKEYS消息(消息码 21),是密钥交换流程的收尾消息,也是 SSH 连接中最后一个可明文解析的控制包。
- 发送此消息后,客户端将正式启用协商好的加密密钥,后续所有数据均以密文传输。

- 明文阶段的终点 :此包是 SSH 连接中最后一个可被 Wireshark 明文解析的消息。在此之后,客户端发出的所有数据包(用户认证、命令执行、文件传输等)都会通过
chacha20-poly1305@openssh.com加密,抓包只能看到密文,无法直接读取内容。- 双向切换逻辑 :服务器此前已在包 1012 中发送了自己的 SSH_MSG_NEWKEYS ;当双方都发送并确认 NEWKEYS 后,整个 SSH 会话的双向传输就全部进入加密状态,密钥协商阶段正式结束,接下来进入用户认证阶段。
包 1016 SSH2协议 密钥协商完成 进入加密传输阶段后 客户端加密数据包
- 明文阶段的彻底结束:此包是 SSH 全流程中完全加密的业务数据包,此前的版本协商、算法协商、密钥交换均为明文 / 半明文;从该包开始,用户认证、Shell 交互、文件传输等所有业务数据全部加密,抓包无法获取任何明文内容,这是 SSH 协议的核心安全价值。
- 无法解密的本质原因:SSH 每次连接都会生成独一无二的临时会话密钥,密钥通过 ECDH 密钥交换协商,仅存在于通信双方的内存中,不会在网络中传输;没有会话密钥就无法解密任何载荷内容,这是协议设计层面的安全保障,并非 Wireshark 功能限制。

包 1020 SSH2协议 加密会话阶段 服务器返回的加密响应包
- 阶段定位 :此包处于 SSH 用户认证阶段的加密交互,是服务器对客户端认证请求的应答。从连接流程看 ,前一个客户端加密包1016为 SSH_MSG_USERAUTH_REQUEST,本包为对应的服务器响应。
- 无法解密的本质:SSH 每次连接都会生成独一无二的临时会话密钥,密钥通过 ECDH 密钥交换协商,仅存在于通信双方的内存中,不会在网络中传输;没有会话密钥就无法解密任何载荷内容,这是协议设计层面的安全保障,并非 Wireshark 功能限制。

包 2351 客户端主动发起 SSH优雅关闭的加密断开消息
此包是服务器收到客户端断开请求后,回复的加密断开响应包,是服务器发送 TCP FIN 之前的最后一个带应用层载荷的数据包,内部封装服务器侧的断开确认 / 断开通知消息。

包 2353 服务器收到客户端断开请求后 回复的加密断开响应包
结合此前解析的关闭包,完整的 SSH 优雅关闭时序为:
包 2351 :客户端发送加密 SSH_MSG_DISCONNECT 断开通知(应用层主动关闭)
包 2353 :服务器回复加密断开响应,同时确认收到客户端断开请求
包 2397 :客户端发送 TCP FIN+ACK,启动 TCP 层连接关闭
包 2399 :服务器合并回复 FIN+ACK,完成三次挥手
包 2401 :客户端回复最终 ACK,连接进入 TIME_WAIT 状态

包 2397 TCP四次挥手 第一次挥手包
- 此包是 TCP 四次挥手的第一步,发送后客户端进入 FIN_WAIT_1 状态;
- 服务器收到后会回复确认,进入 CLOSE_WAIT 状态,完成半关闭(客户端不再发数据,但仍可接收服务器数据)。

包 2399 服务器侧发送的FIN+ACK报文 四次挥手合并为三次挥手
- 标准 TCP 关闭为四次挥手:客户端 FIN → 服务器 ACK → 服务器 FIN → 客户端 ACK。
- 本场景中,服务器收到客户端 FIN 时,自身已无数据需要发送,且 TCP 默认开启 延迟确认(Delayed ACK) 机制,因此将 「确认客户端 FIN 的 ACK 包」 和 「服务器主动关闭的 FIN 包」 合并为一个 FIN+ACK 包发送,减少一次报文交互,形成 三次挥手

包 2401 客户端发送的纯ACK确认段
三次挥手的最后一步
客户端状态变化 :发送完本 ACK 报文后,客户端不会立即释放连接,而是进入 TIME_WAIT 状态,持续 2MSL(最长报文寿命的两倍)。作用有两个:
- 保证最后一个 ACK 能可靠到达服务器,若 ACK 丢失,服务器会重传 FIN,客户端可在 TIME_WAIT 期间再次回复 ACK;
- 确保本次连接的所有残留报文都在网络中过期,避免干扰后续新建的同端口连接。
服务器状态变化 :服务器收到本 ACK 后,会立即结束 LAST_ACK 状态,进入 CLOSED 状态,彻底释放连接资源,无需等待。
