RTP控制協(xié)議-RTCP
RTCP-SR rfc3550
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of sender |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
sender | NTP timestamp, most significant word |
info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, least significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's packet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's octet count |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_1 (SSRC of first source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1 | fraction lost | cumulative number of packets lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extended highest sequence number received |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| interarrival jitter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| last SR (LSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| delay since last SR (DLSR) |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_2 (SSRC of second source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2 : ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| profile-specific extensions |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
uint32_t ssrc;
uint32_t ntpSec;
uint32_t ntpFrac;
uint32_t rtpTs;
uint32_t packetCount;
uint32_t octetCount;
/* 變長,根據(jù)count決定 */
struct reportHeader report;
};
/* Struct for RTCP report block*/
struct reportHeader
{
uint32_t ssrc;
uint8_t fractionLost; // 丟包率
uint32_t totalLost : 24; // 一共丟包的個數(shù)
uint32_t lastSeq; // sequenceNumber
uint32_t jitter; // RTP包到達(dá)時間間隔的統(tǒng)計方差
uint32_t lsr; // 上一次收到SR的時間戳
uint32_t dlsr; // 上次從收到SR包到發(fā)送本報告的時間差
};
- version: 2
- padding: 置為1表示RTP頭有填充背伴。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié)肯夏,包含這個字節(jié)本身
- count: 是reportHeader的個數(shù)
- packetType: 200,SR(Sender Report)桥状,發(fā)送者報告:包含發(fā)送者的發(fā)送、接收統(tǒng)計
- length: 指協(xié)議頭和數(shù)據(jù)的長度硝清,單位為字節(jié)辅斟。數(shù)據(jù)長度length-4
- ssrc: 與sdp中的ssrc一致
- ntpSec: most significant word,高位時間戳芦拿,ntpFrac每到最大值就清零士飒,ntpSec加1,
- ntpFrac: least significant word蔗崎,低位時間戳酵幕,單位是微秒。網(wǎng)絡(luò)時間戳缓苛,用于同步不同源
- rtpTs: 相對時間戳芳撒,與rtp一致
- packetCount: 一共發(fā)送了多少個包
- octetCount: 一共發(fā)送了多少字節(jié)
- report.ssrc: 信息所屬的ssrc
- report.fractionLost: 丟包率
- report.totalLost: 一共丟包的個數(shù)。遲到包不算丟包未桥,重傳有可能導(dǎo)致負(fù)數(shù)
- report.lastSeq: rtp頭的sequenceNumber是16bit笔刹,會循環(huán)從0開始。此處低位16bit與rtp一致冬耿,高位表示循環(huán)次數(shù)
- report.jitter: RTP包到達(dá)時間間隔的統(tǒng)計方差
- report.lsr: 上一次收到SR的時間戳舌菜,lsr = (ntpSec<<16) + (ntpFrac>>16)
- report.dlsr: 上次從收到SR包到發(fā)送本報告的時間差
RTCP-RR rfc3550
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| RC | PT=RR=201 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_1 (SSRC of first source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1 | fraction lost | cumulative number of packets lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extended highest sequence number received |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| interarrival jitter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| last SR (LSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| delay since last SR (DLSR) |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_2 (SSRC of second source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2 : ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| profile-specific extensions |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
uint32_t ssrc;
/* 變長,根據(jù)rtcp.count決定 */
struct reportHeader report;
};
/* Struct for RTCP report block*/
struct reportHeader
{
uint32_t ssrc;
uint8_t fractionLost;
uint32_t totalLost : 24;
uint32_t lastSeq;
uint32_t jitter;
uint32_t lsr;
uint32_t dlsr;
};
- packetType: 201淆党,RR(Receiver Report)酷师,接收者報告:接受者的接收統(tǒng)計
- 其他字段意思參考RTCP-SR
RTCP-SDES rfc3550
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| SC | PT=SDES=202 | length |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_1 |
1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_2 |
2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
/* 變長讶凉,根據(jù)rtcp.count決定 */
uint32_t ssrc;
struct SdesItem sdes;
};
struct SdesItem
{
uint8_t type;
uint8_t length;
char value[N]; // N=length
};
enum SdesType
{
END = 0,
CNAME, // cname與SSRC對應(yīng),cname為源的唯一表示山孔,詳情參考sdp描述
NAME, // 用戶名
EMAIL, // email地址
PHONE, // 電話號碼
LOC, // 位置
TOOL, // 工具
NOTE, // 備注
PRIV // 私有擴(kuò)展
};
- version: 2
- padding: 置為1表示RTP頭有填充懂讯。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié),包含這個字節(jié)本身
- count: 是ssrc和sdes的個數(shù)
- packetType: 202台颠,SDES(SourceDescription)褐望,數(shù)據(jù)源的信息
- length: 指協(xié)議頭和數(shù)據(jù)的長度,單位為字節(jié)串前。數(shù)據(jù)長度length-4
- ssrc: 與sdp中的ssrc一致
- sdes.type: 取值SdesType
- sdes.length: value長度
- sdes.value:
RTCP-BYE rfc3550
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| SC | PT=BYE=203 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
(opt) | length | reason for leaving ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
/* 變長瘫里,根據(jù)count決定有多少個ssrc */
uint32_t ssrc;
/* 可選 */
uint8_t length;
uint8_t reason[N]; // N=length
};
- version: 2
- padding: 置為1表示RTP頭有填充。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié)荡碾,包含這個字節(jié)本身
- count: 是ssrc的個數(shù)
- packetType: 203谨读,BYE(goodbye),結(jié)束RTP傳輸
- length: 指協(xié)議頭和數(shù)據(jù)的長度坛吁,單位為字節(jié)劳殖。數(shù)據(jù)長度length-4
- ssrc: 與sdp中的ssrc一致
- length: reason的長度
- reason: 退出原因,可選
RTCP-APP rfc3550
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| subtype | PT=APP=204 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| name (ASCII) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| application-dependent data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
uint32_t ssrc;
/* 變長拨脉,根據(jù)count決定 */
uint32_t name;
struct AppData data;
};
/* 消息格式可以自定義哆姻,我這里只是自己列舉的一個數(shù)據(jù)格式類型 */
struct AppData
{
uint8_t type;
uint8_t length;
char value[N]; // N=length
};
- version: 2
- padding: 置為1表示RTP頭有填充。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié)玫膀,包含這個字節(jié)本身
- count: 是name和data的個數(shù)
- packetType: 204矛缨,APP(application),應(yīng)用層定義的傳輸控制類型
- length: 指協(xié)議頭和數(shù)據(jù)的長度帖旨,單位為字節(jié)箕昭。數(shù)據(jù)長度length-4
- ssrc: 與sdp中的ssrc一致
- name: 自定義消息名
- data: 自定義數(shù)據(jù)
RTCP-RTPFB rfc4585
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| FMT | PT | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of media source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Feedback Control Information (FCI) :
: :
*/
struct RtcpHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
uint32_t senderSsrc;
uint32_t mediaSsrc;
/* FCI字段*/
};
enum FeedbackRtp
{
NACK = 1, // Generic nack。請求丟包重傳
TMMBR = 3, // Temp, max media stream Bitrate Request解阅。最大媒體流請求
TMMBN = 4, // Temp, max media stream Bitrate Notification盟广。最大媒體流響應(yīng)
SR_REQ = 5,
RAMS = 6,
TLLEI = 7,
ECN = 8,
PS = 9,
TCC = 15, // transport-cc
EXT = 31
};
- version: 2
- padding: 置為1表示RTP頭有填充。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié)瓮钥,包含這個字節(jié)本身
- count: 取值為FeedbackRtp
- packetType: 205,RTPFB(Generic RTP Feedback)烹吵,RTP反饋包碉熄,傳輸?shù)目刂?/li>
- length: 指協(xié)議頭和數(shù)據(jù)的長度,單位為字節(jié)肋拔。數(shù)據(jù)長度length-4
- senderSsrc: 數(shù)據(jù)包發(fā)送方的ssrc
- mediaSsrc: 媒體源的ssrc
FCI字段锈津,NACK消息的格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PID | BLP |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
PID: 丟包的RTP sequenceNumber
BLP: 繼第一個序號之后的16個包的丟失情況,當(dāng)丟失之后置為1
RTCP-PSFB rfc4585
圖像和流媒體 -- I 幀,B幀,P幀,IDR幀的區(qū)別
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| FMT | PT | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of media source |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Feedback Control Information (FCI) :
: :
*/
struct SDESHeader
{
uint8_t version : 2;
uint8_t padding : 1;
uint8_t count : 5;
uint8_t packetType;
uint16_t length;
uint32_t senderSsrc;
uint32_t mediaSsrc;
/* FCI字段*/
};
enum FeedbackPs
{
PLI = 1, // Picture Loss Indication凉蜂,請求i幀琼梆,F(xiàn)CI字段中必須僅包含一個PLI
SLI = 2, // Slice Loss Indication性誉,請求一個slice包
RPSI = 3, // Reference Picture Selection Indication。請求b幀
FIR = 4, // Full Intra Request Command茎杂。請求一個idr幀
TSTR = 5, // Temporal-Spatial Trade-off Request错览。空間換時間或時間換空間的請求
TSTN = 6, // Temporal-Spatial Trade-off Notification煌往∏悴福空間換時間或時間換空間的響應(yīng)
VBCM = 7,
PSLEI = 8,
ROI = 9,
AFB = 15,
EXT = 31
};
- version: 2
- padding: 置為1表示RTP頭有填充。數(shù)據(jù)的最后一個字節(jié)表示填充了幾個字節(jié)刽脖,包含這個字節(jié)本身
- count: 取值為FeedbackPs
- packetType: 206羞海,PSFB(Payload-specific Feedback),payload反饋包曲管,編解碼的控制
- length: 指協(xié)議頭和數(shù)據(jù)的長度却邓,單位為字節(jié)。數(shù)據(jù)長度length-4
- senderSsrc: 數(shù)據(jù)包發(fā)送方的ssrc
- mediaSsrc: 媒體源的ssrc
FCI字段院水,SLI消息的格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| First | Number | PictureID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
First: 第一個丟失的宏塊的宏塊地址
Number: 丟失的宏塊數(shù)
PictureID: 編解碼器特定標(biāo)識符的六個最低有效位
FCI字段腊徙,RPSI消息的格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PB |0| Payload Type| Native RPSI bit string |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| defined per codec ... | Padding (0) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
DTLS-SRTP
SRTP與RTP包的主要區(qū)別是payload數(shù)據(jù)加密、SRTP MKI(主密鑰標(biāo)由密鑰管理協(xié)議決定)衙耕、認(rèn)證標(biāo)簽
- payload加密 加密后的數(shù)據(jù)依然保持對齊
- SRTP MKI webrtc基本沒用昧穿,為0
- 認(rèn)證標(biāo)簽 rtp頭和加密payload進(jìn)行哈希計算得來的
DTLS握手
- 第一次客戶端發(fā)送ClientHello
- 第二次服務(wù)端發(fā)送ServerHello,發(fā)送服務(wù)端證書橙喘,服務(wù)端key时鸵,請求客戶端證書,發(fā)送ServerHelloDone
- 第三次客戶端發(fā)送客戶端證書厅瞎,客戶端key饰潜,驗證證書,發(fā)送加密套件和簸,發(fā)送Finished
- 第四次服務(wù)端發(fā)送協(xié)商好的加密套件彭雾,發(fā)送Finished
數(shù)據(jù)傳輸
DTLS進(jìn)行握手交換得到key、加密套件锁保。然后在使用RTP進(jìn)行傳輸薯酝,僅對payload數(shù)據(jù)進(jìn)行加密