Các gói bắt tay (handshake packets) chỉ có một trường PID. Các gói bắt tay này được dùng để báo tình trạng của một giao tác dữ liệu và có thể trả về
những giá trị để cho biết quá trình tiếp nhận dữ liệu thành công, chấp nhận lệnh hoặc từ chối lệnh, điều khiển luồng và dừng hoạt động. Các tín hiệu bắt tay thường được trả về trong các pha bắt tay của một giao tác hoặc có thểđược trả
về ngay trong pha dữ liệu bằng cách gửi thông tin bắt tay thay vì gửi dữ liệu. Các gói bắt tay được phân định bởi một EOP theo ngay sau chỉ một byte. Nếu việc giải mã PID bắt tay đem lại giá trị hợp lệ cho một gói bắt tay song lại không kết thúc bởi một EOP thì phía thu coi như gói không hợp lệ và bỏ qua.
Hình 3.9: Gói bắt tay [1] Có tất cả là 5 loại gói bắt tay:
• ACK: Tín hiệu bắt tay này báo rằng gói dữ liệu nhận được mà không có lỗi nhồi bit hoặc các lỗi CRC ở trường dữ liệu và PID của gói nhận được là
đúng đắn. ACK có thể được phát ra khi chuỗi bit phù hợp và bên nhận có thể
nhận dữ liệu, cũng như khi chuỗi bit không phù hợp và bên phát và bên thu phải đồng bộ lại lẫn nhau. Một gói ACK chỉ được ứng dụng trong các giao tác mà dữ liệu đã được truyền đi và đang mong chờ tín hiệu bắt tay trả lời. ACK có
thểđược trả về bởi host trong giao tác IN và được trả về bởi chức năng cho các giao tác OUT, SETUP hoặc PING.
• NAK: Tín hiệu bắt tay này chỉ ra rằng một chức năng chưa cho phép nhận dữ liệu từ host trong giao tác OUT hoặc một chức năng không có dữ liệu
để gửi tới Host trong giao tác IN. NAK có thể chỉ được trả về bởi chức năng trong pha dữ liệu của giao tác IN hoặc pha bắt tay của giao tác OUT hoặc PING. Host có thể không bao giờ phát NAK. Ngoài ra, tín hiệu bắt tay NAK còn được sử dụng cho những mục đích điều khiển luồng để báo rằng một chức năng tạm thời không thể truyền hoặc nhận dữ liệu, nhưng chức năng đó sẽ dần dần có khả năng để truyền hoặc nhận dữ liệu mà không cần sự can thiệp của host.
• STALL: tín hiệu bắt tay này được trả về bởi một chức năng trong đáp
ứng một thông báo IN hoặc sau pha dữ liệu của một giao tác OUT hoặc trong
đáp ứng một giao tác PING. STALL chỉ ra rằng chức năng chưa cho phép truyền hay nhận dữ liệu hoặc một nhu cầu ống điều khiển không được hỗ trợ. Trạng thái của một chức năng sau khi trả về một gói STALL không được định nghĩa (đối với bất kỳ một điểm cuối nào trừ điểm cuối mặc định). Host không
được phép trả lại một gói STALL trong bất kỳ tình huống nào.
Gói bắt tay STALL được sử dụng bởi một thiết bị do một trong hai nguyên nhân sau:
- Nguyên nhân thứ nhất được gọi là “Functional Stall”, đặc tính dừng này liên quan đến việc thiết lập điểm cuối của cuộc truyền. Một trường hợp đặc biệt của function stall là “Commanded stall”, nó xảy ra khi mà host dứt khoát thiết lập đặc tính dừng trên điểm cuối. Một
điểm cuối của chức năng mà bị dừng thì nó liên tục trả về gói bắt tay STALL cho đến khi tình trạng đó chấm dứt nhờ sự can thiệp của host. - Nguyên nhân thứ hai được gọi là “Protocol Stall”. Protocol stall chỉ
liên quan tới các ống điều khiển. Một protocol STALL được trả về
khiển và trạng thái STALL kết thúc tại thời điểm bắt đầu của truyền
điều khiển tiếp theo (trong giao tác SETUP).
• NYET: Đây chỉ là gói bắt tay cho truyền tốc độ cao và được trả về
trong hai trường hợp. Nó được trả về bởi một điểm cuối tốc độ cao như một phần của giao thức PING. NYET cũng có thể được trả về bởi một hub trong
đáp ứng giao tác phân chia khi giao tác tốc độ thấp hoặc toàn tốc chưa hoàn thành hay khi hub không có khả năng điều khiển giao tác phân chia.
• ERR: Đây cũng là một gói bắt tay tốc độ cao được trả vềđể cho phép một hub tốc độ cao thông báo một lỗi trên bus toàn tốc hoặc tốc độ thấp.