USB協議介紹二 傳輸

2021-10-18 15:25:16 字數 2379 閱讀 1364

傳輸

不像 rs-232 和其他類似的串列埠協議,usb 實際上由多層協議構造而成,不過大部分底層的協議都在 controller 端上的硬體或者韌體進行處理了,最終開發者所要關心的只有上層協議。

usb packet

在 hci 之下,實際傳輸的資料報稱為 packet,每次上層 usb 傳輸都會涉及到 2-3 次底層的 packet 傳輸,分別是:

token packet: 總是由主機發起,指示一次新的傳輸或者事件

in: 告訴 usb 裝置,主機我想要讀點資訊

out: 告訴 usb 裝置,主機我想要寫點資訊

setup: 用於開始 control transfer

data packet: 可選,表示傳輸的資料,可以是主機傳送到裝置,也可以是裝置傳送到主機

data0

data1

status packet: 狀態包,用於響應傳輸,以及提供糾錯功能

handshake packets: ack/nak/stall

start of frame packets

transfersetup stage: 主機傳送到裝置的請求,包含三次底層資料傳輸

setup token packet: 指定位址和端點號(應為0)

data0 packet: 請求資料,假設是 8 位元組的 device descriptor request

ack handshake packet: 裝置的響應, 不允許用 stall 或者 nak 來響應 setup packet

data stage: 可選階段,包含乙個或者多個 in/out 傳輸,以 in 為例,也包含三次傳輸

in token packet: 表示主機端要從裝置端讀資料

datax packet: 如果上面 setup stage 是 device descriptor request, 這裡返回 device descriptor response (的前8位元組,然後再根據實際長度再 in 一次)。

ack/stall/nak status packet

status stage: 報告本次請求的狀態,底層也是三次傳輸,但是和方向有關:

如果在 data stage 傳送的是 in token,則該階段包括:

out token

data0 zlp(zero length packet): 主機傳送長度為0的資料

ack/nack/stall: 裝置返回給主機

如果在 data stage 傳送的是 out token,則該階段包括:

in token

data0 zlp: 裝置傳送給主機,表示正常完成,否則傳送 nack/stall

ack: 如果是 zlp,主機響應裝置,雙向確認

每個階段的資料都有自己的格式,例如 setup stage 的 request,即 data0 部分傳送的 8 位元組資料結構如下:

struct usb_ctrlrequestattribute((packed));

下面是一些標準請求的示例:

bmrequesttype brequest wvalue windex wlength data

1000 0000b get_status (0x00) zero zero two device status

0000 0000b clear_feature (0x01) feature selector zero zero none

0000 0000b set_feature (0x03) feature selector zero zero none

0000 0000b set_address (0x05) device address zero zero none

1000 0000b get_descriptor (0x06) descriptor type & index zero or language id descriptor length descriptor

0000 0000b set_descriptor (0x07) descriptor type & index zero or language id descriptor length descriptor

1000 0000b get_configuration (0x08) zero zero 1 configuration value

0000 0000b set_configuration (0x09) configuration value zero zero none

ref:

雖然 hci 之下傳輸的資料報大部分情況下對應用開發者透明,但是了解底層協議發生了什麼也有助於加深我們對 usb 的理解,後文中介紹 checkm8 漏洞時候就用到了相關知識。

傳輸層協議介紹

urg 緊急指標,告訴接收tcp模組緊要指標域指著緊要資料。ack 置1時表示確認號 為合法,為0的時候表示資料段不包含確認資訊,確認號被忽略。psh 置1時請求的資料段在接收方得到後就可直接送到應用程式,而不必等到緩衝區滿時才傳送。rst 置1時重建連線。如果接收到rst位時候,通常發生了某些錯誤...

傳輸層協議介紹

傳輸層協議介紹 本章結構 tcp協議介紹 tcp報文格式 tcp三次握手 tcp四次揮手 udp協議介紹 常見協議及埠 一 tcp協議 1 tcp是面向連線的 可靠的程序到程序通訊的協議。2 tcp提供全雙工服務,即資料可在同一時間雙向傳輸。3 tcp報文段 1 tcp將若干個位元組構成乙個分組,叫...

傳輸層協議介紹

tcp transmission control protocol 傳輸控制協議 udp user dataprogram protocol 使用者資料報協議 tcp將若干個位元組構成乙個分組,叫報文段 tcp報文段封裝在ip資料段中 序號 傳送端為每個位元組進行編號,便於接收端正確重組 確認號 用...