為了學習一下scp協議,我找了一個開源的scp實現(python實現)來看。這里記錄我的學習過程
1、主模塊
scp內置了兩個參數 -t 和 -f ,這兩個參數是隱藏的,不會被用戶顯式提供,那么誰提供這個參數呢,兩個scp進程之間傳輸數據時,遠端機器上的scp進程被本地scp進程啟動起來時提供上去。需要說明的是,這是通過本地scp進程經ssh遠程過去開啟遠端機器的scp進程來實現的。
2、SSH遠程連接模塊
開啟一個遠程連接用了paramiko這個包,登陸時提示輸入密碼則可以使用python自帶的getpass這個模塊
3、傳輸模塊
這個模塊是最核心的模塊了。發送數據接收數據的具體代碼都在這了。ssh的數據和消息統一使用一個tcp channel。也就是說建立起來的tcp連接既走協議消息包又走文件數據包。ssh的協議是簡單的一問一答型協議,還有是簡單的文本型協議。
比如說D代表發送文件夾,C代表發送文件,T代表文件夾或者文件的時間戳信息。我們可以擴展這個簡單的協議,比如加上H字段協議用作文件哈希值字段,實現斷點續傳功能。
另外程序中有個打印進度條功能,實現是在每次有網絡IO時就觸發一次更新打印進度條,具體的就是read,write函數