USB - 主机和设备之间是否有初始握手?

USB - Is there an initial handshake between host and device?

我正在智能卡 reader 上使用 Wireshark 捕获 USB 流量。当我使用 PyScard 连接到 reader 时,在我仅通过建立连接发送任何 APDU 之前,使用批量操作来回发送一些数据包。

我读到 here USB 设备和主机之间有一个初始握手,我想知道这是否是我在嗅探时看到的。

使用 wireshark,我得到以下信息:

  1. 批量输出(主机到设备):

  1. 批量输出(设备到主机):

  1. 批量输入(主机到设备):

  1. 批量输入(设备到主机):

这四个数据包发送了 2-3 次,然后我可以嗅探我使用 PyScard 发送的消息。

我的目标是仅使用 USB 通信重现 reader 与主机之间的通信。所以:

  1. USB通信有初始握手吗?

  2. 这是我捕捉的吗?

  3. 如何重现此 USB 通信?

谢谢 <3


编辑 14/03/2018 - David Grayson 回答后的附加信息

我在这里捕获的不是“获取设备描述符”等部分。当我尝试打印设备的详细信息并且 Wireshark 识别并标记数据包时会发生这种情况。

我知道奇怪的操作,但这是我从 wireshark 得到的。我一直在做的解释是它们是请求-响应对:主机使用 bulk out 端点发送一些东西,然后在准备好时使用 bulk in 端点请求读取答案。我完全不知道,这就是我看起来的样子。

>> lsusb -v

Bus 001 Device 002: ID 0bda:0165 Realtek Semiconductor Corp. 
Couldn't open device, some information will be missing
Device Descriptor:

    bLength                
    bDescriptorType         1
    bcdUSB               2.00
    bDeviceClass            0 (Defined at Interface level)
    bDeviceSubClass         0 
    bDeviceProtocol         0 
    bMaxPacketSize0        64
    idVendor           0x0bda Realtek Semiconductor Corp.
    idProduct          0x0165 
    bcdDevice           61.23
    iManufacturer           1 
    iProduct                6 
    iSerial                 3 
    bNumConfigurations      1

Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           93
        bNumInterfaces          1
        bConfigurationValue     1
        iConfiguration          4 
        bmAttributes         0xa0
          (Bus Powered)
          Remote Wakeup
        MaxPower              500mA
        
Interface Descriptor:
    bLength                 9
    bDescriptorType         4
    bInterfaceNumber        0
    bAlternateSetting       0
    bNumEndpoints           3
    bInterfaceClass        11 Chip/SmartCard
    bInterfaceSubClass      0 
    bInterfaceProtocol      0 
    iInterface              6 
    
ChipCard Interface Descriptor:
    bLength                54
    bDescriptorType        33
    bcdCCID              1.10  (Warning: Only accurate for version 1.0)
    nMaxSlotIndex           0
    bVoltageSupport         7  5.0V 3.0V 1.8V 
    dwProtocols             3  T=0 T=1
    dwDefaultClock       3750
    dwMaxiumumClock      7500
    bNumClockSupported      0
    dwDataRate          10080 bps
    dwMaxDataRate      312500 bps
    bNumDataRatesSupp.      0
    dwMaxIFSD             254
    dwSyncProtocols  00000000 
    dwMechanical     00000000 
    dwFeatures       00010030
    Auto clock change
    Auto baud rate change
    TPDU level exchange
    dwMaxCCIDMsgLen       271
    bClassGetResponse      00
    bClassEnvelope         00
    wlcdLayout           none
    bPINSupport             0 
    bMaxCCIDBusySlots       1
    
Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x83  EP 3 IN
    bmAttributes            3
      Transfer Type            Interrupt
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0040  1x 64 bytes
    bInterval               8
    
Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x05  EP 5 OUT
    bmAttributes            2
      Transfer Type            Bulk
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0200  1x 512 bytes
    bInterval               0
    
Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x86  EP 6 IN
    bmAttributes            2
      Transfer Type            Bulk
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0200  1x 512 bytes
    bInterval               0

(截图还可以,长得像但又不一样)

初始握手包括 "Get Device Descriptor"、"Get Configuration Descriptor" 和 "Set Address" 等控制传输,它们在 USB 2.0 规范的第 9 章中定义。

初始握手通常没有任何批量传输,但您的设备可能使用了一个驱动程序,该驱动程序希望在初始化时进行一些批量传输。由于它是智能卡 reader,我想你的操作系统有一些驱动程序可以向它发送命令以查看是否连接了任何智能卡,并且这些命令很可能通过批量传输而不是控制来实现转移。要了解有关这些命令的更多信息,您需要找到您的设备实现的 USB class 的文档 and/or 发送这些命令的驱动程序。

您对批量流量的描述令人困惑。术语 "Out" 始终表示 "Host to device",因此它不能表示 "Device to host"。术语 "In" 始终表示 "Device to host",因此它不能表示 "Host to device"。您发布了两个重复的屏幕截图。

为了在未来获得更好的响应,我认为您应该包含设备描述符的转储 (lsusb -v),改进您对流量的描述,说明在哪些端点上看到了流量,以及说出您使用的是什么操作系统,并提供您所掌握的关于连接到您设备的驱动程序的任何信息。