关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!
生活随笔
收集整理的這篇文章主要介紹了
关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導讀:
關于RDP協議的分析(一)
?
關于RDP協議的分析和研究? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? -------------- leadgenius
? ? 寫這個一是便于學習,再就是與網友們共同討論,有一些我也不確定的,只是我的理解,希望看到這篇文章的人進行指正,并給我來信謝謝。再一就是這里只有有關4.0版本的內容,希望有高手補充5.1/5.2的協議文檔。
RDP是微軟終端服務應用的協議,服務端基于win2000/winNT。協議基于T.128(T.120協議族)提供多通道通信。在客戶端支持多種資源緩沖和圖片數據的壓縮處理。
本文的內容主要是對Rdesktop源代碼的分析,應用rdp4.0協議,可與win2000/winNT通信,也可與win2003(rdp5.1)通信,但不具備rdp5.1協議的特性。
協議通過TCP/IP進行數據傳輸,在實際數據前進行了ISO/MCS/SEC三層的包裝,ISO/MCS兩層為多點并發式通信提供了可靠的傳輸保障,SEC層提供對RDP詳細數據的加解密處理。各層在數據的前端加有一段數據頭,用于對數據、傳輸的控制。具體的數據控制由STREAM類型的結構體管理(這種方法很靈活、易懂,可作為網絡編程者的參考),不同的數據頭由不同的結構成員管理,層次清晰。
RDP協議將終端虛擬環境中的設備映射為不同的數據包,將對設備的輸入輸出(I/O)重定向到網絡句柄中,不同設備的數據按不同格式組織成為小的數據包,并將多個小數據包封裝成為一個大的數據包通過網絡一次性發出,對方將網絡解收的數據進行分解成為小包并按設備數據的類型進行不同的處理。
? ? 另一個值得注意的是使用了T.128協議族的ASN.1 BER(基本編碼規則)。我記得網上有一篇文章提到中國的程序員很多,可是會網絡編程的不多,懂得基本編碼規則的就少之又少。其實基本編碼規則很簡單,可以到網上查詢一些有關T.128&T.129的文章來看一下,很有用的。有時間我會協議篇關于此的貼子。
? ? 如果有想學網絡編程的朋友,可以看一下RDESKTOP這個軟件的代碼,能學到不少的東西。
一、? ? 網絡包控制結構(STREAM定義于 prase.h :2??typedef struct stream *)
結構用于對收到的TCP包的數據進行初期分解,按照不同的協議逐步將包中的RDP數據分離出來,為RDP數據的進一步分解做準備。
typedef struct stream
{
? ?? ? unsigned char *p;
? ?? ? unsigned char *end;
? ?? ?? ?? ?? ? unsigned char *data;
? ?? ?? ?? ?? ? unsigned int size;
? ?? ???/* Offsets of various headers */
? ?? ???unsigned char *iso_hdr;
? ?? ???unsigned char *mcs_hdr;
? ?? ???unsigned char *sec_hdr;
? ?? ???unsigned char *rdp_hdr;
} *STREAM;
結構包含:
? ? p指針:臨時指針變量,用于計算定位。
? ? data指針:TCP/IP數據的起始位置,是申請的一段內存,只當數據尺寸大于size時,進行realloc增大,不縮小。
? ? size指針:TCP/IP數據的尺寸大小
? ? end指針:TCP/IP數據的結束位置
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //以上是tcp數據管理變量
? ? iso_hdr指針:TCP/IP數據包中iso協議控制頭的位置
? ? mcs_hdr指針:TCP/IP數據包中mcs協議控制頭的位置
? ? sec_hdr指針:TCP/IP數據包中sec協議控制頭的位置
? ? rdp_hdr指針:TCP/IP數據包中rdp協議控制頭的位置
? ? 主要結構只創建一遍(in & out),結構數據及緩沖由tcp.c模塊維護。
? ? ISO控制頭:7字節
? ? MCS控制頭:8字節
? ? SEC控制頭:0(如果已經獲得許可證—通信協定)、4(未獲許可)
或12(進行加密時)字節
? ? 由SEC頭控制的數據段即是RDP的主要數據,一般進行了加密。
二、? ? TCP
負責維護與服務器的連接和數據。
? ? 一下STREAM結構的成員負責維護TCP數據:
p指針:臨時指針變量,用于計算定位。
data指針:TCP/IP數據的起始位置,是申請的一段內存,只當數據尺寸大于size時,進行realloc增大,不縮小。
size指針:TCP/IP數據的尺寸大小
end指針:TCP/IP數據的結束位置
p指針的作用:
? ? 在控制結構中,對于確定的發送數據和接收數據,其他各指針的含義和內容相對固定,而對于包中要計算、改動和提交到下一層處理的具體數據的定位工作就要靠p指針來完成。
? ? 在prase.h中定義了大量的關于使用p指針的運算用于對協議頭段的處理,并且在各層協議處理模塊中使用p指針定位、區分處理過和未處理的數據。
Tcp_init():初始out結構的數據緩沖和data、size、end、p變量
Tcp_connect():建立網絡連接并創建輸入和輸出數據控制結構(in & out)、網絡句柄sock
Tcp_disconnect():關閉網絡句柄sock
Tcp_send():發送TCP數據(out控制)到sock
Tcp_recv():接受定長TCP數據由sock到in,維護in結構緩沖,并調整in.tcp管理變量
三、? ? ISO
TCP傳輸之上,基于ISO頭的定義,我在這里將簡單的數據傳輸協定分為控制和數據兩種,由PDU頭段數據區分,主要是Type2。
Type1:控制PDU,長11字節,用于連接控制
? ? 1字節:協議版本號 = 3
? ? 2字節:保留
? ? 3-4字節:包長度(由第一字節到包結束)
? ?? ???5字節:數據偏移 = 6(ISO頭段結束的下一位距本字節的偏移量)
? ? 6字節:包類型 = ISO_PDU_CR = 0xE0(連接請求)
ISO_PDU_CC = 0xD0(連接建立)
ISO_PDU_DR = 0x80(中斷請求)
ISO_PDU_ER = 0x70(錯誤)
? ?? ???7-8字節:dst_ref = 0(忽略)
? ? 9-10字節:src_ref = 0(忽略)
11字節:class = 0(忽略)
? ? Type2:數據PDU,長度 = 數據長度 + 7字節,用于數據傳輸
? ? 1字節:協議版本號 = 3
? ? 2字節:保留
? ? 3-4字節:包長度(由第一字節到包結束)
? ?? ???5字節:數據偏移 =2(ISO頭段結束的下一位距本字節的偏移量)
? ?? ???6字節:包類型 = ISO_PDU_DT = 0xF0(數據傳送)
? ?? ???7字節:eot = 0x80
? ?? ???ISO數據開始
? ? Iso_init():初始out控制結構,預留ISO頭段空間,并將iso_hdr指向頭段位置
? ? Iso_send_msg():發送一個單一的控制消息數據包
? ? Iso_recv_msg():接收數據的頭段,分析包類型調整in結構指向數據位置,并傳回包類型
? ? Iso_send():填充ISO頭段,并發送數據
? ? Iso_recv():接收ISO數據包,去處頭段,調整in結構指向數據位置
? ? Iso_connect():建立ISO連接
? ? Iso_disconnect():中斷ISO連接
本文轉自
http://bbs.ccw.com.cn/viewthread.php?tid=761244
總結
以上是生活随笔為你收集整理的关于RDP协议的分析(一) - Linux论坛 - 计世网论坛 - Powered by Discuz!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android蓝牙开发常见问题
- 下一篇: 移动硬盘拷贝东西时快时慢的问题