RFC 4254 SSH连接协议
RFC 4254 SSH连接协议
全局请求
客户端和服务端随时有可能发送全局请求,接受者必须能够正确的处理。全局请求格式如下:
byte SSH_MSG_GLOBAL_REQUEST
string request name in US-ASCII only
boolean want reply
…. request-specific data follows
‘request name’ 遵循DNS扩展命名下划线。
收件人回应报文:
byte SSH_MSG_REQUEST_SUCCESS
…. response specific datas
如果收件人无法识别或者不支持该请求,则返回:
byte SSH_MSG_REQUEST_FAILURE
频道机制
所有的终端会话,转发连接等都是频道。任意一边都可打开一个频道。多个频道可在一个会话中复用
创建频道
当任意一方想要创建频道,它会分配给该频道一个本地号码。然后终端发送下列报文到另一端,该报文包含本地频道号码和初始化窗口大小。
byte SSH_MSG_CHANNEL_OPEN
string channel type in US-ASCII only
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
…. channel type specific data follows
’channel type’ 是一个名称,在[SSH-ARCH]和[SSH-NUMBERS]中描述。存在相似的扩展机制。’sender channel’ 是一个本地标识。’initial window size’ 指定频道窗口大小,会有多少字节的数据发送到对端。 ’maximum packet size’指定字节长度最大值。
对端要么回复SSH_MSG_CHANNEL_OPEN_CONFIRMATION,报文结构如下:
byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION
uint32 recipient channel
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
…. channel type specific data follows
要么回复SSH_MSG_CHANNEL_OPEN_FAILURE,报文结构如下:
byte SSH_MSG_CHANNEL_OPEN_FAILURE
uint32 recipient channel
uint32 reason code
string description in ISO-10646 UTF-8 encoding [RFC3629]
string language tag [RFC3066]
数据传输
window size 指定了对端需要读取多少字节才能进行下一步。调整窗口大小的报文结构如下:
byte SSH_MSG_CHANNEL_WINDOW_ADJUST
uint32 recipient channel
uint32 bytes to add
收到该报文后,接受者可能发送之前所允许的字节大小长度。发送如下报文后数据传输结束。
byte SSH_MSG_CHANNEL_DATA
uint32 recipient channel
string data
数据报文
byte SSH_MSG_CHANNEL_EXTENDED_DATA
uint32 recipient channel
uint32 data_type_code
string data
| Symbolic name | data_type_code |
|---|---|
| SSH_EXTENDED_DATA_STDERR | 1 |
扩展数据定义
关闭通道
当不再发送数据时,任意一方可发送如下报文
byte SSH_MSG_CHANNEL_EOF
uint32 recipient channel
当任意一方想要关闭通道时,发送SSH_MSG_CHANNEL_CLOSE报文
byte SSH_MSG_CHANNEL_CLOSE
uint32 recipient channel
特定频道”请求
报文结构如下:
byte SSH_MSG_CHANNEL_REQUEST
uint32 recipient channel
string request type in US-ASCII characters only
boolean want reply
…. type-specific data follows
如果’want reply’ 为false,则该请求没有任何回应。否则,对端要么回应SSH_MSG_CHANNEL_SUCCESS,报文结构如下:
byte SSH_MSG_CHANNEL_SUCCESS
uint32 recipient channel
要么回应SSH_MSG_CHANNEL_FAILURE,报文结构如下:
byte SSH_MSG_CHANNEL_FAILURE
uint32 recipient channel
章节6 会话交互
6.1 创建会话
6.2 请求伪终端
6.3 X11转发
6.3.1 请求X11转发
6.3.2 X11频道
6.4 环境变量传递
6.5 执行Shell或者Command
6.6 会话数据传输
6.7 窗口尺寸大小调整
6.8 本地流控制
6.9 信号
6.10 返回退出状态
章节7 TCP/IP端口转发
章节7.1 请求端口转发
章节7.2 TCP/IP 转发频道
章节8 终端模式编码
报文编码总结
| Symbolic Name | reason code |
| SSH_MSG_GLOBAL_REQUEST | 80 |
| SSH_MSG_REQUEST_SUCCESS | 81 |
| SSH_MSG_REQUEST_FAILURE | 82 |
| SSH_MSG_CHANNEL_OPEN | 90 |
| SSH_MSG_CHANNEL_OPEN_CONFIRMATION | 91 |
| SSH_MSG_CHANNEL_OPEN_FAILURE | 92 |
| SSH_MSG_CHANNEL_WINDOW_ADJUST | 93 |
| SSH_MSG_CHANNEL_DATA | 94 |
| SSH_MSG_CHANNEL_EXTENDED_DATA | 95 |
| SSH_MSG_CHANNEL_EOF | 96 |
| SSH_MSG_CHANNEL_CLOSE | 97 |
| SSH_MSG_CHANNEL_REQUEST | 98 |
| SSH_MSG_CHANNEL_SUCCESS | 99 |
| SSH_MSG_CHANNEL_FAILURE | 100 |