读懂一个开源项目源码之前,需要先了解该项目的背景知识。背景知识熟悉了,代码只是具体实现手段而已。
源码地址: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指令等等
标签:协议,code,tgt,iscsi,源码,opcode,阅读,scsi From: https://www.cnblogs.com/xjjsk/p/17717647.html