整個通信過程當中,通過下面幾個階段協商實現認證鏈接。shell
由客戶端向服務器發出 TCP 鏈接請求。服務器
TCP 鏈接創建後,客戶端進入等待,服務器向客戶端發送第一個報文,宣告本身的版本號,包括協議版本號和軟件版本號。協議版本號由主版本號和次版本號兩部分組成。它和軟件版本號一塊兒構成形如:"SSH-<主協議版本號>.<次協議版本號>-<軟件版本號>\n"
的字符串。其中軟件版本號字符串的最大長度爲40個字節,僅供調試使用。cookie
客戶端接到報文後,回送一個報文,內容也是版本號。客戶端響應報文裏的協議版本號這樣來決定:當與客戶端相比服務器的版本號較低時,若是客戶端有特定的代碼來模擬,則它發送較低的版本號;若是它不能,則發送本身的版本號。當與客戶端相比服務器的版本號較高時,客戶端發送本身的較低的版本號。按約定,若是協議改變後與之前的相兼容,主協議版本號不變;若是不相兼容,則主主協議版本號升高。session
服務器接到客戶端送來的協議版本號後,把它與本身的進行比較,決定可否與客戶端一塊兒工做。若是不能,則斷開TCP 鏈接;若是能,則按照二進制數據包協議發送第一個二進制數據包,雙方以較低的協議版原本一塊兒工做。到此爲止,這兩個報文只是簡單的字符串,你我等凡人直接可讀。ui
協商解決版本問題後,雙方就開始採用二進制數據包進行通信。加密
由服務器向客戶端發送第一個包,內容爲本身的 RSA主機密鑰(host key)的公鑰部分、RSA服務密鑰(server key)的公鑰部分、支持的加密方法、支持的認證方法、次協議版本標誌、以及一個 64 位的隨機數(cookie)。這個包沒有加密,是明文發送的。客戶端接收包後,依據這兩把密鑰和被稱爲cookie的 64 位隨機數計算出會話號(session id)和用於加密的會話密鑰(session key)。spa
隨後客戶端回送一個包給服務器,內容爲選用的加密方法、cookie的拷貝、客戶端次協議版本標誌、以及用服務器的主機密鑰的公鑰部分和服務密鑰的公鑰部分進行加密的用於服務器計算會話密鑰的32 字節隨機字串。除這個用於服務器計算會話密鑰的 32字節隨機字串外,這個包的其餘內容都沒有加密。以後,雙方的通信就是加密的了,服務器向客戶端發第二個包(雙方通信中的第一個加密的包)證明客戶端的包已收到。代理
雙方隨後進入認證階段。能夠選用的認證的方法有:調試
~/.rhosts 或 /etc/hosts.equiv 認證(缺省配置時不允許使用它);code
用 RSA 改進的 ~/.rhosts 或 /etc/hosts.equiv 認證;
RSA 認證;
口令認證。
若是是使用 ~/.rhosts 或 /etc/hosts.equiv 進行認證,客戶端使用的端口號必須小於1024。
認證的第一步是客戶端向服務器發 SSH_CMSG_USER 包聲明用戶名,服務器檢查該用戶是否存在,肯定是否須要進行認證。若是用戶存在,而且不須要認證,服務器回送一個SSH_SMSG_SUCCESS 包,認證完成。不然,服務器會送一個 SSH_SMSG_FAILURE 包,表示或是用戶不存在,或是須要進行認證。注意,若是用戶不存在,服務器仍然保持讀取從客戶端發來的任何包。除了對類型爲 SSH_MSG_DISCONNECT、SSH_MSG_IGNORE 以及 SSH_MSG_DEBUG 的包外,對任何類型的包都以 SSH_SMSG_FAILURE 包。用這種方式,客戶端沒法肯定用戶到底是否存在。
若是用戶存在但須要進行認證,進入認證的第二步。客戶端接到服務器發來的 SSH_SMSG_FAILURE 包後,不停地向服務器發包申請用各類不一樣的方法進行認證,直到時限已到服務器關閉鏈接爲止。時限通常設定爲 5 分鐘。對任何一個申請,若是服務器接受,就以 SSH_SMSG_SUCCESS 包迴應;若是不接受,或者是沒法識別,則以 SSH_SMSG_FAILURE 包迴應。
認證完成後,客戶端向服務器提交會話請求。服務器則進行等待,處理客戶端的請求。在這個階段,不管什麼請求只要成功處理了,服務器都向客戶端迴應 SSH_SMSG_SUCCESS包;不然迴應 SSH_SMSG_FAILURE 包,這表示或者是服務器處理請求失敗,或者是不能識別請求。會話請求分爲這樣幾類:申請對數據傳送進行壓縮、申請僞終端、啓動 X十一、TCP/IP 端口轉發、啓動認證代理、運行 shell、執行命令。到此爲止,前面全部的報文都要求 IP 的服務類型(TOS)使用選項 IPTOS_THROUGHPUT。
會話申請成功後,鏈接進入交互會話模式。在這個模式下,數據在兩個方向上雙向傳送。此時,要求 IP 的服務類型(TOS)使用 IPTOS_LOWDELAY 選項。當服務器告知客戶端本身的退出狀態時,交互會話模式結束。
(注意:進入交互會話模式後,加密被關閉。在客戶端向服務器發送新的會話密鑰後,加密從新開始。用什麼方法加密由客戶端決定。)