IPmsg(飞鸽传书)协议翻译
生活随笔
收集整理的這篇文章主要介紹了
IPmsg(飞鸽传书)协议翻译
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近準備做一個自己的項目練手,系統的鞏固一下自己最近學習的知識,網上找了一下,發現IPmsg(飛鴿傳書)是個不錯的選擇:LINUX C/C++、多線程、線程間通信、QT。所以就決定做這個。
找了很多資料,決定從翻譯協議開始,順便熟悉協議,網上只能找到第9版的英文協議,最新的第十版只有日文,沒辦法,硬著頭皮翻譯日文吧。。
先吐槽一下google、bing、百度三家的翻譯質量:google翻譯英文很不錯,日文感覺一般,bing是友人推薦,翻譯日文質量在我意料之外,協議翻譯基本也就是參考bing翻譯的,google輔助。百度了就要坑很多了,翻譯過程可以概述為:分詞查字典。根本不做任何語法調整。(如果用這個方法翻英文,我懷疑”HOW ARE YOU“真的就翻成了”怎么試你“。汗。。。。)無力吐槽。。。
其他不多說了,直接上翻譯協議,由于一點日文不懂,翻譯的比較爛,見笑了。。
?
翻譯中文版 1 /****************************************************************** 2 *原始的IPmsg協議規范是由日本人白水啟章(H.Shirouzu)先生編寫。 * 3 *本文檔是由風之痕(Frank Song)翻譯。 2012/10/30 4 *email:spf.doudou@gmail.com //如果有任何意見和建議,歡迎聯系我 5 ******************************************************************/ 6 7 ---------------------------------------------------------------------- 8 IPmsg通信規范協議(草案第10版) 1996/02/21 9 修改于 2011/05/03 10 11 H.Shirouzu 12 http://ipmsg.org 13 ---------------------------------------------------------------------- 14 15 概述: 16 一個使用TCP/UDP端口接收和發送消息的服務程序。 17 18 功能特點: 19 IPmsg可以在任何使用TCP/IP協議的操作系統中使用,在你的計算機所在的 20 網絡或者指定的網絡中動態識別各個成員,并且可以在所有成員之間傳遞消息。 21 22 詳細信息: 23 1、命令 24 1) 命令類型(命令編號(32位)的低8位) 25 26 IPMSG_NOOPERATION 無操作 27 IPMSG_BR_ENTRY 進入服務 (啟動時對廣播) 28 IPMSG_BR_EXIT 退出服務 (退出時對廣播) 29 IPMSG_ANSENTRY 通知新輸入條目 30 IPMSG_BR_ABSENCE 變更無人值守模式 31 32 IPMSG_BR_ISGETLIST 搜索有效的發送主機成員列表 33 IPMSG_OKGETLIST 通知發送主機列表 34 IPMSG_GETLIST 請求發送主機列表 35 IPMSG_ANSLIST 發送主機列表 36 37 IPMSG_SENDMSG 發送消息 38 IPMSG_RECVMSG 消息確認 39 40 IPMSG_READMSG 消息讀取 41 IPMSG_DELMSG 消息丟棄 42 IPMSG_ANSREADMSG 消息讀取確認(第8版追加) 43 44 IPMSG_GETFILEDATA 文件傳輸請求(使用TCP) 45 IPMSG_RELEASEFILES 文件丟棄 46 IPMSG_GETDIRFILES 文件夾傳輸請求 47 48 IPMSG_GETINFO 得到IPmsg版本信息 49 IPMSG_SENDINFO 發送IPmsg版本信息 50 51 IPMSG_GETABSENCEINFO 收到缺席通知 // 52 IPMSG_SENDABSENCEINFO 發送缺席通知 // 53 54 IPMSG_GETPUBKEY 取得RSA公鑰 55 IPMSG_ANSPUBKEY 響應RSA公鑰 56 57 2) 選項標記類型 (命令編號(32位)的高24位) 58 59 IPMSG_ABSENCEOPT 存在/缺席模式(成員識別命令中使用) 60 IPMSG_SERVEROPT 服務器模式(預留) 61 IPMSG_DIALUPOPT 發送單個成員識別命令 62 63 IPMSG_SENDCHECKOPT 傳輸校驗 64 IPMSG_SECRETOPT 密封消息 65 IPMSG_READCHECKOPT 密封消息確認(第8版追加) 66 IPMSG_PASSWORDOPT 掛鎖 67 IPMSG_BROADCASTOPT 廣播(報告) 68 IPMSG_MULTICASTOPT 組播(多選) 69 IPMSG_NEWMULTIOPT 新版本組播(預留) 70 IPMSG_NOLOGOPT 不保留日志(建議) 71 IPMSG_NOADDLISTOPT 通知BR_ENTRY以外的成員 72 IPMSG_AUTORETOPT 自動應答(防止乒乓球?)(第10版加入) //? 73 74 IPMSG_FILEATTACHOPT 附件 75 IPMSG_ENCRYPTOPT 密碼 76 IPMSG_ENCEXTMSGOPT 加密的附件信息 (第10版加入) //? 77 78 IPMSG_CAPUTF8OPT 兼容UTF-8 (第10版) 79 IPMSG_UTF8OPT 全部使用UTF-8 (第10版) 80 IPMSG_CLIPBOARDOPT 支持圖像 (第10版) 81 82 IPMSG_RETRYOPT 重試標志(搜索HOSTLIST時使用) 83 84 3) 加密部分擴展標志 (16進制格式) 85 86 IPMSG_RSA_512 公鑰加密(RSA 512bit) 87 IPMSG_RSA_1024 公鑰加密(RSA 1024bit) 88 IPMSG_RSA_2048 公鑰加密(RSA 2048bit) 89 IPMSG_RC2_40 共用密鑰加密(RC2 40bit) 90 IPMSG_BLOWFISH_128 共用密鑰加密(Blowfish 128bit) 91 IPMSG_AES_256 共用密加密(AES 256bit) 92 IPMSG_PACKETNO_IV 包字符串使用對稱密鑰密碼 //? 93 IPMSG_ENCODE_BASE64 base64使用共用密鑰密碼 94 IPMSG_SIGN_SHA1 明文文本使用SHA1數字簽名 95 96 4) 文件類型(fileattr的低8bit) 97 98 IPMSG_FILE_REGULAR 99 IPMSG_FILE_DIR 100 IPMSG_FILE_RETPARENT 101 IPMSG_FILE_SYMLINK 102 IPMSG_FILE_CDEV 103 IPMSG_FILE_BDEV 104 IPMSG_FILE_FIFO 105 IPMSG_FILE_RESFORK 106 107 5) 文件屬性(fileattr的高24bit) 108 109 IPMSG_FILE_RONLYOPT 110 IPMSG_FILE_HIDDENOPT 111 IPMSG_FILE_EXHIDDENOPT 112 IPMSG_FILE_ARCHIVEOPT 113 IPMSG_FILE_SYSTEMOPT 114 115 6) 文件屬性擴展部分 116 117 IPMSG_FILE_UID 118 IPMSG_FILE_USERNAME 119 IPMSG_FILE_GID 120 IPMSG_FILE_GROUPNAME 121 IPMSG_FILE_PERM 122 IPMSG_FILE_MAJORNO 123 IPMSG_FILE_MINORNO 124 IPMSG_FILE_CTIME 125 IPMSG_FILE_MTIME 126 IPMSG_FILE_ATIME 127 IPMSG_FILE_CREATETIME 128 129 IPMSG_FILE_CREATOR 130 IPMSG_FILE_FILETYPE 131 IPMSG_FILE_FINDERINFO 132 133 IPMSG_FILE_ACL 134 IPMSG_FILE_ALIASFNAME 135 136 2、命令格式(所有都表示為字符串) 137 1)命令(版本 1) 138 Ver(1):包號:用戶名:主機名:命令編號:附加部分 139 2)使用當前命令格式收/發消息示例: 140 "1:100:shirouzu:jupiter:32:Hello" 141 142 3、命令處理概述 143 1)成員識別 144 145 在啟動時,IPMSG_BR_ENTRY廣播通知所有已存在的成員,正在啟動一個新的成員主機。 146 147 廣播之后,所有的成員把新成員加入到他們的列表中,一個IPMSG_ANSENTRY命令返回 148 給新成員。(注:win版本的IP地址范圍和成員數目隨機等待0-4秒) 149 150 新成員通過IPMSG_ANSENTRY命令得到現有成員的數據,只要有一個IP數據包存在,所有 151 的成員都可以進行通信。 152 153 IPMSG_BR_ABSENCE廣播可以告訴所有成員無人值守模式或者昵稱的變化。(與IPMSG_BR_ENTRY 154 命令不同,收到后IPMSG_ANSENTRY不返回) 155 156 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE命令使用IPMSG_ABSENCEOPT標志作為無人 157 模式或者昵稱添加的命令。 158 IPMSG_DIALUPOPT命令用于撥號上網等不能接受廣播的成員,此標志需要單獨向成員發送確認命令。 159 160 (擴展組:)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE告訴成員如果輸入的是傳統 161 字符串,將會把組名設置為他所屬組的名字。 162 163 2)收/發消息 164 165 使用IPMSG_SENDMSG發送消息,消息被放在命令的擴展區。接受方IPMSG_SENDCHECKOPT標志為ON 166 的話就只返回擴展區帶有數據包編號的IPMSG_RECVMSG命令。 167 168 發送廣播時使用IPMSG_BOADCASTOPT命令,IPMSG_SENDMSG標志為ON。自動發送的包添加 169 IPMSG_AUTORETOPT命令進行ping-pong保護,如果有一包為ON,確認/自動發送包不返回。 170 171 發送信息密封需要一個為ON的IPMSG_SECRETOPT包。這樣,接收端講發送一個擴展區帶有包編號 172 的IPMSG_READMSG命令。 173 174 (追加:IPMSG_NOADDLISTOPT) 175 當從不再主機列表的中的主機收到 IPMSG_SENDMSG包時,IPmsg將會發送一個IPMSG_BR_ENTRY命令, 176 以確認主機是否存在,或者把主機加入主機列表中。但這種行為是應該被避免的,所以應該在 177 IPMSG_SENDMSG包中添加IPMSG_NOADDLISTOPT標志。 178 179 (第8版追加:IPMSG_READCHECKOPT ) 180 IPmsg處理帶有IPMSG_READCHECKOPT標志的IPMSG_READMSG命令和處理帶有IPMSG_SENDCHECKOPT標 181 志的IPMSG_SENDMSG命令是一樣的,但是前者用IPMSG_ANSREADMSG應答,后者用IPMSG_RECVMSG。 182 183 此外,消息嵌入圖像文件類型如4)中所述。(第10版加) 184 185 3)收/發消息加密(第9版加) 186 187 公鑰與共鑰配合使用。做為一般規則,加密用十六進制的格式。然而,IPMSG_ENCODE_BASE64具有 188 加密消息的功能,使用共通鑰部分base64描述的方式,而不是十六進制。(第10版追) 189 190 (公鑰的取得)向接收方發送IPMSG_GETPUBKEY命令,對方接受IPMSG_ANSPUBKEY,從而獲取公鑰。 191 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY開頭的主機加密標志(IPMSG_RSA_2048 等)應設置為OR。 192 (詳細信息見“1、3)加密標志”部分) 193 194 此外,在IPMSG_ANSPUBKEY中,公共密鑰按照EE-NNNNNN(E=指數,N=方法)方式用“:”分開。同時, 195 在E和N中間添加“-”。這個序列在隨后的收/發處理中可以通過記錄公鑰和加密信息來跳過。 196 197 (信息加密)當發送方建立一個收/發雙方的共用密鑰后,就用它來加密信息,另外,接收方的公鑰 198 加密共用密鑰。應該注意是否有組合執行限制(其他參考 4)。 199 200 (加密信息傳輸)在IPMSG_SENDMSG中設置IPMSG_ENCRYPTOPT標志。在擴展部分開始區域,加入公鑰 201 和共用密鑰的OR值。然后用以‘:’分隔的公鑰加密共用密鑰。(如果你使用了IPMSG_ENCODE_BASE64, 202 則會使用bash64編碼,而不是十六進制)公鑰加密共用密鑰,共用密鑰加密消息、明文和末尾的‘\0’。 203 204 (電子簽名選項)如果兩者都支持SHA-1電子簽名,則設置IPMSG_SIGN_SHA1。明文的SHA-1值用私鑰 205 加密,上述的加密正文追加在‘:’后邊。 206 207 另外,在編碼方式方面,RSA公鑰根據密碼/署名為PKCS#1-v1_5,AES/Blowfish/RC2共用密鑰和使用 208 PKCS#5 CBC加密。 209 PMSG_PACKETNO_IV設置:IV是Packet使用的號碼字符串(IV比較短的時候用0補全),如果IV不為0, 210 IPMSG_PACKETNO_IV就要被設置。 211 212 另外,Entry包如果設置了IPMSG_ENCRYPTOPT 標志,表明支持加密功能。 213 214 (用戶名公鑰指紋)(第10版加) 215 在末尾的用戶名和SHA-1數字簽名可以授予使用2048bitRSA,使用公鑰指紋(下述)。 216 1)幫助保持用戶名的唯一性 217 2)你可以使用假公鑰防止身份信息被盜(收到信息后確認IPMSG_ANSPUBKEY與指紋相匹配) 218 219 創建用戶名公鑰指紋 220 1)生成公鑰的SHA-1摘要值(160位) 221 2)末尾添加32位0成為192位的值 222 3)192位到64為分為3各字段,用XOR運算三個字段 223 4)64位值固定為16個字的十六進制字符串 224 5)以指紋字符串的形式把指紋添加到用戶名末尾 225 226 此外,即使使用用戶名公鑰指紋,如果Entry包沒有IPMSG_ENCRYPTOPT 或 227 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY的加密能力不包括IPMSG_RSA_2048/IPMSG_SIGN_SHA1 , 228 我建議你銷毀報文。 229 230 4)文件擴展部分(第九版追加) 231 232 包含IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG文件傳輸命令標志著有附件信息。 233 在信息后和附件信息后加入'\0'。 234 235 fileID:filename:size:mtime:fileattr[:extend-attr=val1 236 [,val2...][:extend-attr2=...]]:\a[:]fileID... 237 (大小,修改時間,十六進制描述的文件屬性,如果文件名中含有':',請用"::"替代。) 238 239 當接收信息下載附件文件時,IPMSG_GETFILEDATA命令請求和UDP一樣的TCP數據傳輸包端口。 240 在擴展區域添加packetID:fileID: offset(均使用十六進制格式) 241 文件發送方收到請求并判定它是正確的請求之后發送指定數據。(無格式) 242 243 當數據接收方下載劃分的附件文件時,使用IPMSG_GETDIRFILES命令,并且將packetID:fileID 244 寫入擴展區域,發送數據傳輸請求包。(均使用十六進制) 245 246 數據發送方發送下面劃分的數據格式: 247 header-size:filename:file-size:fileattr[:extend-attr=val1 248 [,val2...][:extend-attr2=...]]:contents-data 249 下一個headersize:下一個filename... 250 (除了文件名和內容數據之外均使用十六進制格式) 251 252 header-size是從header-size開始到內容數據前的分隔符':'結束。擴展屬性可以忽略并且 253 使用多擴展屬性。使用'='for 數據輸入。 254 255 當文件屬性是IPMSG_FILE_DIR,飛鴿自動判定它是在目錄中,下一個文件數據在目錄之后。 256 257 當文件屬性是IPMSG_FILE_RETPARENT,飛鴿判定它返回到父目錄。在這種情況之下,文件名 258 總是'.'并且屬性值是當前目錄信息。 259 260 開始發送附件并且返回IPMSG_FILE_RETPARENT命令到附件目錄。 261 262 另外,Entry包添加IPMSG_FILEATTACHOPT 標志表明支持附件文件。 263 264 (附件文件加密)在Entry包使用了IPMSG_SENDMSG和IPMSG_ENCEXTMSGOPT 的情況下,你可以 265 繼續用上面的格式寫‘\0’結束的明文信息,整個消息內容都會得到加密。 266 267 (添加圖像附件)圖像被粘貼到普通信息里面,以發送正常附件文件的形式發送。但是,指 268 定文件屬性的IPMSG_FILE_CLIPBOARD 。在文件名字段中指定的文件,要包裹文件的類型擴展 269 名,通常使用PNG格式。 270 嵌入圖像的位置信息,IPMSG_FILE_CLIPBOARDPOS=推薦的插入偏移位置可以用上面說的 271 extend-attr=val(都用十六進制表示)。但是,如果想插入多張圖片,已經存在的圖片 272 算作之前存在的一個字符。 273 274 另外,Entry包設置IPMSG_CLIPBOARDOPT來表明主機支持圖像嵌入。 275 276 5)多語言擴展(UTF-8) 277 278 主機可以通過UTF-8發/收消息和文件來支持多語言通信。IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE 279 通過設置IPMSG_CAPUTF8OPT標志表明可能使用UTF-8。如果IPMSG_CAPUTF8OPT設置IPMSG_UTF8OPT, 280 你就可以用UTF-8發送數據包(包含文件附件消息部分) 281 282 如果你接受附件文件的原信息中設置了IPMSG_UTF8OPT ,同時IPMSG_GETFILEDATA命令設置了IPMSG_UTF8OPT, 283 就可以接收數據的UTF-8形式的文件/目錄的名稱。 284 285 BR包(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE)中不能IPMSG_UTF8OPT標明UTF-8的使用。(現 286 有的非UTF-8客戶端會出現問題)。因此,BR包后邊加\0\n兩個字節(如果不擴展的組名稱,插入一個 287 '\0'作為虛擬名稱,IPmsg會繼續插入\0\n,即:\0\0\n) 288 之后,UTF-8中添加下面的項: 289 UN:用戶名\n 290 HN:主機名\n 291 NN:昵稱\n 292 GN:組名\n 293 另外,僅由ASCII碼標識條目或者不存在的條目可以省略。 294 以上擴展如果與以前的不同看,以擴展的為標準。 295 296 6)其他命令 297 298 發送 IPMSG_GETINFO 命令來得到其他成員的IPmsg版本。接收方的版本信息通過 299 IPMSG_SENDINFO發送回來。 300 301 發送IPMSG_GETABSENCEINFO命令來得到成員缺席通知。如果你設置了無人模式通知, 302 接收方發送IPMSG_SENDABSENCEINFO。當離開的時候發送一個字符串(如:“Not absence mode”等) 303 304 7)確認/重試 305 306 對于IPMSG_SENDMSG 和IPMSG_RECVMSG 發送的數據包,要在一定時間內確認,如果確認超時, 307 則重發數據包。重試次數和超時時間依賴于實現。 308 309 4、其他 310 311 1)關于換行 312 313 消息中的換行符統一為UNIX格式(‘0x0a’),如有必要,請進行轉換。 314 315 2)分隔符 316 317 用戶名、主機名后使用':'分隔符,包含':'的名字不能使用分隔符。萬一用戶名主機名中包含 318 ':',請使用其他符號(如:';')代替。 319 320 3)字符碼 321 322 如果設置了IPMSG_UTF8OPT,使用UTF-8,如果沒有,使用CP932。 323 324 4)加密的組合 325 326 協議中沒有可參考的實現,windows版本中,只支持下面3種: 327 328 1. IPMSG_RSA_2048 / IPMSG_AES_256 ... (*1) 329 2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2) 330 3. IPMSG_RSA_512 / IPMSG_RC2_40 331 332 (*1)IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1支持選線 333 (*2)IPMSG_PACKETNO_IV支持選項 334 335 5、聯系信息 336 337 在http://ipmsg.org 中。 338 339 340 附錄 341 342 命令代碼,請參閱 ipmsg.h。 343 如果有任何建議,請發送給我。 原日文版 1 (Japanese) 2 ---------------------------------------------------------------------- 3 IP Messenger 通信プロトコル仕様(ドラフト10版) 1996/02/21 4 Modify 2011/05/03 5 6 H.Shirouzu 7 http://ipmsg.org 8 ---------------------------------------------------------------------- 9 10 概要 11 TCP/UDP Port を使用した、メッセージ送受信サービスです 12 13 特徴 14 TCP/IP が使えれば OS の種類を問いません。自分のいるネットワーク 15 內(および指定のネットワーク)で、動的なメンバ認識ができます。 16 メッセージ送信そのものは、IP接続している全メンバに対し行えます。 17 18 詳細 19 TCP/UDP ポート(default:2425)を使用して、以下の方法で処理します。 20 (メッセージ送受信:UDP、ファイル送受信:TCP を使用) 21 22 1.コマンド 23 24 1) コマンド種類 (command番號(32bit)のうち、下位8bit) 25 26 IPMSG_NOOPERATION 無操作 27 IPMSG_BR_ENTRY サービスにエントリ(起動時にBroadcast) 28 IPMSG_BR_EXIT サービスから抜ける(終了時にBroadcast) 29 IPMSG_ANSENTRY エントリを認識したことを通知 30 IPMSG_BR_ABSENCE 不在モード変更 31 32 IPMSG_BR_ISGETLIST ホストリスト送出可能メンバの探索 33 IPMSG_OKGETLIST ホストリスト送出可能通知 34 IPMSG_GETLIST ホストリスト送出要求 35 IPMSG_ANSLIST ホストリスト送出 36 37 IPMSG_SENDMSG メッセージの送信 38 IPMSG_RECVMSG メッセージの受信確認 39 40 IPMSG_READMSG 封書の開封通知 41 IPMSG_DELMSG 封書破棄通知 42 IPMSG_ANSREADMSG 封書の開封確認(8 版から追加) 43 44 IPMSG_GETFILEDATA 添付ファイル要求(TCP で使用) 45 IPMSG_RELEASEFILES 添付ファイル破棄 46 IPMSG_GETDIRFILES 添付階層ファイル要求 47 48 IPMSG_GETINFO IPMSGバージョン情報取得 49 IPMSG_SENDINFO IPMSGバージョン情報応答 50 51 IPMSG_GETABSENCEINFO 不在通知文取得 52 IPMSG_SENDABSENCEINFO 不在通知文応答 53 54 IPMSG_GETPUBKEY RSA 公開鍵取得 55 IPMSG_ANSPUBKEY RSA 公開鍵応答 56 57 2) オプションフラグ種類 (command番號(32bit)のうち、上位24bit) 58 59 IPMSG_ABSENCEOPT 不在モード(メンバ認識系コマンドで使用) 60 IPMSG_SERVEROPT サーバー(予約) 61 IPMSG_DIALUPOPT メンバ認識系のコマンドを個別に送り返す 62 63 IPMSG_SENDCHECKOPT 送信チェック 64 IPMSG_SECRETOPT 封書 65 IPMSG_READCHECKOPT 封書確認(8 版から追加) 66 IPMSG_PASSWORDOPT 錠前 67 IPMSG_BROADCASTOPT ブロードキャスト(同報) 68 IPMSG_MULTICASTOPT マルチキャスト(複數選択) 69 IPMSG_NEWMULTIOPT ニューバージョンマルチキャスト(予約) 70 IPMSG_NOLOGOPT ログに殘さない(ことを推奨) 71 IPMSG_NOADDLISTOPT BR_ENTRYしていない一時メンバ通知 72 IPMSG_AUTORETOPT 自動応答(ピンポン防止用) 73 74 IPMSG_FILEATTACHOPT ファイル添付 75 IPMSG_ENCRYPTOPT 暗號 76 IPMSG_ENCEXTMSGOPT ファイル添付情報を暗號文に含める 77 78 IPMSG_CAPUTF8OPT UTF-8を使用する能力がある 79 IPMSG_UTF8OPT メッセージ全體に UTF-8を使用している 80 IPMSG_CLIPBOARDOPT メッセージ畫像埋め込み添付をサポート 81 82 IPMSG_RETRYOPT 再送フラグ(HOSTLIST 取得時に使用) 83 84 3) 暗號拡張部用フラグ (拡張部に組み合わせを hex 表現で使用) 85 86 IPMSG_RSA_512 公開鍵(RSA 512bit)暗號能力 87 IPMSG_RSA_1024 公開鍵(RSA 1024bit)暗號能力 88 IPMSG_RSA_2048 公開鍵(RSA 2048bit)暗號能力 89 IPMSG_RC2_40 共通鍵(RC2 40bit)暗號能力 90 IPMSG_BLOWFISH_128 共通鍵(Blowfish 128bit)暗號能力 91 IPMSG_AES_256 共通鍵(AES 256bit)暗號能力 92 IPMSG_PACKETNO_IV 共通鍵暗號の IV に Packet番號文字列を利用 93 IPMSG_ENCODE_BASE64 暗號文の共通鍵以降の記述に base64 を利用 94 IPMSG_SIGN_SHA1 平文に SHA1電子署名を付與 95 96 4) 添付ファイル拡張用ファイル種類(fileattr下位8bit) 97 98 IPMSG_FILE_REGULAR 99 IPMSG_FILE_DIR 100 IPMSG_FILE_RETPARENT 101 IPMSG_FILE_SYMLINK 102 IPMSG_FILE_CDEV 103 IPMSG_FILE_BDEV 104 IPMSG_FILE_FIFO 105 IPMSG_FILE_RESFORK 106 107 5) 添付ファイル拡張用ファイル屬性(fileattr上位24bit) 108 109 IPMSG_FILE_RONLYOPT 110 IPMSG_FILE_HIDDENOPT 111 IPMSG_FILE_EXHIDDENOPT 112 IPMSG_FILE_ARCHIVEOPT 113 IPMSG_FILE_SYSTEMOPT 114 115 6) 添付ファイル拡張用拡張ファイル屬性 116 117 IPMSG_FILE_UID 118 IPMSG_FILE_USERNAME 119 IPMSG_FILE_GID 120 IPMSG_FILE_GROUPNAME 121 IPMSG_FILE_PERM 122 IPMSG_FILE_MAJORNO 123 IPMSG_FILE_MINORNO 124 IPMSG_FILE_CTIME 125 IPMSG_FILE_MTIME 126 IPMSG_FILE_ATIME 127 IPMSG_FILE_CREATETIME 128 129 IPMSG_FILE_CREATOR 130 IPMSG_FILE_FILETYPE 131 IPMSG_FILE_FINDERINFO 132 133 IPMSG_FILE_ACL 134 IPMSG_FILE_ALIASFNAME 135 136 137 2.コマンドフォーマット(すべて文字列として表現) 138 139 1) コマンド(フォーマットバージョン1) 140 141 Ver(1) : Packet番號 : 自User名 : 自Host名 : Command番號 : 追加部 142 143 2) 現在のコマンドフォーマットによるメッセージの送信文字列例 144 145 "1:100:shirouzu:jupiter:32:Hello" 146 147 148 3.コマンド処理概要 149 150 1) メンバ認識 151 152 起動時に、IPMSG_BR_ENTRY コマンドをブロードキャストし、すでに 153 立ち上がっているメンバに、新規參加を知らせます。 154 155 このブロードキャストにより、すでに立ち上がっているメンバは、 156 自分の送信先リストに新規參加メンバの情報を追加します。さらに、 157 IPMSG_ANSENTRY コマンドをその新規參加メンバに対し、返信します。 158 (備考: Win版では、メンバ數やIPアドレス距離等に基づいて、0-4秒 159 程度のランダムな待ちを入れています) 160 161 新規參加メンバは、この IPMSG_ANSENTRY を受信することにより、 162 すでに立ち上がっている全メンバの情報を得ることができます。 163 したがい、IPパケットが失われない限りは、全てのメンバが同一の 164 送信先リストを保持できるというわけです。 165 166 不在モードやニックネームの変更などを、メンバ全員に通知するには、 167 IPMSG_BR_ABSENCE をブロードキャストします。(IPMSG_BR_ENTRY と 168 違い、受け取ったメンバは IPMSG_ANSENTRY を返しません) 169 170 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE コマンドでは、 171 不在モードにあわせて IPMSG_ABSENCEOPT を立てて、コマンドの追加 172 部にはニックネームを入れます。また、ダイアルアップユーザなど、 173 ネットワーク指定のブロードキャストが屆かないメンバは、さらに、 174 IPMSG_DIALUPOPT を立てます。このオプションが立っているメンバに 175 は、メンバ認識系のコマンドを個別に送出します。 176 177 (グループ化拡張)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE 178 において、従來のコマンドフォーマット文字列に続いて('\0'を挾んで) 179 グループ名を入れることによって、自分の所屬(設定)するグループ名 180 を伝えることができます。 181 182 2) メッセージ送受信 183 184 メッセージ送信には IPMSG_SENDMSG を使用し、拡張部にメッセージ 185 本體を入れます。受信側は、IPMSG_SENDCHECKOPT が立っている場合 186 に限り、IPMSG_RECVMSG を返します。拡張部には元のパケット番號を 187 入れます。 188 189 ブロードキャストによるメッセージ送信は、IPMSG_BOADCASTOPT を 190 立てた IPMSG_SENDMSG を使用します。(不在通知文など)自動送出 191 されるパケットには、ピンポン防止のため IPMSG_AUTORETOPT をつけ 192 ます。どちらかのオプションが立っているパケットには、確認および 193 自動送出パケットを返しません。 194 195 封書で送出するには、IPMSG_SECRETOPT を立てたパケットを送出しま 196 す。この場合、受信側は開封時に IPMSG_READMSG を送出します。 197 拡張部には元のパケット番號を入れます。 198 199 (追加された、IPMSG_NOADDLISTOPT について) 200 自分の送信先リストに載っていないホストからの IPMSG_SENDMSG 201 パケット到著時には、 202 ? 送信先に IPMSG_BR_ENTRY を送信して、ホスト存在確認を行う 203 ? 直接自分の送信先リストに加える 204 のいずれかの処理を行うことにより、エントリー系パケット取りこぼ 205 しをフォローする実裝が考えられます。しかし、エントリーを行わな 206 い単発メッセージ送信の場合は、これは望ましくない動作ですので、 207 この場合は受信ホストにそのようなフォロー動作をしないことを推奨 208 するため、IPMSG_SENDMSG に IPMSG_NOADDLISTOPT フラグを立てます。 209 210 (8版で追加された、IPMSG_READCHECKOPT について) 211 IPMSG_READMSG に、IPMSG_READCHECKOPT がついていた場合、丁度、 212 IPMSG_SENDMSG における IPMSG_SENDCHECKOPT のように処理します。 213 ただし、返信には、IPMSG_RECVMSG ではなく、IPMSG_ANSREADMSG 214 を使用します。 215 216 なお、メッセージの畫像埋め込みは 4)ファイル添付拡張にて説明。 217 218 3) メッセージ送受信-暗號化拡張(9版で追加) 219 220 公開鍵(RSA)と共通鍵(AES/Blowfish/RC2)を組み合わせて実現します。 221 暗號関連の拡張部は原則として、hex フォーマットで表します。 222 ただし、暗號対応能力(後述)に IPMSG_ENCODE_BASE64 が含まれ 223 ている暗號メッセージ送信では、共通鍵部分以降の記述について 224 hex の代わりに、base64 で記述します。(10版で追加) 225 226 (公開鍵取得)まず受信側に IPMSG_GETPUBKEY を送信します。相手 227 から IPMSG_ANSPUBKEY を受け取ることにより、相手側 RSA 公開鍵 228 を得ます。IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY ともに、拡張部の最初 229 に自ホストの暗號対応能力(IPMSG_RSA_2048 等)をフラグの OR で 230 表した値を入れます。 231 (フラグ詳細は「1. 3) 暗號拡張部用フラグ」をご覧ください) 232 233 さらに、IPMSG_ANSPUBKEY では':'を挾んで、公開鍵を EE-NNNNNN 234 (E=指數、N=法)という形を入れます。E と N の間には '-' を 235 入れて、區切りにします。 236 なお、2度目以降の送信時には、公開鍵および暗號対応能力を記憶 237 することにより、このシーケンスを省略することができます。 238 239 (メッセージ暗號化)送信側は、両者でサポートしている共通鍵 240 種類を選んでセッション用共通鍵を作り、その共通鍵を用いて本文 241 を暗號化します。さらにその共通鍵を相手側公開鍵で暗號化します。 242 なお、実裝により組み合わせに制限があります(4. その他を參照) 243 244 (暗號メッセージ送信)IPMSG_SENDMSG に IPMSG_ENCRYPTOPT を 245 を立てて、拡張部の最初に、暗號化に使用した公開鍵/共通鍵種類 246 の組み合わせを OR で表現した値を入れます。続いて、':' を入れ 247 た後、(これ以降 IPMSG_ENCODE_BASE64 を立てた場合は hex の 248 代わりに base64 で記述します)、公開鍵で暗號化した共通鍵、 249 ':' を挾んで、共通鍵で暗號化した本文を入れます。 250 なお、平文には末尾の'\0'を含めます。 251 252 (電子署名オプション)両者が SHA-1による電子署名をサポート 253 している場合、IPMSG_SIGN_SHA1 立てた上で、平文への SHA-1ダイ 254 ジェスト値を自分自身の秘密鍵で暗號化した署名を、上記の暗號化 255 本文に続けて ':'をはさんで追加します。 256 257 なお、エンコード?パディング方式については、RSA 公開鍵による 258 暗號/署名では PKCS#1-v1_5、AES/Blowfish/RC2 共通鍵による暗號 259 化は PKCS#5 CBC を使用します。 260 IPMSG_PACKETNO_IV が立っている場合、IV は Packet番號文字列を 261 利用します。(IV サイズより短いため、殘りは 0 で補完します) 262 IPMSG_PACKETNO_IV が立っていない場合、IV は 0 となります。 263 264 また、Entry 系パケットには IPMSG_ENCRYPTOPT を立て、暗號機能 265 をサポート可能であることを表明します。 266 267 (公開鍵指紋付ユーザ名)(10版で追加) 268 2048bitRSA かつ SHA-1 署名が利用可能なユーザは、ユーザIDの 269 末尾に、公開鍵を利用した指紋(後述)を付與することで、 270 1) ユーザ名の一意性を保ちやすくする 271 2) 公開鍵詐稱によるなりすましを防ぐ(IPMSG_ANSPUBKEY受信時 272 に鍵と指紋の一致を確認) 273 ことができます。 274 275 公開鍵指紋付きユーザ名は以下のようにして作成します。 276 1) 公開鍵の法に対する SHA-1 ダイジェスト値(160bit)を生成 277 2) 末尾に 32bit の 0 を付與して、192bit の値とする 278 3) 192bit を 64bit*3つのフィールドに分割し、3つを XORする 279 4) 64bit値を16文字固定のhex文字列化する 280 5) ユーザ名の末尾に、ユーザ名-<指紋文字列> の形式で指紋を付加 281 282 なお、この公開鍵指紋付ユーザ名を使っているにもかかわらず、 283 Entry系に IPMSG_ENCRYPTOPT フラグが立っていない、もしくは 284 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY での暗號対応能力 に、 285 IPMSG_RSA_2048/IPMSG_SIGN_SHA1 が含まれていない場合は、 286 不正パケットとして破棄することを推奨します。 287 288 4) ファイル添付拡張(9版で追加) 289 290 ファイル添付(ダウンロード許可)通知するには、IPMSG_SENDMSG 291 に IPMSG_FILEATTACHOPT を立てたメッセージを送信します。 292 その際、通常(or 暗號)メッセージに続けて、'\0'をはさんで、 293 添付(ダウンロード許可)ファイル情報を列挙します。 294 295 fileID:filename:size:mtime:fileattr[:extend-attr=val1 296 [,val2...][:extend-attr2=...]]:\a[:]fileID... 297 (なお、size, mtime, fileattr は hex で表現します。 298 filenameに':'がある場合、"::"でエスケープします) 299 300 受信側が添付ファイルをダウンロードしたい場合、送信元UDPポート 301 と同じ番號のTCPポートに対して、IPMSG_GETFILEDATA コマンドを使 302 い、拡張部に packetID:fileID:offset を入れて、データ送信要求 303 パケットを出します。(すべてhex) 304 添付側がそのリクエストを受信して、送信要求を正しいと認めると、 305 その通信路に該當ファイルのデータを流します(フォーマットなし) 306 307 受信側が階層添付ファイルをダウンロードしたい場合は、コマンド 308 に IPMSG_GETDIRFILES を使い、拡張部に packetID:fileID を入れて 309 データ送信要求パケットを出します。(すべてhex) 310 311 データ送信側は、以下のフォーマットで階層データを流します。 312 header-size:filename:file-size:fileattr[:extend-attr=val1 313 [,val2...][:extend-attr2=...]]:contents-data 314 次のheadersize:次のfilename... 315 (filename と contetns-data 以外はすべて hex) 316 317 header-size は header-size の先頭から contents-data の直前の 318 ':'までのサイズをあらわします。extend-attr は省略可かつ複數 319 存在可能な拡張屬性で、'='で対応するデータ値を入れます。 320 321 fileattr が IPMSG_FILE_DIR の場合、自動的にそのディレクトリに 322 潛った狀態とみなして、後続のファイル情報が続きます。 323 324 fileattr が IPMSG_FILE_RETPARENT の場合、親ディレクトリに戻 325 ることを表し、ファイル名は常に"."です。このときの屬性値は、 326 親ディレクトリに戻る前の、現在ディレクトリの情報を表します。 327 328 送信は添付ディレクトリ自體から開始し、最後に添付ディレクトリ 329 に戻る IPMSG_FILE_RETPARENT 情報を送信して終了を伝えます。 330 331 なお、Entry 系パケットに IPMSG_FILEATTACHOPT を立て、ファイル 332 添付をサポート可能であることを表明します。 333 334 (添付ファイル名暗號化)上記フォーマット內容を、メッセージ平文 335 末尾から '\0' に続けて記述した後、メッセージ全體の暗號化を行う 336 ことができます。その場合、Entry系パケットおよび IPMSG_SENDMSG 337 に IPMSG_ENCEXTMSGOPT を立てます。 338 339 (メッセージ畫像埋め込み添付)メッセージに貼り付けられた畫像 340 は、通常のファイル添付として送られます。ただし、fileattr に 341 IPMSG_FILE_CLIPBOARD を指定します。ファイル名フィールドには、 342 添付したい畫像種類の拡張子を含むダミーファイル名を指定します。 343 通常は PNG を使います。 344 メッセージへの畫像埋め込み位置は、上記の extend-attr=val の形 345 で IPMSG_FILE_CLIPBOARDPOS=挿入用推奨オフセット位置(文字単位) 346 を指定します(すべてhex表現)。ただし、複數の畫像を挿入する場合、 347 自畫像よりも前に存在する畫像も1文字としてカウントします。 348 349 なお、メッセージ畫像埋め込みをサポートしているホストは、Entry系 350 パケットに IPMSG_CLIPBOARDOPT を立てます。 351 352 5) 多言語(UTF-8)拡張 353 354 ファイル送受信を含むメッセージの送受信で UTF-8 での多言語通信を 355 行えるホストは、IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE 356 コマンドで IPMSG_CAPUTF8OPT を立てたパケットを流すことで、UTF-8 357 での送受信が可能であることを表明します。お互いが IPMSG_CAPUTF8OPT 358 をサポートしている場合、IPMSG_UTF8OPT を立てた上で、メッセージ 359 (ファイル添付メッセージ部分を含む)を UTF-8 で表現したパケット 360 を送信することができます。 361 362 添付ファイルを受信する場合、元の添付メッセージに IPMSG_UTF8OPT 363 が立っていれば、同じく IPMSG_UTF8OPT を立てた IPMSG_GETFILEDATA 364 コマンドで添付ファイル転送要求を送ることで、ファイル名/ディレク 365 トリ名をUTF-8 で表現したデータを受信することができます。 366 367 BR系パケット(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE) に 368 ついては、IPMSG_UTF8OPT による UTF-8表現は使えません(既存の 369 非UTF-8クライアントに問題が発生するためです)。そのため、 370 BR系パケットでは、グループ名拡張の末尾に続いて、\0\n の 2バイト 371 を付加(グループ名拡張を入れない場合、ダミーのグループ名として 372 \0 を挿入した後、\0\n を続けます。つまり、\0\0\n となります) 373 した後、UTF-8 で以下のエントリを追加します。 374 UN:ユーザ名\n 375 HN:ホスト名\n 376 NN:ニックネーム\n 377 GN:グループ名\n 378 なお、ASCIIのみで表現可能なエントリや存在しないエントリは 379 省略して構いません。上記拡張と従來のフィールドが異なる場合、 380 拡張エントリを正しいものと解釈します。 381 382 6) その他のコマンド 383 384 他のメンバのバージョンを取得するには、IPMSG_GETINFO コマンド 385 を送ります。受信側は拡張部にバージョン情報の文字列を設定した 386 IPMSG_SENDINFO を送り返します。 387 388 不在モードメンバの不在通知文を取得するには、IPMSG_GETABSENCEINFO 389 コマンドを送ります。受信側は、不在モード中なら不在通知文を設定 390 した、IPMSG_SENDABSENCEINFO を送り返します。不在モード中でない 391 場合、適當な文字列("Not absence mode"など)を送り返します。 392 393 7) 確認?リトライ 394 395 一定時間以內に確認パケット(IPMSG_SENDMSG に対する、 396 IPMSG_RECVMSG など)が受け取れなかった場合、同一のパケットを 397 再送出します。リトライの回數?間隔については、実裝依存です。 398 399 400 4. その他 401 402 1) 改行について 403 404 送出メッセージ內の改行文字は、UNIX形式に統一します('0x0a')。 405 必要に応じて、変換を行ってください。 406 407 2) デリミタ 408 409 デリミタに':'を使っている関係上、ユーザ名、ホスト名領域には、 410 ':'を含む名前は、使えません。萬一、自ホスト名が':'を含んでいる 411 場合、他の文字(たとえば';')などに置き換えて使用してください。 412 413 3) 文字コード 414 415 IPMSG_UTF8OPT を付與した場合、文字コードは UTF-8、そうでない 416 場合は、CP932 の使用を想定しています。 417 418 4) 暗號化の組み合わせ 419 420 プロトコルではありませんが、リファレンス実裝の説明ということで、 421 Windows版では、以下の3つの組み合わせのみサポートしています。 422 423 1. IPMSG_RSA_2048 / IPMSG_AES_256 ... (*1) 424 2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2) 425 3. IPMSG_RSA_512 / IPMSG_RC2_40 426 427 (*1) オプションで IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1 をサポート 428 (*2) オプションで IPMSG_PACKETNO_IV をサポート 429 430 431 5. 連絡先 432 433 http://ipmsg.org に記載しています。 434 435 436 附記 437 コマンドコードは、ipmsg.hを參照してください。 438 何かご意見?提案がありましたら、お寄せください。 英文第九版 1 Original ipmsg protocol specification is written in Japanese. 2 This document was translated by Mr.Kanazawa. 3 This document is not verified yet. (too old...) 4 5 ---------------------------------------------------------------------- 6 IP Messenger communication protocol (Draft-9) 1996/02/21 7 Modified 2003/01/14 8 9 H.Shirouzu 10 ---------------------------------------------------------------------- 11 12 About IP Messenger 13 This is a Send/Receive message service using the TCP/UDP Port. 14 15 Characteristics 16 IP Messenger can be installed in any OS if TCP/IP is used on your machine. 17 Dynamic member recognition can be done within your network or specified network. 18 You can exchange messages between all IPMsg members. 19 20 Function description 21 Use TCP/UDP port(default:2425). See the following descriptions 22 (Message Send/Receive: UDP, File Send/Receive: TCP) 23 24 1. Command 25 26 1) Command functions (Low 8 bits from command number 32 bits) 27 28 IPMSG_NOOPERATION No Operation 29 IPMSG_BR_ENTRY Entry to service (Start-up with a Broadcast command) 30 IPMSG_BR_EXIT Exit from service (End with a Broadcast command) 31 IPMSG_ANSENTRY Notify a new entry 32 IPMSG_BR_ABSENCE Change absence mode 33 34 IPMSG_BR_ISGETLIST Search valid sending host members 35 IPMSG_OKGETLIST Host list sending notice 36 IPMSG_GETLIST Host list sending request 37 IPMSG_ANSLIST Host list sending 38 39 IPMSG_SENDMSG Message transmission 40 IPMSG_RECVMSG Message receiving check 41 42 IPMSG_READMSG Message open notice 43 IPMSG_DELMSG Message discarded notice 44 IPMSG_ANSREADMSG Message open confirmation notice(added from version-8) 45 46 IPMSG_GETFILEDATA File Transfer request by TCP 47 IPMSG_RELEASEFILES Discard attachment file 48 IPMSG_GETDIRFILES Attachment hierarchical file request 49 50 IPMSG_GETINFO Get IPMSG version info. 51 IPMSG_SENDINFO Send IPMSG version info. 52 53 IPMSG_GETABSENCEINFO Get absence sentence 54 IPMSG_SENDABSENCEINFO Send absence sentence 55 56 IPMSG_GETPUBKEY RSA Public Key Acquisition 57 IPMSG_ANSPUBKEY RSA Public Key Response 58 59 2) Option flag (High 24 bits from command number 32 bits) 60 61 IPMSG_ABSENCEOPT Absence mode(Member recognition command) 62 IPMSG_SERVEROPT Server(Reserved) 63 IPMSG_DIALUPOPT Send individual member recognition command 64 65 IPMSG_SENDCHECKOPT Transmission check 66 IPMSG_SECRETOPT Sealed message 67 IPMSG_READCHECKOPT Sealed message check(added from ver8) 68 IPMSG_PASSWORDOPT Lock 69 IPMSG_BROADCASTOPT Broadcast message 70 IPMSG_MULTICASTOPT Multi-cast(Multiple casts selection) 71 IPMSG_NEWMUTIOPT New version multi-cast(reserved) 72 IPMSG_AUTORETOPT Automatic response(Ping-pong protection) 73 IPMSG_NOLOGOPT No log files 74 IPMSG_NOADDLISTOPT Notice to the members outside of BR_ENTRY 75 76 IPMSG_FILEATTACHOPT File attachment 77 IPMSG_ENCRYPTOPT Code 78 79 IPMSG_NOPOPUPOPT (No longer valid) 80 IPMSG_RETRYOPT Re-send flag(Use when acquiring HOSTLIST) 81 82 3) Extended code flag (hex format combination) 83 84 IPMSG_RSA_512 85 IPMSG_RSA_1024 86 IPMSG_RSA_2048 87 IPMSG_RC2_40 88 IPMSG_RC2_128 89 IPMSG_RC2_256 90 IPMSG_BLOWFISH_128 91 IPMSG_BLOWFISH_256 92 IPMSG_SIGN_MD5 93 94 4) Extended files for attachment (fileattr low 8 bits) 95 96 IPMSG_FILE_REGULAR 97 IPMSG_FILE_DIR 98 IPMSG_FILE_RETPARENT 99 IPMSG_FILE_SYMLINK 100 IPMSG_FILE_CDEV 101 IPMSG_FILE_BDEV 102 IPMSG_FILE_FIFO 103 IPMSG_FILE_RESFORK 104 105 5) Attachment file extended attribute(fileattr high 24 bits) 106 107 IPMSG_FILE_RONLYOPT 108 IPMSG_FILE_HIDDENOPT 109 IPMSG_FILE_EXHIDDENOPT 110 IPMSG_FILE_ARCHIVEOPT 111 IPMSG_FILE_SYSTEMOPT 112 113 6) Extended file attribute for attachment file 114 115 IPMSG_FILE_UID 116 IPMSG_FILE_USERNAME 117 IPMSG_FILE_GID 118 IPMSG_FILE_GROUPNAME 119 IPMSG_FILE_PERM 120 IPMSG_FILE_MAJORNO 121 IPMSG_FILE_MINORNO 122 IPMSG_FILE_CTIME 123 IPMSG_FILE_MTIME 124 IPMSG_FILE_ATIME 125 IPMSG_FILE_CREATETIME 126 127 IPMSG_FILE_CREATOR 128 IPMSG_FILE_FILETYPE 129 IPMSG_FILE_FINDERINFO 130 131 IPMSG_FILE_ACL 132 IPMSG_FILE_ALIASFNAME 133 IPMSG_FILE_UNICODEFNAME 134 135 136 2.Command format(Use all character strings) 137 138 1) Command(Format version-1) 139 140 Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection 141 142 2) An example for Message Send/Receive by using the current command format 143 144 "1:100:shirouzu:jupiter:32:Hello" 145 146 147 3.Command process overview 148 149 1) Member recognition 150 151 An IPMSG_BR_ENTRY command notifies a new entry to the current 152 members at start-up. 153 154 All members add the new member to their list after getting a notification message. 155 An IPMSG_ANSENTRY command sends a message back to the new member. 156 157 The new member gets the current member data by a 158 IPMSG_ANSENTRY command. All members can communicate as long as an 159 IP packet exists. 160 161 An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or 162 nickname change to all members. However, an IPMSG_ANSENTRY command 163 does not send a message back, which is different from an IPMSG_BR_ENTRY 164 command. 165 166 IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands 167 use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to 168 additional command. 169 Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by 170 a broadcast command. A member recognition command needs to be 171 sent individually to the members with this optional flag. 172 173 (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands 174 sends a group name by adding the new group name after the current 175 command format character strings (Input '\0' between the current 176 command and extended name). 177 178 2) Send/Receive Message 179 Send Message uses an IPMSG_SENDMSG command that can input a message 180 in the extended area. 181 Receive Message sends back an IPMSG_RECVMSG command only 182 if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number 183 to the extended area. 184 185 Broadcast Message Send uses an IPMSG_BOADCASTOPT command 186 and an IPMSG_SENDMSG flag should be ON. 187 Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT 188 for ping-pong protection. If either one or another packet is ON, then 189 confirmation/auto-send packet is not sent back. 190 191 Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON. 192 In this case, Receive Message sends an IPMSG_READMSG command. 193 Input the original packet number to the extended area. 194 195 (Additional IPMSG_NOADDLISTOPT) 196 When receiving an IPMSG_SENDMSG packet from a host that is 197 not on your Send/Receive list, IPMsg will either confirm a host by 198 sending an IPMSG_BR_ENTRY command or add a host name to 199 the Send/Receive list. 200 However, single-shot Message Send/Receive action needs to be avoided. 201 Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command. 202 203 (Additional IPMSG_READCHECKOPT from version-8) 204 When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag, 205 IPMsg process is the same as IPMSG_SENDMSG with an 206 IPMSG_SENDCHECKOPT flag. 207 However, Send Message uses an IPMSG_ANSREADMSG command, 208 not IPMSG_RECVMSG. 209 210 3) Message Send/Receive encrypted extension (Added in the version-9) 211 212 Use the combination of Public-key(RSA) and common key(RC2/Blowfish). 213 (Encrypted extension area is used in hex format.) 214 215 (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive 216 Message. Receive Message gets an IPMSG_ANSPUBKEY that 217 means receiving RSA public key from Send Message. 218 219 IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is 220 encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first 221 part of extension 222 223 In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN 224 E=Exponent, N=method)devide by ':'. and Input the Fdelimiter '-' 225 between E and N. 226 227 This sequence can be skipped after the 2nd Send/Receive process by 228 memorizing public key and encrypted data. 229 230 (Encrypted message)After a sender creates a common key that is 231 supported both sender and receiver, a common key can encrypt a message. 232 In addition, a receiver's public key encrypts the common key. 233 234 235 (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in 236 IPMSG_SENDMSG. At the first part of extension, input the value which 237 is 'or' resoult from Convination of public key and common key type . 238 Then use common key which encrypt with public key devide by ':'. 239 Then input message which is eccrypted by public key devide by ':'. 240 If both supports IPMSG_SIGN_XXX, then add ':' and signeture. 241 242 Also, In the method of encode padding, PKCS#1ECB key is used for RSA, 243 PKCS#5 CBC common key is used for RC2/blowfish. 244 245 Also, The Packet related to Entry manifestation the capability of 246 ecryption support using IPMSG_ENCRYPTOPT 247 248 4) Extension with file attachment(Available from version-9) 249 250 An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for 251 File transfer (download permission)notification sends a message 252 with attachment. 253 Input '\0' after the message and attachment file data. 254 255 256 fileID:filename:size:mtime:fileattr[:extend-attr=val1 257 [,val2...][:extend-attr2=...]]:\a:fileID... 258 (size, mtime, and fileattr describe hex format. 259 If a filename contains ':', please replace with "::".) 260 261 When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA 262 command requests a data transmission packet to the TCP port that is the same number 263 as the UDP sending port number. Input packetID:fileID:offset to the extended area. 264 (Use all hex format.) 265 File Transfer side receives the request. After recognizing that it's a correct request, 266 then send the specified data (no format) 267 268 When the data receiving side downloads a hierarchical attachment file, 269 use an IPMSG_GETDIRFILES command and input a packetID:fileID 270 to the extended area and send a data transmission request packet. 271 (all hex format) 272 273 Data sending side sends the following hierarchical data format. 274 header-size:filename:file-size:fileattr[:extend-attr=val1 275 [,val2...][:extend-attr2=...]]:contents-data 276 Next headersize: Next filename... 277 (All hex format except for filename and contetns-data) 278 279 header-size is from the beginning of header-size to the delimiter ':' 280 that is before contents-data. extend-attr can be omitted and used multiple 281 extended attributes. Use '=' for data input. 282 283 When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically 284 in the directory, the next file data is after the directory. 285 286 When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns 287 to the parent directory. In this case, File name is always "." and the attribute 288 value is the current directory data. 289 290 Sending process starts from the attachment directly and returns the 291 IPMSG_FILE_RETPARENT command to the attachment directory. 292 293 Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the 294 attachment file. 295 296 5) Other commands 297 298 When acquiring different versions, send an IPMSG_GETINFO command. 299 Receiving side sends the version information character string to 300 extended area. 301 302 Send an IPMSG_GETABSENCEINFO command for acquiring an absence message. 303 Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode. 304 If the status is not absence mode, a character string "Not absence mode" will be sent back. 305 306 6) Confirmation/Retry 307 308 If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered 309 within a specified time, then it will be sent again. 310 A number of retry actions or interval period is depended on the current condition. 311 312 313 4. Other 314 315 1) Linefeed 316 317 Linefeed characters in Send Message is standardized with UNIX type ('0x0a'). 318 Please change if needed. 319 320 2) Delimiter ':' 321 322 ':' is used as a delimiter. You can't use this delimiter for user name 323 and host name. 324 If the use/host names contain a ':', please replace with another sign, 325 for an example ';'. 326 Although using this delimiter isn't problem as yet, I may create an 327 escape sequence. 328 329 330 3) Kanji codes 331 332 CP932 333 334 335 5. Contact 336 http://ipmsg.org/ (Japanese site) 337 http://ipmsg.org/index.html.en (English site) 338 339 340 Note 341 See ipmsg.h for command codes. 342 Please e-mail me your comments and suggestions.轉載于:https://www.cnblogs.com/Franck/archive/2012/11/01/2749613.html
總結
以上是生活随笔為你收集整理的IPmsg(飞鸽传书)协议翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux安装压缩文件的工具,cento
- 下一篇: 【K8S运维知识汇总】第4天7: das