FCP协议使用SCSI指令写文件报文过程分析

今天通过FC协议往存储上写数据,同时抓获这个过程的报文,分析了一下FCP协议使用SCSI指令写文件报文全过程。
首先先了解一下操作系统中文件存放在与磁盘位置的关系,
一个文件可能分成不同的数据块存放于不同的磁盘扇区。如上图文件A被分成两个部分的数据块存放在磁盘的不同扇区中。
结合实际报文分析,实际的文件写入存储时,数据在磁盘扇区中是如何存放的,逻辑地址对应关系如何:
下面我将给出我往存储上写一个文件,整个过程的报文:
写第一个数据块时,
第一步: 服务器往存储发送一个SICS write(写)指令,
指令中LBA(logic block address 逻辑块地址):001208e0 。
len:16 这个len是扇区的个数。这个len是怎么计算出来的呢?
上图画圈部分就是写的数据信息部分,每个FCP DATA长度是2048这是FCP协议中规定的一个数据报文数据字段部分最大数据长度,图上画圈部分的数据是2052,这是由于抓包工具解析问题实际的数据部分是去掉前面四个字节开始的,所以正确的数据长度是2048. 这里有4个FCP DATA报文,而通常一个扇区的大小为512字节,这样就可以算出len= 4*FCP DATA报文长度/扇区大小=4*2048/512=16. 没错这个16就是上图上看到的LEN 为16,也就是可以连续写16个扇区。
第二步: 存储会回复一个XFER_READY报文,表示存储已经准备好接收数据,同时报文中会通告对端可以发送多少的数据,如下图burst length 就是通告对端我只接收8192个字节的数据。
第三步: 服务器端开始发送数据,发送数据总大小是上一步中通告的大小,上面通告的大小是8192,所以服务器就发送了4个 FCP DATA报文,每个数据长度是2048,所以数据总长就是8192个字节。
最后一步:写完数据后存储会回复一个写完成的报文如下:
这是一个数据块的完整写过程。回头看一下第一个图中,我的写数据被分成三块,这就是开始所说的,写一个文件可能这个文件会被分成多个块写到不同的扇区中。
注:这里再提一个知识点,假设一个连续的逻辑块很大,而存储端一次能缓存的最大长度也就是前面提到的burst length的长度是65536。这样就会被分成多个序列进行传输,保持OXID和RXID不变,序列ID递增。这部分知识点可以参照:《深度分析FC/FCOE协议OXID,RXID,SEQ_ID,SEQ_CNT四者之间的关系》一文。

weinxin
DC Farm小程序二维码
扫一扫添加博客小程序
Jim

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:9   其中:访客  7   博主  1   引用   1

    • avatar 匿名 5

      留言是种美德,写点什么…

      • avatar 追逐RMB 3

        支持博主的技术分享!!

        • avatar 站长 5

          好久没来了,来看看

          • avatar 匿名 1
            • avatar 匿名 1
              • avatar bonben 2

                IO操作用的什么平台?

                • avatar bonben 2

                  若想开始学习linux下的关于FC的网络存储东西,应从linux的哪一方面开始入手?求赐教

                • 来自外部的引用: 1

                  • 如何查看操作系统块大小 | 数据中心天空