從此篇文章開始,將進入通信協(xié)議相關(guān)學習看蚜,大概囊括幾個知識點:
TCP協(xié)議
、UDP協(xié)議
赔桌、Redis協(xié)議
相關(guān)失乾,順帶介紹Wireshark分析工具
、Tcpdump命令
等使用工具纬乍。本篇文章主要介紹Redis協(xié)議相關(guān)知識點碱茁。
RESP(Redis序列化協(xié)議)
概念
Redis底層使用的通信協(xié)議是RESP(Redis Serialization Protocol的縮寫),RESP協(xié)議可以序列化多種類型仿贬,比如Simple Strings(簡單字符串)纽竣,Errors(錯誤類型),Integers(整形)茧泪,Bulk Strings(批量串)和Arrays(數(shù)組)蜓氨,但此協(xié)議只適用于Redis客戶端-服務端
之間的通信,Redis集群中節(jié)點間通信使用的另一種協(xié)議
队伟。
一般情況下RESP是一種簡單的請求-響應式協(xié)議穴吹,就是發(fā)一條請求,Redis服務器返回一條響應嗜侮,此外港令,RESP
還有另外兩種形式的協(xié)議:
- 利用管道發(fā)送的批量命令,Redis服務器會一起響應
- 客戶端使用Pub/Sub功能锈颗,發(fā)布/訂閱頻道顷霹,協(xié)議就是一種推送協(xié)議,Redis服務器主動推送數(shù)據(jù)給客戶端
數(shù)據(jù)類型前綴
在數(shù)據(jù)包中击吱,每種數(shù)據(jù)數(shù)據(jù)類型都有固定的前綴淋淀,每一部分都以\r\n
結(jié)尾
+
代表簡單字符串(Simple Strings)比如OK
,PONG
(對應客戶端的PING
命令)-
代表錯誤類型(Errors):
代表整型(Integers)$
代表多行字符串(Bulk Strings)*
代表數(shù)組(Arrays)
接下來通過實操深入了解下
抓包
抓包使用tcpdump
命令覆醇,具體參數(shù)這里就不多說了朵纷,使用的命令是:
tcpdump host <redis ip> and port <redis 端口> -i <網(wǎng)卡>-w <保存結(jié)果的文件名>
比如:
tcpdump host 127.0.0.1 and port 6379 -i eth0 -w redis.cap
抓取的結(jié)果保存在redis.cap
分析
分析工具使用Wireshark
炭臭,這個工具非常強大,具體的使用后邊再細說袍辞,在分析之前徽缚,先說下客戶端與服務端交互的命令:
-
info
,返回redis服務端的相關(guān)信息 -
set xfh 111
革屠,服務端響應OK
-
get xfh
,返回111
-
lpush xfhlist 1 2 3
排宰,返回3
-
ee
似芝,這是個錯誤命令,主要看下服務端返回的錯誤數(shù)據(jù)格式
接下來我們結(jié)合數(shù)據(jù)包分析下:
1板甘、首先發(fā)送的命令是info
党瓮,先看右邊部分,可以看到一開始是*1:表示長度為1的數(shù)組
盐类,后邊的··
對應左邊是0d 0a
寞奸,其實就是\r\n
的16進制表示形式,然后后邊$4:代表長度為4的Bulk Strings在跳,也就是info
枪萄,后邊緊跟著info
,
info命令返回數(shù)據(jù)包:$2748:長度為2748的Bulk Strings
猫妙,后邊便是服務器相關(guān)信息
2瓷翻、set xfh 111
命令:*3:長度為3的數(shù)組
,后邊是數(shù)組里的3個元素:$3··set(長度為3的Bulk Strings)
割坠、$3··xfh
齐帚、$3··111
返回數(shù)據(jù):
+OK(代表簡單字符串‘OK’)
,這里邊可能有人會問:簡單字符串(Simple Strings)和多行字符串(Bulk Strings)有什么區(qū)別彼哼?对妄?我的個人理解是:簡單字符串一般是服務器狀態(tài)相關(guān),比如'OK'敢朱、‘PONG’等剪菱;而Bulk Strings可以包含任何內(nèi)容(比如換行符、控制符)
3拴签、命令lpush xfhlist 1 2 3
:看到這相信大家都已經(jīng)明白了琅豆,*5代表長度為5的數(shù)組
,后邊緊跟著5個Bulk Strings lpush
篓吁、xfhlist
茫因、1
、2
杖剪、3
冻押,而且每個元素的前邊都有長度驰贷,分別是$5
、$7
洛巢、$1
括袒、$1
、$1
稿茉。
返回::3
(表示整形數(shù)據(jù)3)
4锹锰、命令ee
,這是個錯誤命令漓库,redis中沒有這個命令恃慧,應該返回語法錯誤
返回:發(fā)現(xiàn)前綴是-
,對應RESP協(xié)議中的錯誤類型渺蒿,后邊緊跟著ERR unknown command 'ee'