tgt源码阅读

发布时间 2023-09-20 16:17:46作者: 心渐渐失空

读懂一个开源项目源码之前,需要先了解该项目的背景知识。背景知识熟悉了,代码只是具体实现手段而已。

源码地址:https://github.com/fujita/tgt

对于tgt来说,背景知识是块设备、scsi、iscsi协议。

众所周知,一条协议一般指的是一个包头,然后把要收发的数据放在包头后面。scsi协议和iscsi协议也如此。

对于tcp/ip协议、http协议,包头能在书中或网上找到,每个字段的含义都非常明确。

 

 

1.iscsi协议头一般是跟在tcp包头后面,而iscsi协议的包体就是scsi协议。

2.iscsi协议头和scsi协议头和tcp头部一样,都是二进制格式。但是scsi协议并不是对称的。就是request和response的内容不一样。

3.scsi request报文通常被叫做CDB(主要包含一个opcode表示是读操作还是写操作或者其他)。response叫做status code,如果status code == 0,表示request成功。如果status code == 2,表示后面还要回复一个叫做sense data的response给客户端,指示客户端下一步做什么。

 scsi协议只需要看opcode,头部内其他字段都是根据不同的opcode,而代表不同的含义,例如scsi opcode是读操作时:

 这只是scsi请求,而scsi响应则是:

 若status为2,则还会发一个sense response:

 

4.iscsi报文比较简单,一个报文叫做一个PDU,一个PDU由iscsi头部和包体组成,头部包含一个字段opcode字段,外加一些可选的key-value,包体就是scsi协议。正真读写的数据则是在scsi协议包体内。

注意,scsi协议头也有opcode,iscsi协议头也有opcode,但是他们不是同一个字段。

scsi的op code,表示本次请求是读/写/获取设备信息等等

iscsi的op code,表示的是本次操作是登录认证/协商会话信息/传输scsi指令等等