在存储网络(FC/FCOE)中如何分析报文间的交互关系,是个很头疼的问题,报文间关系很复杂,今天我就分享一下个人的学习总结。其实存储网络(FC/FCOE)中某一组报文关系和TCP报文间的关系很类似,在我们熟悉的TCP/IP网络中,TCP连接中每个进程有一个独立的端口ID,每个进程中可能有出现不同的处理序列,这个序列由于IP报头的id来标识,当每个序列的报文太大需要分片时可以通过IP报头的分片偏移位来控制分片位置。接收端再把这些分片通过偏移位组合成一个完整的序列,再将这些序列组合成一个完整tcp进程。同样存储网络(FC/FCOE)中也有相应字段来区分不同进程,不同序列,每个序列的分片。
在存储网络(FC/FCOE)中不同进程表示一个exchange,通过报文中的OXID来区分:通过OXID(Origin exchange Id)来表示一个交换进程(exchange),通过这个字段可以判断不同报文是不是属于同一个交换进程内的报文,只能OXID一样就可以判断是同一个交换进程(exchange)内的报文。每个不同的处理进程使用不同的exchange,例如一个ELP过程,EFP过程,FCP SICI查询进程等等,都是不同的exchange。OXID是由发起端随机生成。下一个交换进程的OXID是前一个交换进程的OXID加1。这样可能保证每个交换进程ID不会冲突。
这里还有另一个ID,RXID(Receive ID)。发起端发起的exchange的第一个报文RXID是ffff表示exchange的第一个报文,接收端收到这个初始报文后,会随机生成一个RXID值,同前面的OXID一起控制了一个exchange交换进程ID的唯一性。随后的报文中只要是同一个进程的OXID和RXID都是一样的。同OXID一样,到下一个exchange交换进程时接收端生成的RXID值是前一个exchange交换进程中使用的RXID值加1。
在存储网络(FC/FCOE)中一个exchange(交换进程),可能由多个序列组成,通过报文中SEQ_ID来区分不同序列。这个SEQ_ID只标识某一端的序列,也就是说发起端和接收端的SEQ_ID是无关的。
在存储网络(FC/FCOE)中某个序列报文,可能太大超过存储FC协议规定的最大长度2112时就会出现分片,其后的分片报文这时保持这个序列SEQ_ID不变,SEQ_CNT递增。
OXID,RXID,SEQ_ID,SEQ_CNT四者之间的关系是怎样的呢?结合下图分析完整的exchange交换过程:
初始端发送OXID是随机生成的,RXID 为ffff,SEQ ID为0,SEQ CNT为0;接收端接收到初始交换报文时保留OXID不变,RXID随机生成,SEQ ID 独立于发起端的SEQ ID,SEQ CNT为0。当进入第二交换时,发起端发送的OXID为上次发送的OXID加1,SEQ ID加1,SEQ CNT为0,接收端保留本次OXID不变,RXID为上次交换时RXID加1,SEQ ID 为上次交换时发送端发送的最后一个序列ID再加1,SEQ CNT为0。第二交换的序列4报文是大报文,需要分片。后面的分片报文保持OXID,RXID,SEQ ID和序列4一样,每个分片报文的SEQ CNT比前一个分片递增1,直到分片结束。
这里再说明一点:通常操作系统在读写文件时,是以块为单位,这些文件存储在磁盘中的位置可能会被存放在不同的磁盘位置,当读写不同的连续块文件时会使用不同的Exchange交换过程,当这个连续块的大小很大时会进行分片,分片报文保持OXID,RXID,SEQ ID和序列4一样,每个分片报文的SEQ CNT比前一个分片递增1,直到分片结束。
基本上FC/FCOE协议中exchange交换过程OXID,RXID,SEQ_ID,SEQ_CNT四者之间的关系就如上所述。

2012年10月16日 上午9:31 沙发
这这这
2012年10月17日 上午10:43 板凳
自从工作后就没来过了,今天偶然来访,越来越好了。
2012年10月17日 下午9:31 1层
@www.94haha.com 坚持分享原创,分享自己的想法。呵呵,希望多多来访。
2012年10月17日 下午4:25 地板
学点技术走人
2012年10月18日 下午1:00 4楼
貌似我没有看懂··好东西!
2012年11月5日 下午8:04 5楼
你好,我最近开始学习FC协议。看到你写的文章收益很多,毕竟网上关于总结FC的东西还是比较少的。以后还有什么问题请多多帮助。
2012年11月6日 上午9:31 1层
@bonben 可以互相交流,有什么问题,在博客上留言我会尽量解答。
2012年11月5日 下午8:07 6楼
bonben@126.com 这是我的邮箱 希望多多交流!有什么资料也可以共享给我学习!
非常感谢!