比特派钱包网站|tgt

作者: 比特派钱包网站
2024-03-07 21:25:52

汽车三贱客 伟大的旅程 第三季全14集 中文字幕_哔哩哔哩_bilibili

汽车三贱客 伟大的旅程 第三季全14集 中文字幕_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿汽车三贱客 伟大的旅程 第三季全14集 中文字幕

92.4万

1.6万

2019-05-15 10:34:32

810525302.0万1842第6集(中国篇)无法通过审核,缺第6集。娱乐综艺THEGRANDTOURTGT英国中文字幕明星综艺真人秀龟速船长三贱客伟大的旅程

yngjpp

发消息

每日精选短视频。

关注 8479

最流畅的高清对局,最纯正的爽感枪战视频选集(1/13)自动连播【4K HDR】内嵌中字【伟大的旅程:第三季】The.Grand.Tour这狗好蠢

62.9万

8552

【真人秀/汽车】Top Gear 第15季TopGear

230.2万

1.8万

【真人秀/汽车】Top Gear 第1季 第1-5集TopGear

321.5万

2.6万

【真人秀/汽车】Top Gear 第21季TopGear

333.4万

2.5万

【真人秀/汽车】Top Gear 第20季TopGear

276.1万

2.3万

【真人秀/汽车】Top Gear 第25季 第1集【bilibili独播】TopGear

269.3万

1.7万

【真人秀/汽车】Top Gear 越南特辑TopGear

94.0万

1.1万

【真人秀/汽车】Top Gear 第14季TopGear

180.1万

1.5万

【真人秀/汽车】Top Gear 第2季 第01-04集TopGear

101.2万

9443

【真人秀/汽车】Top Gear 缅甸特辑TopGear

161.1万

1.5万

【真人秀/汽车】Top Gear 第22季TopGear

586.7万

4.7万

【真人秀/汽车】Top Gear 第19季TopGear

217.4万

1.8万

Top Gear总集篇(上)【精选特辑】TopGear

81.0万

5363

【三贱客】有些国人素质有待提高啊!Jeremy都看不下去了!PhillipY203

6.4万

10

【真人秀/汽车】Top Gear 玻利维亚特辑TopGear

116.2万

9737

The Grand Tour 第四季 三贱客的旅程 4Kvikutoka

16.5万

3064

【三贱客】三贱客在央视我自己的工作间

50.7万

873

【纪录片】Top Gear第32季01 铁三角勇闯佛罗里达哔哩哔哩纪录片

473.8万

3673

【纪录片】《Top Gear》第29季01:24小时车舱生存&法拉利SF90哔哩哔哩纪录片

268.4万

9276

【真人秀/汽车】Top Gear A-Z特辑(上)TopGear

87.1万

3007

展开

小窗

客服

顶部

赛事库 课堂 2021

如何评价TGT第三季第六季中国特辑? - 知乎

如何评价TGT第三季第六季中国特辑? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册美剧汽车视频Top Gearthe grand tour如何评价TGT第三季第六季中国特辑?关注者100被浏览96,218关注问题​写回答​邀请回答​好问题 1​添加评论​分享​21 个回答默认排序Joshua Bright​ 关注相比08年讲中国的那一集(top gear),我觉得看得甚是欣慰。也说明了祖国这几年的飞速发展足够让他们很难找到黑点?我觉得相比黑其他地方,这次已经是“轻喷”。最多的讽刺就是说我们中国人人傻钱多,喜欢去西方买买买,而不关注文化。一次是大猩猩说“他们看我们就是庞大愚蠢的奶牛,我们和奶牛唯一的区别是不是给他们牛奶,而是手表和行李箱。”还有一次是他们在遵义,买各种纪念品,然后出来吃麦当劳。算是一次“模仿”。此外也就吐槽一下中国还没有汽车文化,只开了30年的汽车。这些也是客观事实。其他真没怎么黑,可能是接的赞助多吧,堵住了他们的嘴。蔚来的圈速榜单第二、对红旗宏伟而又邪恶的评价,我觉得是一种肯定。但都是点到为止,不谈缺点,不深入测试。此外更多的是对外国观众的科普:1、发展迅速。2、钱真的多,这里卖的车比在英国高几倍的价格。3、铺路狂魔。4、市场巨大,北京千分之三能摇到车牌,五菱宏光年销50W…相比上次来中国,节目风格已经有了很多转变,不再为了黑而黑,也较少故意丑化中国,傲慢与偏见更是没有。祥和而又平静的一集,没准外国观众会觉得这一集有些无趣吧。谁会真的在意那三辆过气豪华轿车?让人兴奋的就只有ep9,却无法上路。希望我们的国产汽车能再接再厉,下次来中国会有更多惊喜!发布于 2019-02-15 15:44​赞同 44​​35 条评论​分享​收藏​喜欢收起​刘见​​ 关注着实不算是黑了,可以明显感觉的是剧组肯定是有想法的,但是很多都没有做或者播出来,可能原因也是多方面的吧,结果就是导致这一集其实是很无聊的。我一开始以为至少来中国的某个赛道跑一跑,而且最大的败笔是没有真正的测试中国车,我看几辆豪华车出来我就知道砸了。而且后来买西服的情节我也是完全没有get到黑点。各个解读也不能说是没有偏颇。这一集与其说是中国特辑不如说是豪华车搞怪特辑,毕竟几个测试跟中国并没有关系,比如说找个人开车,自己在车里玩点什么,在任何国家都可以做。我感觉剧组完全对中国没有兴趣但是为什么要做这一期中国节目我也不明白。不过还是可以看一看一个英国人进入了中国环境的反应,至少剧组没有带着恶意揣测的预设立场来解释一切的。从评论里补充一点:的确是中国车,我的错,我的意思是Jeremy他们应该在重庆的路上开五菱荣光,或者比亚迪,或者别的中国车,ep9是刷新纽北记录的欧洲团队主导设计的无法上路的赛车,这离中国太远了。作为一个历史悠久的汽车节目,在一集中国的节目上,在他们实际上已经来了中国,而事实上他们却没有真正的测评任何一辆跑在中国公路上的汽车,我不觉得Jeremy他们没有感觉到问题,可能这正是这一期节目的真正意义,所以最后他说抱歉浪费了一个晚上。再从评论里补充一下:有知友问:很多地方是不让说吧。你觉得他们不想测一测红旗嘛?但是你觉得会给他们测嘛?这正是我觉得遗憾的地方,不知道这一集原来的策划是如何,但是一上来就直直奔着最敏感的地方去测评绝不是一个明智的选择。而且我还能感受到剧组是有怨气的,具体是因为什么而产生的怨气我想大家都多少能猜到一些。我想在路上开一开哈弗,五菱荣光,比亚迪,甚至开一开WEY,然后品头论足一番,都完全不会像上来就说开红旗的感觉是pure evil那样触到痛点。为了在中国的公路上开车,竟然要特地从欧洲进口节目用车,难道当地就找不到一辆老奔驰老宝马吗?这说明在中国剧组是无车可用的,难道中国的车厂就这么不想TGT开自己的车吗?我之前真的很期待TGT评价一下国产车,因为国产车跟全世界的汽车生产路数都不一样,中国人的买车逻辑可不是一个便宜省油就可以糊弄过去的,因为这是TGT,不是杂牌子汽车节目。我想看看Jeremy怎么看待它们的。我们不是没有汽车文化,只是没有Jeremy理解的那种汽车文化,他太保守了。在全世界最大汽车市场,没有测评一辆量产车,我们都明白为什么。编辑于 2019-02-18 01:12​赞同 29​​18 条评论​分享​收藏​喜欢

The.Grand.Tour.S03E06.重庆特辑_哔哩哔哩_bilibili

The.Grand.Tour.S03E06.重庆特辑_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿The.Grand.Tour.S03E06.重庆特辑

1.3万

191

2021-12-27 23:22:13

未经作者授权,禁止转载189101303172汽车汽车生活重庆TGT三贱客the grand tour

热血大萝卜

发消息

关注 465

最流畅的高清对局,最纯正的爽感枪战

接下来播放

自动连播The Grand Tour S5E3 ①啧啧C啧

6.8万

280

我们又保留了一辆Grand Tour战车!!手沙特辑aid_E

1.1万

1

TheGrandTour S05E03 手沙特辑:Outro我自己的工作间

14.5万

433

当哈蒙德被问到TG被砍时老旧的GTR

12.0万

57

2月16日见!The Grand Tour“手沙”特辑预告我自己的工作间

9.4万

148

【中文字幕】三贱和你过大年!The Grand Tour毛里塔尼亚特辑预告,2月16日正式上线!ZN-Channel

3525

9

访谈 詹姆斯.梅工作经历以及对于 Top Gear 全球火热和 Grand Tour 结束的看法等等 | The Intercooler 200啧啧C啧

592

0

【切片/reaction】ZN娘看三贱客最新特辑,全程爆笑ZN-Channel

2.0万

173

大世界之旅 沙漠行动 将于2月16日播出不靠谱实验室

6.9万

155

三贱客的[What Next] 没有手机的24个小时老旧的GTR

1203

1

重庆黄色法拉利用34秒夺走你的“卧槽”TC太川

18.6万

310

三贱客的“廉价”超跑之旅爆笑连连dy小玲追剧

5341

1

为什么说重庆是男人的天堂?今日话题酱

14.8万

116

重庆一座荒山中发现一尊“二郎神”,高约6米,也不知是何人修建?渝哥阿林

15.2万

131

TheGrandTour SandJob. Outro. 伟大的征程 | 大世界之旅S5E03结尾partTheStarland

812

0

失去的不止是青春light-小七

2624

1

三贱客之特种部队无限卡bug流dy小玲追剧

1140

2

三贱客粉丝应该都知道这是什么车吧DTCC深油汽车频道

817

0

理查德·哈蒙德父女博客节目《当下的我们》最新预告片(中字)inct_

4994

3

世界第八大奇迹:中国公路网络热血大萝卜

412

0

展开

小窗

客服

顶部

赛事库 课堂 2021

TGT学习总结 - 知乎

TGT学习总结 - 知乎首发于存储笔记切换模式写文章登录/注册TGT学习总结高兴广TGT基础介绍背景知识SCSI概念要介绍TGT首先要清楚SCSI。我们参考维基百科对SCSI的介绍:SCSI(small computer system interface,小型计算机系统接口)是计算机与外围设备之间物理连接和传输数据的一套标准。SCSI标准定义了命令、协议、电气、光学和逻辑接口。SCSI最常用于硬盘驱动器和磁带驱动器,但它可以连接许多其他设备,包括扫描仪和CD驱动器,尽管并非所有控制器都可以处理所有设备。SCSI标准定义了特定外围设备类型的命令集;我们通俗的理解就是SCSI是用于计算机主机与外围设备之间连接的一套软硬件标准。同时它可以支持很多中设备类型,但主要是用于存储设备(磁盘、磁带)。Target和Initiator的概念对SCSI有基本的概念了解,还需要了解SCSI协议中target和initiator的概念。SCSI协议使用的是client-server模式。所有的请求由client发起,我们称之为initiator;然后由server处理这些请求,并将响应返回给client,server的角色在SCSI协议中被称之为target。以存储设备硬盘为例,讲述一下SCSI协议中target和initiator的作用。initiator是运行在主机上的一套软件,作用是初始化和发送读写请求。target是运行在设备端(硬盘)上的一套软件,作用是处理主机对硬盘的读写请求。当用户有对硬盘的读写(readbytes/writebytes)请求时,操作系统内核就会将这个读写请求转发给initiator;initiator收到请求后就会将其转化成SCSI协议能够认识的读写(READ16/WRITE16)请求(REQUEST),并通过传输层、物理层发送给target。target通过物理层、传输层收到initiator的(READ16/WRITE16)请求后,在将命令转换成硬盘能够识别的(readblock/writeblock)命令,磁盘执行最终命令后,将结构反馈给target。target将其封装成命令响应(RESPONSE)在发送给initiator,initiator在将RESPONSE解析成用户能够理解的读写响应。target和lun的关系lun的全称是logical unit number,逻辑单元号。我们参照维基百科的解释:In SCSI terminology, LUN stands for logical unit, which are specified by unique logical unit numbers. A LUN represents an individually addressable (logical) SCSI device that is part of a physical SCSI device (target). In an iSCSI environment, LUNs are essentially numbered disk drives. target可以代表IO设备对外提供服务。为什么又引入一个逻辑单元呢?原来SCSI协议最初是用在计算机内部的并行传输总线上,而并行传输总线可挂载的设备是有限的,最多为15个。一个target可以代表一个设备这没错,可是随着需求的发展,实际需要用来描述的对象远远超过这个数量。因此便引入了lun,lun是对target寻址的一种扩展。每个target下可以有多个lun。先按照target ID寻址target,在按照lun ID寻址lun,这极大增加了SCSI的寻址范围。以iSCSI磁盘存储为例:一个target就是一块磁盘,而一个lun就是在这个磁盘里划分的一个分区。磁盘划分分区后方便对存储空间的管理和使用,也更有利于数据存储安全。现代操作系统的文件系统必须建立在分区即lun上。传输网络上面简单介绍了一下SCSI、target、以及initiator,下面我们在聊一下initiator和target之间的物理连接网络。SCSI协议最初仅支持机箱内的并行总线上传输。后来随着SCSI协议的发展,开始支持越来越多的传输层网络,致使传输速度越来越快,传输距离越来越远,包括FC、RDMA、SAS,iSCSI等多种类型。iSCSI协议(Internet Small Computer System Interface)是本文章的主角,我们无需探究其他的协议。iSCSI协议使得initiator和target直接的交互请求和响应可以在IP网络上流通,这使得SCSI协议可以在超远距离上使用,大大增强了SCSI协议的通用性,可以说是革命性的变化。关于TGT的问题TGT是什么我们参考TGT官网的介绍,TGT是一套专门为简化SCSI target驱动的创建和维护而开发的开源软件。其架构如下:分为内核空间和用户空间两部分。Target Drivers的主要职责是关于target与Initiator之间的传输连接,并将命令传送给tgt core模块。tgt core是Target Drivers与用户空间守护进程之间一个简单的连接器。tgt daemon是整个系统的核心,负责维护SCSI状态机并执行SCSI命令。tgtadm是一个简单的管理程序。Transport libraries是用户空间的传输层驱动,目前主要是对iSCSI协议的支持。Target driver libraries是用户层的target驱动库。其中内核空间部分层短暂进入过linux内核主线,现在是被LinuxIO项目代替。后面我们默认只讲用户空间的部分。TGT能做什么In order to provide block I/O services, Linux users have had to modify kernel code by hand, use binary kernel modules, or purchase specialized hardware. With the mainline kernel now having SCSI Parallel Interface (SPI), Fibre Channel (FC), iSCSI, and SCSI RDMA (SRP) initiator support, Linux target framework (tgt) aims to fill the gap in storage functionality by consolidating several target driver implementations and providing a SCSI protocol independent API that will simplify target driver creation and maintenance. 按照文中的描述,linux的用户需要对外提供块设备服务还是比较麻烦的,手动修改代码、编译成二进制内核模块、或购买专门的硬件。随着linux内核对多种类型的initiator框架提供了支持,target端的框架设计仍然是一个空白(linux用户可以方便的使用块设备服务,不能方便的对外提供块设备服务)。那么TGT项目的主要目的就是通过整合各种target驱动实现从而提供一套SCSI协议的API,简化target驱动的设计及维护,最终填补这个空白(从文中来看,TGT项目之前,linux内核并没有统一的SCSI target框架,笔者并没有为此进行调查)。我们通俗的理解:TGT可以使linux系统方便的对外提供SCSI服务。安装了TGT的linux机器可以方便的提供磁盘、磁带、打印机、DVD等服务,又因其支持iSCSI协议,用户可以通过网络访问我们提供的服务。背景介绍到这里,我们的主旨呼之欲出了。因为我们对磁带、打印机、DVD等过时设备类型不感兴趣,所以我们的重点就是搞清楚一个问题:安装了TGT的linux计算机是如何变成可以通过网络访问的磁盘的。TGT要做什么要搞清楚TGT如何是使计算机变成可以通过网络访问的磁盘这个问题,我们可以再细分子问题:TGT如何是计算机变成磁盘的?如何处理磁盘相关的读写请求?这些请求是如何通过网络传输的?想象我们怎么使用一块普通的硬盘?1)把磁盘连接到计算机上,计算机便会识别这块磁盘。2)然后给磁盘划分分区,计算机便会识别磁盘上的逻辑分区。3)然后在分区上格式化文件系统(对分区进行读写请求)。针对第一步,计算机之所以能够识别磁盘,是因为我们在磁盘上有target控制器提供target服务,操作系统与target控制器通信,便能发现这是一块磁盘。针对第二步,计算机之所以能够识别逻辑分区,是因为操作系统给磁盘分区时磁盘上的target控制器会在磁盘上建立lun device,即逻辑设备。操作系统再次与target控制器通信时,首先发现这是一块磁盘,后又发现磁盘上的lun device,便将其识别为分区。变成一块盘分析计算机识别磁盘和分区的步骤可以看出,TGT只要能够模拟出target控制器和lun device,操作系统就可以把我们识别成一块磁盘了。创建target

tgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.2009-02.com.example:for.all

targetname是我们要创建的target的名字,其采用IQN命名格式:iqn.年-月.反向域名:任何唯一的名字

创建lun

tgtadm --lld iscsi --mode logicalunit --op new --tid --lun 1 --backing-store /mnt/disk.img

backing-store代表我们后端存储的文件名,我们不是真正的磁盘;要模拟磁盘的数据保存功能,可以将数据保持在这个文件里。

设置访问权限(此处我们允许所有IP访问)

tgtadm --lld iscsi --mode target --op bind --tid 1 -I ALL

iSCSI协议可以设置访问权限的,可以通过IP来限制访问,也可以通过用户名/密码方式限制访问。

查看创建的target和lun

tgtadm --lld iscsi --mode target --op show通过上面的步骤,我们已经建立了一个target和一个lun,并且把/mnt/disk.img设置为我们做数据存储。导出服务至此我们在功能上模拟了一块磁盘,但我们不能想磁盘那样之间插到电脑主机里。那怎样才能让计算机发现或者说使用我们的服务呢?上面讲到iSCSI是我们的主角,它通过IP网络传输SCSI命令,使得SCSI协议可以在超远距离上使用。而TGT目前支持的最完善的传输协议就是iSCSI,客户端计算机可以在远端通过IP网络传输SCSI命令,远程发现我们的target和lun,远程使用我们的存储服务。刨根问底下面我们首先描述清楚tgt程序的整体框架,然后再深入到IO细节里,试图刨根问底,看看tgt到底怎样提供磁盘服务。TGT程序框架IO路径及模块划分从图中可以看出tgt程序主要有两条交互路径:tgtadm与mgmt,主要用于对tgtd进行管理工作,对target的创建/删除,对lun的创建/删除,访问权限的增删改等。与客户端initiator的交互,处理Initiator的查询、读、写等操作。tgt程序大致可以分为5个模块:tgtadm,一个应用层命令,对tgt守护进程做一些配置工作。Target/Lun管理模块,组织管理target/lun,并从协议层响应initiator请求。设备类型模拟层,tgt可以对外模拟磁盘、磁带、DVD等多种类型的设备,我们主要关注对磁盘的模拟。后端存储支持层,tgt做模拟存储设备时,将实际数据存储在后端存储层,目前tgt执行file、ceph等多种存储类型。iSCSI协议处理模块,主要是对iSCSI协议的实现,负责与Initiator端的交互,包括用户登录、session的维护、读写请求响应等。在处理读写请求的时候,负责在target和initiator之间转发数据,是两者之间的桥梁。数据结构TGT完成这些事情需要一些重要的重要数据结构:后端存储层struct backingstore_template {

const char *bs_name;

int bs_datasize;

int (*bs_open)(struct scsi_lu *dev, char *path, int *fd, uint64_t *size);

void (*bs_close)(struct scsi_lu *dev);

tgtadm_err (*bs_init)(struct scsi_lu *dev, char *bsopts);

void (*bs_exit)(struct scsi_lu *dev);

int (*bs_cmd_submit)(struct scsi_cmd *cmd);

int bs_oflags_supported;

unsigned long bs_supported_ops[NR_SCSI_OPCODES / __WORDSIZE];

struct list_head backingstore_siblings;

};bs_open:在创建Lun的时候会调用,因为lun是执行存储功能的逻辑单元,所以需要在创建lun的时候指定后端存储引擎,并执行open操作,做一些初始化的工作。bs_init:与bs_open类似,同样要执行一些存储引擎本身初始化的工作;此外bs_init还需要调用bs_thread_open函数向tgt的后端存储管理模块注册用于响应SCSI协议的回调函数,并为lun启动任务队列后台处理线程。bs_cmd_submit:后端存储支持层的SCSI命令分发模块,负责将SCSI命令分发到对应的队列/函数。bs_supported_ops:标记数组,用于指示本存储引擎支持哪些SCSI命令。例如:READ6、READ10、WRITE6、WRITE10等。设备模拟层struct device_type_template {

unsigned char type;

tgtadm_err (*lu_init)(struct scsi_lu *lu);

void (*lu_exit)(struct scsi_lu *lu);

tgtadm_err (*lu_config)(struct scsi_lu *lu, char *args);

tgtadm_err (*lu_online)(struct scsi_lu *lu);

tgtadm_err (*lu_offline)(struct scsi_lu *lu);

int (*cmd_passthrough)(int, struct scsi_cmd *);

struct device_type_operations ops[NR_SCSI_OPCODES];

struct list_head device_type_siblings;

};每一个device_type_template结构代表一种TGT可以模拟的设备类型。lu_init:在创建Lun的时候会调用,执行一些初始化工作,主要是填充scsi_lu结构的attrs结构内的字段(不同attrs即代表了不同的设备类型)。lu_config:在修改lun设备熟悉时调用,同lu_init类似主要修改scsi_lu结构的attrs结构。ops:此结构最中要的字段,存储不同SCSI命令需要调用的回调函数。针对READ、WRITE等操作调用对应的回调函数。target管理层struct target {

char *name; //本target的名字,iqn格式

int tid; //本target的target ID

int lid; //本target使用的传输层协议号,例如iscsi,iser协议

enum scsi_target_state target_state; //当前target的状态,指示是否可正常工作等

struct list_head target_siblings; //target的兄弟链表

struct list_head device_list; //本target所管理的lun的链表

struct list_head it_nexus_list; //本target的链接信息

struct backingstore_template *bst; //target的bst,默认使用rdwr,即普通文件

struct list_head acl_list; //允许访问target的IP和port信息

struct list_head iqn_acl_list; //允许访问target的initiator信息

struct tgt_account account; //允许访问target的用户名和密码信息

struct list_head lld_siblings; //tgt_drivers的target_list链表的节点项

};此结构代表一个target,target更多是管理性的工作,管理lun、管理acl访问、管理session信息等,所以本结构链表比较多。struct scsi_lu {

int fd; //以文件为后端存储的lun会用到此字段,代表后端文件的访问句柄

uint64_t addr; /* persistent mapped address */

uint64_t size; //lun的大小

uint64_t lun; //lun的ID

char *path; //后端存储路径

int bsoflags;

unsigned int blk_shift;//块大小的位移

struct list_head device_siblings;

struct list_head lu_itl_info_list;

struct tgt_cmd_queue cmd_queue; //本LUN的SCSI命令的队列

uint64_t reserve_id;

// 下面三个字段是灵魂级的内容

struct device_type_template dev_type_template; //代表此lun是什么类型的设备

struct backingstore_template *bst; //此lun的后端存储类型

struct target *tgt; //管理此lun的target

uint8_t mode_block_descriptor[BLOCK_DESCRIPTOR_LEN];//代表块大小

struct list_head mode_pages;

struct lu_phy_attr attrs; //块的物理属性,PID、VID、ID、SN等字段

struct list_head registration_list;

uint32_t prgeneration;

struct registration *pr_holder;

void *xxc_p;

int (*cmd_perform)(int, struct scsi_cmd *); //执行SCSI命令的函数指针,

//默认是target_cmd_perform

void (*cmd_done)(struct target *, struct scsi_cmd *);//SCSI命令执行完毕后的回调指针,

//默认是__cmd_done

};scsi_lu代表一个lun逻辑处理单元,内容最多。iscsi协议层session及connectionstruct iscsi_session {

int refcount; //引用计数

/* linked to target->sessions_list */

struct list_head slist;

/* linked to sessions_list */

struct list_head hlist;

char *initiator;

char *initiator_alias;

struct iscsi_target *target;

uint8_t isid[6]; //initiator端session ID

uint16_t tsih; //target端session ID

/* links all connections (conn->clist) */

struct list_head conn_list; //一个session可以有多个connection

int conn_cnt; //connection的个数

/* links all tasks (task->c_hlist) */

struct list_head cmd_list; //此session上所有task的链表

/* links pending tasks (task->c_list) */

struct list_head pending_cmd_list;//阻塞的task链表,一个session可以有多个connection, //session接收的task可能是乱序的

uint32_t exp_cmd_sn;

uint32_t max_queue_cmd;

struct param session_param[ISCSI_PARAM_MAX];//session参数

char *info;

/* if this session uses rdma connections */

int rdma;

};iscsi_session结构管理TGT的session链接,相同的initiator和target只能由一个session。struct iscsi_connection {

int state;

/* should be a new state */

int closed;

int rx_iostate; //rx状态机状态指示

int tx_iostate; //tx状态机状态指示

int refcount; //当前连接的引用次数

struct list_head clist; //conn链表

struct iscsi_session *session;//当前连接所属的session

int tid;

struct param session_param[ISCSI_PARAM_MAX];//当前连接的参数

char *initiator; //当前连接的initiator的名字

char *initiator_alias;//当前连接的initiator的别名

uint8_t isid[6]; //当前连接的initiator的ID

uint16_t tsih; //当前连接的target的ID

uint16_t cid; //当前连接即此结构本身的ID

int session_type; //此连接的session类型,SESSION_NORMAL或SESSION_DISCOVERY

int auth_method; //认证方法,CHAP认证 或 无需认证(NULL)

uint32_t stat_sn; //当前的response的序列号

uint32_t exp_stat_sn; //initiator期望的response的序列号

uint32_t cmd_sn; //initiator发送的CMD的序列号ID

uint32_t exp_cmd_sn; //target期望的CMD序列号

uint32_t max_cmd_sn; //最大CMD序列号

struct iscsi_pdu req; //接收initiator REQUEST PDU用的缓存区

void *req_buffer; //接收缓存区指针,一般req.data字段会指向此

struct iscsi_pdu rsp; //发送给initiator RESPONSE PDU用的缓存区

void *rsp_buffer; //发送缓存区指针,一般rsp.data字段会指向此

int rsp_buffer_size; //发送缓存区大小

unsigned char *rx_buffer;//接收状态机用于指向接收缓存区的指针

unsigned char *tx_buffer;//发送状态机用于指向发送缓存区的指针

int rx_size; //指示需要接收的数据大小

int tx_size; //指示需要发送的数据大小

uint32_t ttt; //target task tag,此tag用于指示conn属于target,

//ttt会随rsp发送给initiator

int text_datasize;

void *text_rsp_buffer;//指向键值对的地址(在SCSI中称为text)

struct iscsi_task *rx_task;//要读取REQUEST的task

struct iscsi_task *tx_task;//要发送RESPONSE的task

struct list_head tx_clist; //需要发送RESPONSE的task链表

struct list_head task_list;//需要处理REQUEST的task链表

unsigned char rx_digest[4];//传输过程中的摘要信息

unsigned char tx_digest[4];//传输过程中的摘要信息

int auth_state; //指示当前CHAP认证的状态

union {

struct {

int digest_alg;

int id;

int challenge_size;

unsigned char *challenge;

} chap;

} auth; //CHAP认证用的结构体,后面详述

struct iscsi_transport *tp;//指向传输层的指针

struct iscsi_stats stats;

};iscsi_connection结构体是维护一个iSCSI连接的关键数据结构,登录认证、数据接收与发送等重要工作均以此为基础。struct iscsi_transport {

struct list_head iscsi_transport_siblings;

const char *name;

int rdma;

int data_padding;

int (*ep_init) (void);

void (*ep_exit) (void);

int (*ep_login_complete)(struct iscsi_connection *conn);

void (*free_task) (struct iscsi_task *task);

size_t (*ep_read) (struct iscsi_connection *conn, void *buf,

size_t nbytes);

size_t (*ep_write_begin) (struct iscsi_connection *conn, void *buf,

size_t nbytes);

void (*ep_write_end) (struct iscsi_connection *conn);

int (*ep_rdma_read) (struct iscsi_connection *conn);

int (*ep_rdma_write) (struct iscsi_connection *conn);

size_t (*ep_close) (struct iscsi_connection *conn);

void (*ep_force_close) (struct iscsi_connection *conn);

void (*ep_release) (struct iscsi_connection *conn);

int (*ep_show) (struct iscsi_connection *conn, char *buf, int rest);

void (*ep_event_modify) (struct iscsi_connection *conn, int events);

void * (*alloc_data_buf) (struct iscsi_connection *conn, size_t sz);

void (*free_data_buf) (struct iscsi_connection *conn, void *buf);

int (*ep_getsockname) (struct iscsi_connection *conn,

struct sockaddr *sa, socklen_t *len);

int (*ep_getpeername) (struct iscsi_connection *conn,

struct sockaddr *sa, socklen_t *len);

void (*ep_nop_reply) (long ttt);

struct iscsi_task *(*alloc_task)(struct iscsi_connection *conn,

size_t ext_len);

};iscsi_transport结构定义了传输层的众多操作。ep_init:执行传输层的初始化工作,以iSCSI协议为例:它启动了nop心跳检测线程,开启了对initiatorREQUST的监听服务等。ep_login_complete:initiator登录成功后,对传输层做一些配置工作,主要是nop线程的时间间隔参数。free_task、alloc_data_buf、free_data_buf:申请和释放内存空间。不同传输层可以为性能考虑对内存可能有一些特殊用法,所以申请和释放内存的工作便放到了传输层,例如iSCSI协议便是用valloc申请的内存。ep_read:读数据。ep_write_begin,ep_write_end:写数据的开始和结束。之所以分开仍然是为性能考虑,例如iSCSI便开启了TCP协议的TCP_CORK。ep_getsockname、ep_getpeername、ep_show:获取连接的相关信息。iscsi task和cmdstruct iscsi_task {

struct iscsi_hdr req; //REQUEST data,从conn->req拷贝而来

struct iscsi_hdr rsp;

uint64_t tag; //req-itt,initiator tag

struct iscsi_connection *conn;//指向负责通信的conn

/* linked to session->cmd_list */

struct list_head c_hlist;

/* linked to conn->tx_clist or session->cmd_pending_list */

struct list_head c_list;

/* linked to conn->tx_clist or conn->task_list */

struct list_head c_siblings;

unsigned long flags; //#define ISCSI_FLAG_CMD_FINAL 0x80

//#define ISCSI_FLAG_CMD_READ 0x40

//#define ISCSI_FLAG_CMD_WRITE 0x20

//#define ISCSI_FLAG_CMD_ATTR_MASK 0x07

int result; //命令指向结果

int len; //data长度

int offset;//data偏移

int r2t_count; //ready to transfer

int unsol_count;//标记是否传输完成

int exp_r2tsn; //This field indicates the number of Data-In (read) PDUs the target has sent for the command.

void *ahs; //additional header segment(AHS) pointer

void *data; //data segment pointer

struct scsi_cmd scmd;//SCSI命令的核心结构

unsigned long extdata[0];

};iscsi_task是在iscsi层对task的封装,负责维护cmd在iscsi层的状态(此task是否接收/发送完毕、已发送/接收的长度等),与实际命令相关的字段在scmd结构中。struct scsi_cmd {

struct target *c_target; //指向target控制器节点

/* linked it_nexus->cmd_hash_list */

struct list_head c_hlist;

struct list_head qlist; //lun->cmd_queue的链表节点

uint64_t dev_id; //lun ID

struct scsi_lu *dev; //指向lun节点

unsigned long state;

enum data_direction data_dir; //此命令数据传输方向,NONE\READ\WRITE\BIDIRECTIONAL

struct scsi_data_buffer in_sdb;

struct scsi_data_buffer out_sdb;

uint64_t cmd_itn_id;//session->tsih, 即session ID

uint64_t offset;

uint32_t tl;

uint8_t *scb; //SDB,命令描述块

int scb_len; //SDB长度

uint8_t lun[8];

int attribute; //命令属性

uint64_t tag; //itt,initiator task tag

int result;

struct mgmt_req *mreq;

unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];

int sense_len;

struct list_head bs_list;

struct it_nexus *it_nexus; //the I_T nexus is a relationship between a SCSI initiator port and a SCSI target port.

struct it_nexus_lu_info *itn_lu_info;

};程序分析main函数main函数之前在TGT的程序代码中,部分函数被用__attribute((constructor))设置了构造属性。这些函数会在main函数之前执行,通常是做一些环境初始化的工作。让我们看看初始化了一些什么。static void register_bs_module(void) //注册aio bst

static void bs_null_constructor(void) //注册null bst

static void bs_rdwr_constructor(void) //注册rdwr、mmc、smc等bst

static void bs_sg_constructor(void) //注册sg、bsg等bst,注册sg设备类型

static void __constructor(void) //注册sheepdog bst

static void bs_ssc_constructor(void) //注册ssc bst

//上面的这些函数主要是向bst_list链表添加新节点,即后端存储层支持的存储类型

static void mmc_init(void) //注册mmc设备类型

static void osd_init(void) //注册osd设备类型

static void sbc_init(void) //注册sbc设备类型

static void scc_init(void) //注册scc设备类型

static void smc_init(void) //注册smc设备类型

static void ssc_init(void) //注册ssc设备类型

//上面这些函数主要是向device_type_list链表添加新的节点,即TGT支持模拟的设备类型,例如sbc是磁盘

static void iscsi_driver_constructor(void) //注册iscsi驱动,添加节点到tgt_drivers数组

static void iscsi_transport_init(void) //注册iscsi_tcp传输层

static void iser_driver_constructor(void) //注册iser驱动

static void target_constructor(void) //设置global_target全局变量这里涉及到一些全局变量:tgt_drivers,每个节点都代表一种传输层驱动,操作target和lun是--lld参数会指定驱动类型,即此数组表示的驱动。bst_list,链接的每个节点都代表后端存储层支持的一种存储引擎,创建lun的时候会有--bstype的参数,此参数指定lun的后端存储引擎。device_type_list,链接的每个节点都代表tgt支持的模拟的一种设备类型,创建lun的时候会有--device-type的参数,此参数指定lun代表的设备类型。global_target,在account访问控制方面有用,设置到global_target上的策略对所有target有校。至此,在main函数之前,我们的程序就已经配置好后端存储引擎、设备模拟引擎、传输驱动等重要模块。main执行时我们分析main函数的主要执行路径:main|

|->sigaction,信号处理函数的设置

|->getopt_long,参数解析

|->epoll_create,创建epoll句柄,ep_fd

|->ipc_init->|

|->open,lockf,socket,bind,listen创建本地通信socket

|->tgt_event_add,将本地通信句柄加入ep_fd句柄进行异步管理,回调函数mgmt_event_handler

|->log_init,创建日志记录子进程

|->lld_init| 遍历tgt_drivers数据,调用每个元素的lld_init_one函数

|->lld_init_one,调用tgt_drivers结构的init函数

|->tgt_drivers[lld]->init

|->遍历iscsi_transport_list链表,调用ep_init函数

|->iscsi_add_portal,设置默认initiator通信端口3260

|->iscsi_tcp_init_portal

|->socket,bind,listen监听3260端口

|->将socket添加的ep_fd进行异步监听,回调accept_connection

|->将IP,PORT,fd等信息封装iscsi_portal结构,并添加到iscsi_portals_list链表

|->设置nop_work心跳监控任务

|->设置tgt_drivers状态为DRIVER_INIT

|->oom_adjust,nr_file_adjust,调整oom系统参数和文件打开的最多数据

|->work_timer_start,初始化工作管理线程

|->bs_init,为后端存储层创建一个任务处理的基本框架

|->event_loop->|

|-->|->epoll_wait,等待事件

| |->hander

|<--|在对ipc_init函数的执行过程中,我们创建了本地通信socket,并加入epoll进行监听。这是tgtadm与tgtd进行通信的IO路径。在对lld_init函数的执行过程中,我们创建了对3260端口的socket,并加入epool进行监听。这是initiator与target进行通信的IO路径。然后调用epoll_wait,监控所有相关网络事件,并调用hander函数指针。至此TGT已经做好大部分准备工作。IO路径解析变身磁盘我们上面展示了一系列命令,是TGT可以模拟磁盘。下面我们对命令执行路径做一下解析。TGT守护进程与tgtadm命令之间的执行流程:从main函数的执行流程我们知道tgtd响应tgtadm命令的初始函数是mgmt_event_handler,但从图中解释可以看出,实际处理tgtadm命令的任务被一步步转移到mtask_execute函数。mtask_execute在针对不同任务调用不用的*_mgmt函数,后面我们针对创建target和创建lun两个命令具体展开。tgt_target_createtgtadm --lld iscsi --mode target --op new --tid 1 --targetname iqn.2009-02.com.example:for.all实际创建target的时tgt_target_create函数。tgt_target_create |

|->strsep,获取targetname,检测名字是否合法

|->target_lookup,检测targetID是否重复

|->target_name_lookup,检测targetname是否重复

|->get_backingstore_template,获取low level driver默认的后端存储引擎bst

|->zalloc,strdup,申请新的target结构,设置targetname,申请account结构内存

|->设置tid,bst,lid等字段,target_state初始状态为SCSI_TARGET_READY

|->加入target_list全局链表

|->tgt_device_create,创建0号LUN

|->target_lookup,查找target节点

|->device_lookup,检测相应lun是否已存在

|->get_backingstore_template,获取后端存储引擎null

|->device_type_lookup,查找lun0的默认设备类型TYPE_RAID

|->zalloc,申请scsi_lu节点内存,初始化响应字段

|->dev_type_template.lu_init,调用设备类型lu_init函数scc_lu_init

|->spc_lu_init,初始化lu_attrs字段

|->初始化lu->attrs字段version_desc

|->加入target的device_list

|->tgt_driver[lld]->target_create,iscsi驱动层创建iscsi_target

|->malloc,申请iscsi_task结构

|->memcpy,设置session_param默认参数

|->设置tid等字段,加入iscsi_targets_list链表

|->加入iscsi驱动层target_list链表

|->返回成功通过上述流程分析,创建target的实际工作便是:1)创建target结构,2)创建lun0结构,3)创建iscsi_task结构。tgt_device_createtgtadm --lld iscsi --mode logicalunit --op new --tid --lun 1 --bstype rdwr --backing-store /home/linux/disk.img实际创建lun的任务是由tgt_device_create函数完成的。tgt_device_create|

|->strsep,获取参数path,bstype

|->target_lookup,查找target节点

|->device_lookup,检测相应lun是否已存在

|->get_backingstore_template,获取后端存储引擎rdwr

|->device_type_lookup,查找lun的设备类型TYPE_DISK

|->zalloc,申请scsi_lu节点内存,初始化响应字段

|->dev_type_template.lu_init,调用设备类型lu_init函数sbc_lu_init

|->spc_lu_init,初始化lu_attrs字段

|->初始化mode_pages字段

|->bst->bs_init,调用后端存储引擎的bs_init函数,bs_rdwr_init

|->执行存储引擎的初始化工作

|->bs_thread_open,为lun设置工作线程和任务处理函数

|—>tgt_device_path_update,初始化scsi_lu的fd,addr,size,path等字段

|->bst->open,调用后端存储的bs_open函数,bs_rdwr_open

|->执行rdwr的一下初始化工作

|->读取配置文件

|->设置LRU缓存

|->初始化读写任务异步线程

|->加入target的device_list

|->返回成功通过上述流程可以看出,创建lun的工作主要是:1)创建scsi_lu结构体,并挂接到target的device_list链表,2)调用dev_type的初始化函数,设置模拟设备的属性,3)调用后端存储引擎的bs_init函数,为数据存储做好准备。至此,TGT已做好全部准备工作,已经是一个可以对外提供服务的磁盘了。使用磁盘使用磁盘是客户段的事,我们不研究客户端具体实现,只关系initiator与target之间的通信过程,已经target对于REQUEST的具体处理流程。accept_connection是initiator与target通信的接口函数,iscsi_tcp_event_handler执行了具体的通信任务。static void iscsi_tcp_event_handler(int fd, int events, void *data)

{

struct iscsi_connection *conn = (struct iscsi_connection *) data;

if (events & EPOLLIN)

iscsi_rx_handler(conn);

if (conn->state == STATE_CLOSE)

dprintf("connection closed\n");

if (conn->state != STATE_CLOSE && events & EPOLLOUT)

iscsi_tx_handler(conn);

if (conn->state == STATE_CLOSE) {

dprintf("connection closed %p\n", conn);

conn_close(conn);

}

}iscsi_tcp_event_handler函数依据不同的事件类型和connection状态,执行不同的操作。因此对这个函数我们需要按不同事件分布讨论。LOGIN流程分析EPOLLIN代表我们的socket有数据可以读出,即initiator向target发送request。EPOLLIN事件处理的第一步就是读出initiator发送的PDU结构。我们可以把EPOLLING事件分为2类:读写操作类和其他类型(登录、登出等),下面简要描述读取数据的流程(实际根据不同的connection状态,会有更复杂的动作),先重点讲述对登录事件的处理。iscsi_rx_handler|

|->判断header和data是否有摘要,如有下面的读流程需要进行摘要验证

|->do_recv,读取HBS

|->如果有AHB,读取它

|->如果有data,读取

|->cmnd_execute|

|->cmnd_exec_login|

|->登录操作会分两阶段进行,安全协商阶段、参数协商阶段、以及全功能阶段,

|->至少需要两次彼此通信才能完成登录过程。

|->下面我们先给出登录过程的connection状态变化,在细讲代码。

|->(我们已不需要CHAP认证的最简单登录模型讲述)登录过程的connection状态变化完成登录后,connection根据不同的session类型进入了FULL或SCSI状态。SCSI对应于SESSION_NORMAL,即正常的iSCSI读写模式;FULL对应于SESSION_DISCOVERY,即initiator用来发现target的模式。 +-----------------------------------------------------------+

|From To -> | Security | Operational | FullFeature |

| | | | | |

| V | | | |

+-----------------------------------------------------------+

| (start) | yes | yes | no |

+-----------------------------------------------------------+

| Security | no | yes | yes |

+-----------------------------------------------------------+

| Operational | no | no | yes |

+-----------------------------------------------------------+

这是RFC文件列出的可能的login阶段之间的转换关系。正常完成的login最终都会进入到FullFeature阶段。登录过程的IO流程iSCSI协议的登录过程会涉及到用户验证、参数协商等工作,因此这是一个动态、需要多次沟通的过程。我们以一个最简单的模型(无需认证、参数协商一次通过)看看initiator与target之间的IO交互。我们使用wireshark工具捕获iscsi的登录过程。图中可以看出iscsi是经历了两次request和两次response完成的登录。第一次REQUEST是执行安全协商的过程(下一阶段是参数协商)。在data segment段给出了initiator名字、session类型、要登录的target名字、以及认证方法(此处不需认证)。response表面可以进入下一阶段,即参数协商阶段。第二次request,initiator在data segment附带了链接参数。第二次response确认了这些参数,至此完成登录过程。登录过程的处理函数我们再次列举出iSCSI登录过程涉及的函数名称,但不再展开具体路径分析,因为如上所述iSCSI登录是一个动态协商的过程,所涉及的分支多且细,要描述清楚过于复杂,感兴趣的同学还是结合RFC7143标准阅读源码比较好。cmnd_execute:更加REQUEST类型调用cmnd_exec_login。

cmnd_exec_login:实际处理登录任务。

cmnd_finish:负责一部分connection的状态转换。

cmnd_exec_auth:负责安全认证。

text_check_param:负责参数协商。SCSI command流程分析以SCSI command READ10为例,我们分析一下TGT对request的处理路径。首先接收并处理initiator发送的request。----------------------------------------------------------------iscsi 传输层--------------

iscsi_rx_handler|

|->do_recv| 接收新的HBS

|->iscsi_task_rx_start|

|->iscsi_scsi_cmd_rx_start|

|->iscsi_alloc_task| 申请新的task

|->list_add| 加入到session的cmd_list链表

----------------------------------------------------------------iscsi 协议处理层-----------

|->iscsi_task_rx_done

|->iscsi_task_queue| task排队/排序

|->iscsi_task_execute|

|->scsi_set_data_dir|设置方向DATA_READ

|->iscsi_scsi_cmd_execute|

|->iscsi_target_cmd_queue| 设置scsi_cmd结构

--------------------------------------------------------target管理及SCSI协议处理层----------

|->scsi_get_data_dir|

|->set_task_in_scsi|

|->target_cmd_queue|

|->it_nexus_lookup|

|->scsi_get_devid|

|->dev_lookup| 获取Lun

|->target_cmd_perform| 此处是函数指针dev->cmd_perform

|->scsi_cmd_perform| lun的命令执行函数,会执行一些参数检查

-----设备模拟层----------------------------------------------------------------------------

|->sbc_rw|(dev_type_template.ops[READ10].cmd_perform)

|->scsi_set_in_resid_by_actual|设置需要读取数据长度

|->scsi_set_in_transfer_len|设置实际长度

|->scsi_set_in_resid|设置实际长度于期望长度的差值

-----后端存储引擎--------------------------------------------------------------------------

|->bs_thread_cmd_submit|(bst->bs_cmd_submit)

|->list_add_tail|将任务加到后端存储引擎工作队列里

-----target管理及SCSI协议处理层-------------------------------------------------------------

|->target_cmd_io_done| (同步任务需要立即通知IO完成)

-----iscsi 协议处理层----------------------------------------------------------------------

|->iscsi_scsi_cmd_done|(tgt_drivers[].cmd_end_notify)

|->list_add_tail|把task加入到conn->tx_clist链表

-----iscsi 传输层-------------------------------------------------------------------------

|->ep_event_modify|通知epoll添加EPOLLOUT事件的处理准备发送target的处理结构。iscsi_tx_handler|

--------------------------------------------------选择一个task response发送出去-------------

|->iscsi_task_tx_start|

|->list_first_entry|

|->iscsi_scsi_cmd_tx_start|

\-|->iscsi_data_rsp_build| -------------先发送data rsp再发送cmd rsp-----------

\|->iscsi_cmd_rsp_build| -------------先发送data rsp再发送cmd rsp-----------

|->do_send|

|->cmnd_finish|

--------------------------------------------------选择一个task response发送出去-------------

|->iscsi_task_tx_done|

|->iscsi_scsi_cmd_tx_done|

|->list_add| -------------如果数据未发送完,继续发送数据-----------

|->iscsi_free_cmd_task| -------------数据发送完后,执行清理工作-----------

--------------------------------------------------target管理层----------------------------

|->target_cmd_done|

|->iscsi_tm_done|tgt_drivers[lld]->mgmt_end_notify

|->__cmd_done|调用lun的任务完成通知函数dev->cmd_done

|->post_cmd_done| 遍历任务队列,处理enabled的任务

|->scsi_cmd_perform|

|->target_cmd_io_done|

----------------------------------------------------------------iscsi 协议处理层-----------

|->iscsi_free_task| 销毁task

|->list_delete|

|->free_data_buf|

|->free_task|

|->conn_put|SCSI command READ10的response至少通过两次发送给initiator(先发送data resp,再发送cmd resp)。通过多次iscsi_tx_handler发送过程,READ10的命令响应处理完成。NOP流程分析NOP机制可以看作是initiator与target之间的一种ping机制,用于确认这个connection或session是否仍然是存活的。这样一个"ping"既可以由initiator发起也可以由target发起。发起方如果需要回复,就需要在相应的initiator transfer tag或target transfer tag设置不同于0xffffffff的值。initiator发出的NOP包称为NOP-out,target发出的NOP包称为NOP-in。以TGT为例,iscsi驱动的初始化函数iscsi_tcp_init会启动一个定时器,定时调用iscsi_tcp_nop_work_handler。iscsi_tcp_nop_work_handler遍历所有的iscsi链接,向对应的Initiator发送NOP-in,如果长时间收不到响应的NOP-out,则会关闭链接。iSCSI协议结构简介PDU结构 Byte/ 0 | 1 | 2 | 3 |

/ | | | |

|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|

+---------------+---------------+---------------+---------------+

0/ Basic Header Segment (BHS) /

+/ /

+---------------+---------------+---------------+---------------+

48/ Additional Header Segment 1 (AHS) (optional) /

+/ /

+---------------+---------------+---------------+---------------+

/ Additional Header Segment 2 (AHS) (optional) /

+/ /

+---------------+---------------+---------------+---------------+

+---------------+---------------+---------------+---------------+

/ Additional Header Segment n (AHS) (optional) /

+/ /

+---------------+---------------+---------------+---------------+

k/ Header-Digest (optional) /

+/ /

+---------------+---------------+---------------+---------------+

l/ Data Segment (optional) /

+/ /

+---------------+---------------+---------------+---------------+

m/ Data-Digest (optional) /

+/ /

+---------------+---------------+---------------+---------------+这是iSCSI协议标准的PDU格式,所有的通信包都要符合这个套路。其中BHS是必须的,其他都是可选的。整个PDU包按4字节对齐。HBS Byte/ 0 | 1 | 2 | 3 |

/ | | | |

|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|

+---------------+---------------+---------------+---------------+

0|.|I| Opcode |F| Opcode-specific fields |

+---------------+---------------+---------------+---------------+

4|TotalAHSLength | DataSegmentLength |

+---------------+---------------+---------------+---------------+

8| LUN or Opcode-specific fields |

+ +

12| |

+---------------+---------------+---------------+---------------+

16| Initiator Task Tag |

+---------------+---------------+---------------+---------------+

20/ Opcode-specific fields /

+/ /

+---------------+---------------+---------------+---------------+BHS基本包头结构I:指示REQUEST是否需要立即执行(无需加入队列)。Opcode:指示这个PDU包的类型,定义如下/* Initiator Opcode values */

#define ISCSI_OP_NOOP_OUT 0x00

#define ISCSI_OP_SCSI_CMD 0x01 //封装SCSI命令描述符块CDB

#define ISCSI_OP_SCSI_TMFUNC 0x02 //SCSI任务管理请求

#define ISCSI_OP_LOGIN 0x03 //登录请求

#define ISCSI_OP_TEXT 0x04

#define ISCSI_OP_SCSI_DATA_OUT 0x05 //DATA-out,写操作

#define ISCSI_OP_LOGOUT 0x06

#define ISCSI_OP_SNACK 0x10

/* Target Opcode values */

#define ISCSI_OP_NOOP_IN 0x20

#define ISCSI_OP_SCSI_CMD_RSP 0x21 //包含SCSI状态和可能的检测信息或其他响应信息

#define ISCSI_OP_SCSI_TMFUNC_RSP 0x22

#define ISCSI_OP_LOGIN_RSP 0x23

#define ISCSI_OP_TEXT_RSP 0x24

#define ISCSI_OP_SCSI_DATA_IN 0x25 //DATA-in,读操作

#define ISCSI_OP_LOGOUT_RSP 0x26

#define ISCSI_OP_R2T 0x31 //Ready To Transfer (R2T) - sent by target when it is ready to receive data

#define ISCSI_OP_ASYNC_EVENT 0x32

#define ISCSI_OP_REJECT 0x3f //拒绝命令F:When set to 1 it indicates the final (or only) PDU of a sequence.Initiator Task Tag:用于唯一标识一个initiator的标记,其中0xffffffff是保留给NOP-In使用的。struct iscsi_hdr {

uint8_t opcode;

uint8_t flags; /* Final bit */

uint8_t rsvd2[2];

uint8_t hlength; /* AHSs total length */

uint8_t dlength[3]; /* Data length */

uint8_t lun[8];

uint32_t itt; /* Initiator Task Tag */

uint32_t ttt; /* Target Task Tag */

uint32_t statsn;

uint32_t exp_statsn;

uint32_t max_statsn;

uint8_t other[12];

};TGT使用iscsi_hdr表示BHS结构。BHS(SCSI Command) Byte/ 0 | 1 | 2 | 3 |

/ | | | |

|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|

+---------------+---------------+---------------+---------------+

0|.|I| 0x01 |F|R|W|. .|ATTR | Reserved |

+---------------+---------------+---------------+---------------+

4|TotalAHSLength | DataSegmentLength |

+---------------+---------------+---------------+---------------+

8| Logical Unit Number (LUN) |

+ +

12| |

+---------------+---------------+---------------+---------------+

16| Initiator Task Tag |

+---------------+---------------+---------------+---------------+

20| Expected Data Transfer Length |

+---------------+---------------+---------------+---------------+

24| CmdSN |

+---------------+---------------+---------------+---------------+

28| ExpStatSN |

+---------------+---------------+---------------+---------------+

32/ SCSI Command Descriptor Block (CDB) /

+/ /

+---------------+---------------+---------------+---------------+

48/ AHS (optional) /

+---------------+---------------+---------------+---------------+

x/ Header-Digest (optional) /

+---------------+---------------+---------------+---------------+

y/ (DataSegment, Command Data) (optional) /

+/ /

+---------------+---------------+---------------+---------------+

z/ Data-Digest (optional) /

+---------------+---------------+---------------+---------------+CmdSN:命令序列号,initiator发出的命令是排序的,这样在同一个session有多个connection的情况时,命令可以顺序被执行。ExpStatSN:代表ExpStatSN-1的response序号已经接收到了,即通知target可以继续发送其他序号的response了。Expected Data Transfer Length:是本次命令相关传输的数据长度。(这个字段解释比较繁琐,可详见RFC7143)还有更多的数据结构,可以参照RFC7143标准。总结一开始,我们简要介绍了一下TGT涉及到的基本协议概念;然后我们知道TGT可以使我们的计算机对外提供块存储服务;再然后我们的关注点转移到TGT如何对外提供块存储的。为了研究这个问题,我们首先简述了一下TGT的基本框架结构和一些关键数据结构;然后从代码入手,分析程序执行流程,IO调用路径。最后,我们简单的引出了iSCSI协议的PDU基本结构。如果大家想要研究清楚iSCSI协议还是需要从RFC标准入手的(第一手资料才是最有价值的)。作者能力有限,难免存在错误和疏漏,欢迎大家指正。本文参考了很多文章,不一一列举了(如有侵权欢迎指出):RFC7143标准…………编辑于 2020-04-30 18:23存储技术数据存储(广义)​赞同 28​​6 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录存

如何评价第一季的《The Grand Tour》? - 知乎

如何评价第一季的《The Grand Tour》? - 知乎首发于节操卓的车世界切换模式写文章登录/注册如何评价第一季的《The Grand Tour》?曾颖卓汽车领域无一精通,知识储备达到吹牛级别你大爷还是你大爷,三贱客的舞贱的贱法还是举世无双。全文完。可以去点赞了。时间、地点、方式、节目名字什么的都不重要,唯一重要的是还有这三竿老炮儿一起侃大山,三个老男孩还能使劲儿折腾车、恶搞人。就像集齐七颗龙珠就能召唤神龙实现愿望,集齐三贱客就能碰撞出世界上最举世无双的汽车娱乐节目。(是的,我无比同意YYP的观点,三贱客做的不是汽车评测节目,而是以汽车为载体的娱乐节目)TGT仅仅用了第一集,就把自己的口碑刷爆了(当然,这一集的制作经费也是最土豪的),后三贱客时代的《Top Gear》秒变反面教材。而这第一集,也仅仅用了前面的五分钟,就抓住了我的心。阴雨绵绵的英国,隐喻着JC在阴霾里出走BBC。不列颠的阴霾越不过大西洋,乘上飞往大西洋彼岸的飞机,落地。这个方向盘装错位置的国度,阳光灿烂,亚马逊用上扬的嘴角迎来大猩猩。不知道哪里来的野马,尽情地飞驰在美国加州那一望无垠的路上。没有压抑,只有欢脱,身后再现出两辆野马,是谁在开车,你我已经心中有数。互相挥手问好,一个略贱的笑容,一个意味深长的点头,三个患难诤友,共同进退,心照不宣。“哥俩好啊,对不起害你们跟我一起逃亡到美国来了。”“来啊,互相伤害啊”“请继续多多指教,除了我的衣着品味”。卧槽,走心走得如此猝不及防。想起大学那些年一起追TG的基友们,你们看到这一幕,有没有想到兄弟我?他们用我们熟悉的方式重聚,仿佛他们的节目没有断档过一样;然而相比起上一次三贱客同台作秀,三个人脸上岁月的痕迹却也分明了许多。一面是人设无缝对接,一面是岁月神偷犯案,竟给我这三个人一夜白头的错觉。这一段的节奏和情节把握都非常棒,向过去挥手,去新单位报到,再向美国汽车文化致敬。接下来的三神PK太极拳,也挥得相当溜。加速测试,三台车互有胜负,最后强行甩锅给鞋子。(鞋子梗在第13集又重温了一遍)不要以为三贱客在玩玄学,互有胜负,一方面避免了一场公关浩劫,另外看似荒诞喜剧的结论,又满足了观众。看似玩世不恭的三个大男孩,实则对节目把控的能力是很高深的。车坛真正的“三神”,不是三神车,而是三贱客。在某种程度上,即便是BBC时代的《Top Gear》,即便那时候JC已经口无遮拦,但BBC毕竟是国家级的电视台,三贱客只能是在一个框架内“相对自由地”打嘴炮,例如JC大嘴巴涉嫌发表歧视卡车司机的言论,就要吃BBC的行政处罚。可是来到完全由自己主导的TGT,三位的观点、选题的角度,又更加辛辣和犀利了。例如三个人假装自己是环保人士,各自打造一辆环保汽车那一集。最后的结果,植物车自燃、牛肉车长蛆,船长“砖”车散架,就为了证明对环境友好的汽车,是打保护环境之名,行破坏环境之实。环保车瞎扯淡,这么政治不正确的选题,让我们这些“Petrol head”们看得很爽。再如喷限速、喷新能源车的免税政策,无处不黑,到处惹火,放在BBC时代能做得这么露骨?打个问号。究竟《Top Gear》的成功是由于BBC的精良制作和包装,还是三贱客的碰撞?看完上一个季度的新世代TG和第一季的TGT,我想所有人都知道答案了。TGT之于TG,似乎变了,又似乎什么都没变,只是将三贱客时代的TG换了一个名字,换了一个东家,节目的框架、形式、桥段、日常吐槽,都有浓烈的TG影子。就连“埃博拉病毒赛道”的最后两个弯,也都是直角弯,冲线时还是能找到TG跑赛道冲线时的神韵,我个人觉得这是节目组故意保留的一种来自老TG的“仪式感”。不少人对此的看法是“三贱客已经很难有所创新了,都是新瓶装老酒”,有点审美疲劳了。不过我对此倒是没什么意见。毕竟对于三贱客的粉丝来说,三贱客互相斗嘴、互黑、捉弄对方,就是三贱客的魅力所在。产生出来的化学反应,有时候火星四溅,有时候七荤八素,就算玩一千年,都还是很有看点。这就像一个歌手,就算换了一家唱片公司,包装、歌路也许会调整一下,还会接拍些电影、MTV什么的,但唱歌这个老本行是不会丢的。别人成不了三贱客,也许换一个角度,三贱客也成不了别人。《Grand Tour》好不好看?挺好看的。TGT是不是老套路?是挺老套路的。TGT有没有创意?如果你觉得保持一种惯有的节目形式就是没有创意,那TGT确实没有创意;如果你觉得能在惯有的框架里面,还能不断头脑风暴出一些新点子让人看着有新鲜感,可以叫做有创意,那TGT就有创意。好了,最后,我想对TGT说的是:好久不见,想死我了,你们还真是一点都没变呢。编辑于 2017-02-06 12:03Top Gearthe grand tour汽车​赞同 576​​44 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录节操卓的车世界聊车,有很多种方式,有一种叫节

TGT第三季三贱客中国大世界之旅回顾_哔哩哔哩_bilibili

TGT第三季三贱客中国大世界之旅回顾_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿TGT第三季三贱客中国大世界之旅回顾

10.4万

94

2018-07-27 23:40:26

未经作者授权,禁止转载1483515374-影视预告·资讯花絮三贱客TGT

潮杨汐客

发消息

商务合作+v:jesea_yeung

关注 1.2万

最流畅的高清对局,最纯正的爽感枪战

接下来播放

自动连播当哈蒙德被问到TG被砍时老旧的GTR

12.0万

57

大世界之旅 沙漠行动 将于2月16日播出不靠谱实验室

6.9万

155

【实拍】TGT三贱客重庆实拍视频片段合集潮杨汐客

4807

2

【TGT】The Grand Tour 第三季到法国录制节目,粉丝拍摄合集潮杨汐客

7067

14

大世界之旅最新铁幕特辑01诺妍影视

2875

4

被甄嬛传幕后花絮笑死,陈建斌 :救命啊导演!蔡少芬的普通话真的很难不笑!bili_52757973703

6.8万

32

三贱客vs一菲(熬夜下饭必备)喵呜社呦

502

0

来个失败的花絮我叫王小丫

2.9万

1

新花絮~是小废物喽_

2603

0

疯狂三贱客 罗宾三蹦子 1小肥羊爱追片

1375

0

【Top Gear】三贱客在节目中大笑合集潮杨汐客

2004

2

【三贱客】恭 喜 发 财ZN-Channel

1.6万

52

你觉得加一箱油如何才能跑到1207公里?诺妍影视

2.7万

9

【TGT】让TGT三贱客来给你变魔术吧!潮杨汐客

446

0

失去的不止是青春light-小七

2624

1

【TGT】盘点詹尼佛·克拉克森(大猩猩)的爱车以及2018年的房子潮杨汐客

5442

45

如果让三贱客不搞笑录制一期特辑会是什么体验?诺妍影视

5194

3

三贱客的“廉价”超跑之旅爆笑连连dy小玲追剧

5341

1

理查德·哈蒙德父女博客节目《当下的我们》最新预告片(中字)inct_

4994

3

三贱客的沙漠之旅正式完结,而当我们与他们再次相见的时候,也就到了三人在大世界之旅中真正完结的时刻dy小玲追剧

6063

2

展开

小窗

客服

顶部

赛事库 课堂 2021

如何评价 The Grand Tour? - 知乎

如何评价 The Grand Tour? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册汽车电视节目Top Gear如何看待/评价TAthe grand tour如何评价 The Grand Tour?《The Grand Tour》是一档即将上映的、由亚马逊视频制作的汽车节目。英国广播公司的《英国疯狂汽车秀》(Top Gear)的主持人与亚马逊视频…显示全部 ​关注者1,079被浏览560,734关注问题​写回答​邀请回答​好问题 5​3 条评论​分享​117 个回答默认排序莫桑​人生这么短,又那么长。​ 关注大家好,期待已久的THE GRAND TOUR第三季中国特辑开了!!!!!!!地址在这里点击我过去然后,我再发个小彩蛋,喜欢请个点赞呗!https://www.zhihu.com/video/1079890239354441728-分割线-Breaking news!!!三贱客贵州拍摄现场,再一次!出现了!三蹦子以下三蹦子图片不是我拍的,源头请看水印-------------原回答------------------------------------------------------------------------------------------------------------------------今儿见到了野生的船长和大猩猩!重庆今天42℃,大猩猩在烈日下拍了一个多小时的红旗L5静态,真是敬业!后尾行至酒店,没一会儿船长下楼抽烟,我们围上去,他一一和我们握手,签名,拍照!和镜头里的一样nice!图片是我和当日搭我车尾随的小伙伴拍的看大家都有兴趣,我就更新一下图片!编辑于 2019-02-15 23:56​赞同 782​​202 条评论​分享​收藏​喜欢收起​匿名用户憋了几个月终于能说话了。八月底的时候 Amazon 在网站上举行了一个抽签活动,所有Prime 会员都有机会参加TGT在加州的摄影。经过一轮很没有诚意的电话面试,我抽到了第二天棚内摄影的票,就屁颠屁颠跑去瞻仰了。在棚内的拍摄其实相当的......无聊。可能是因为加州这集要首播的缘故,Andy跟三剑客还是沿用了以前Top Gear的经典模式,而拍摄的过程也跟看成片的过程几乎没有分别,无非中间多了不少重摄而已。所以现场观众的反应都是真的,惊喜也全然发自内心;至于有没有被编辑剪进去,或者用的是重摄,那就只有天知道了。。。(看到那谁掉下来的时候我们都吓了一跳了,哈!)吐槽一句,以前看TG一直以为忘词大王会是May,结果Clarkson第一集出了不少洋相,到最后用的那一条还是可以看得出磕磕绊绊(闭着眼睛都可以猜出来是哪一段)。而Hammond的水平还是比较溜,人也比较年轻,几乎都是一遍过。相比之下,片头的拍摄是High很多的。不但有现场Burning Man风格的演唱会,拉风豪车和飞行表演,最早被大巴拉去的一拨人还跟三剑客搭上话要到了签名;而我们站棚的除了提前看到第一集的内容之外,完全没有互动。我站在了一圈观众的最外面,各种被挡角度,Clarkson还好说,Hamster完全是看不到的。←_←不过据一个朋友说他们拍片头从早上七点一直站到了晚上,在沙漠中被暴晒被沙尘刮到忧伤。豪车入场的镜头看起来相当拉风,但没拍一次就得默默等到风尘安定也是很蛋疼的。中间应该还有不少片段,不是被剪掉了就是留着下一场用。毕竟花了360万美刀,亚马逊爸爸再有钱也得疼一下。----------------------下面是关于第一集的感想---------------------------摄影现场除了片头是头一天拍得还看不到,之后所有的剧情和短片都跟播出版没有区别。我记得当时看完后,还是有点小小的忧伤的。这一集,还是太像Top Gear了。虽然三神车终聚首很是弥补了去年戛然而止的悬念,从模式上来说,这一集和之前毫无区别。而失去了Stig和熟悉的赛道,美国佬和新土路能不能很好的顶上来还是未知数,但至少从喜剧效果上却好像缺了一些东西。毕竟美国人这个梗,新·新Top Gear都已经用烂了。效果?呵呵……而今天完整的看到成片以后,我意识到当时忧伤的来源了。两个字,套路。不得不说Andy跟Clarkson还是很牛逼的,从片头就可见一番。阴暗潮湿的伦敦,令人压抑的广播,黯然的离别,转换到阳光明媚的加州,好基友追随,最后拥抱无数激情洋溢的粉丝们,再搭上恰到好处的那首 I can see clearly now,相信不少粉丝都眼角湿润了。尤其是三个人在车里相视而笑的时候,感动。可惜这些情绪到了正片就又被那熟悉的套路感给冲淡了。其实近几年的Top Gear这种中庸的集数越来越多,虽然新鲜感消失对于一个已经坚挺了几十年的节目也是无可奈何,但当我听到三人不再续约Top Gear转战亚马逊的时候,心中其实是有窃喜的。我以为,他们终于可以抛开包袱,二次创业再创人生高峰。结果第一集并没有让我感到欣慰以外的激动。可能是因为距离之前三人介绍三神车的时间太久,也有可能是因为要和BBC做好切割,这一集第一段的铺垫着实太长;再加上介绍新赛道和新车手的时间,真正的看点可能只集中在最后那一段结果颁布之时。新闻回来了,很好。其实三个人插科打诨一小时不讲别的就聊新闻我也会很开心看下去的,所以死心觉得如果时间能拉长点就更好。明星开破车没有了,这个环节用摔人的方式带过去还挺好笑,只是这么一来第一容易疲劳,第二赛道和美国佬相比于以前的Stig出镜和连结就更少了,会不会成鸡肋?Top Gear的高峰重来都是三人的奇幻冒险。第一集虽然波澜不惊老调重弹,好歹是回来了。重装出发的Grand Tour又会有什么样的惊喜?只能拭目以待了。发布于 2016-11-18 18:53​赞同 221​​17 条评论​分享​收藏​喜欢

TGT 三贱客玩游戏_哔哩哔哩_bilibili

TGT 三贱客玩游戏_哔哩哔哩_bilibili 首页番剧直播游戏中心会员购漫画赛事投稿TGT 三贱客玩游戏

4461

12

2020-04-12 00:40:30

未经作者授权,禁止转载75136210点赞支持一下 最好投个币哦汽车汽车生活汽车生肉大猩猩TGT鼹鼠龟速船长三贱客THEGRANDTOUR

朽年F

发消息

还有机会

关注 115

最流畅的高清对局,最纯正的爽感枪战

接下来播放

自动连播熟肉TGFT S01E12朽年F

2158

3

TGT The.Grand.Tour.S01E02朽年F

622

6

The.Grand.Tour.S01E01朽年F

2106

5

三贱客之特种部队无限卡bug流dy小玲追剧

1140

2

TGT The.Grand.Tour.S03E01朽年F

7799

0

TGT熟肉高清The.Grand.Tour.S01E11中英字母朽年F

7121

9

【切片/reaction】ZN娘看三贱客最新特辑,全程爆笑ZN-Channel

2.0万

173

三贱客开着他们口中的“廉价”跑车,很老六的跑去了市中心吸睛dy小玲追剧

5592

0

三贱客制造的老年人代步客堪称一绝,坐上去直接就能自曝解体dy小玲追剧

1333

3

三贱客的“廉价”超跑之旅爆笑连连dy小玲追剧

5341

1

三贱客的驾驶着拖挂式房车的旅行,简直不要太过于悲催dy小玲追剧

1967

1

你觉得长途旅行是开车的快还是开船的快dy小玲追剧

2285

1

疯狂三贱客 罗宾三蹦子 1小肥羊爱追片

1375

0

水上摩托艇和陆地上的跑车,你认为哪一个速度最快dy小玲追剧

1346

0

TheGrandTour S05E03 手沙特辑:Outro我自己的工作间

14.5万

433

"大猩猩:我可以开燃油车直到我死为止"Ekko丶Car

7336

0

疯狂三贱客 极速挑战 2小肥羊爱追片

431

0

疯狂三贱客 极速快递小肥羊爱追片

1207

0

疯狂三贱客小肥羊爱追片

1087

1

三贱客在缅甸参加了一场本地头目举办的盛大派对dy小玲追剧

2235

1

展开

小窗

客服

顶部

赛事库 课堂 2021

塔吉特公司(TGT)股票股价,实时行情,新闻,财报,研报评级_新浪财经_新浪网

塔吉特公司(TGT)股票股价,实时行情,新闻,财报,研报评级_新浪财经_新浪网

财经首页 | 新浪首页 | 新浪导航

财经首页

美股首页

滚动

评论

美股列表

中国概念股

美股行情中心

美股自选

退出

您好! 请登录

北京DD日 H:M:S | 美东DD日 H:M:S

新浪财经 > 行情中心 > 美股 >

零售 >

塔吉特公司

行情

新闻

中概股财报

TGT导航

行情

该浏览器不支持Flash版行情。

HTML5版行情

HTML5版行情支持火狐、谷歌等最新版本浏览器。

图片版行情

历史价格

期权

空仓

股价提醒

新闻资讯

公司新闻

公司研究

SEC Filings

电话会议

中概股财报

股东

主要股东

内部人交易

财务

资产负债表

利润表

现金流量表

分红派息

相关信息

公司简介

高管

董事会

零售行业

中国概念股

塔吉特公司 NYSE:TGT

Target Corp.

添加自选

在APP中查看

普通版

极速版

盘后 :

@hourTradingPrice@ @hourTradingChange@(@hourTradingChangeP@%)

成交量:@hourTradingVolume@

@hourTradingDateTime@

使用极速版请先登录登录,极速版行情更新速度比标准版快若干倍。为达到更好的体验,建议使用火狐、谷歌等最新版本浏览器。

详细行情

基本面摘要

开盘:

@open@

前收盘:

@preClose@

市盈率:

@pe@

市值:

@totalShare@

成交量:

@volume@

区间:

@low@-@high@

每股收益:

@eps@

股本:

@shares@

10日均量:

@averageVolume@

52周区间:

@low52@-@high52@

贝塔系数:

@beta@

股息/收益率:

@dividend@/@income@

行情对比:

大盘指数

纳斯达克

道琼斯

标普500

当日

5日

日K

周K

月K

当日

5日

收盘线

日K

周K

月K

YTD

5分

15分

30分

最近访问股

自选股

名称

最新价

涨跌幅

以下为热门股票

查看自选股请先

登录

名称

最新价

涨跌幅

添加股票

公司资讯

(03-07 16:54)微盟终止潜在业务重组后又瞄上了短剧赛道,是否能挖到新业务增长点?(03-07 15:02)倩碧痤疮治疗产品发现致癌物质 雅思兰黛股价应声下跌(03-07 00:00)江苏龙蟠科技股份有限公司 关于对外担保的进展公告(03-06 23:24)摩根大通:将塔吉特的目标价从165美元上调至190美元,维持“增持”评级。(03-06 21:20)微盟集团:战略性投资并购短剧公司拌饭科技(03-06 21:17)微盟集团(02013.HK)拟收购拌饭科技约53.5%股权布局短剧赛道(03-06 21:13)微盟集团(02013)拟以股权转让的方式获得拌饭科技约24.4%股权并以2500万元对其进行增资(03-06 20:57)融创中国:今年前两个月销售额约64.9亿元

(03-07 20:22)

受亮丽财报提振 量子之歌盘前大涨15%

(03-07 20:03)

量子之歌2024财年Q2营收9.805亿元人民

(03-07 20:01)

苹果封杀Epic Games开发者账户 欧盟介

(03-07 19:56)

看图:B站发布2023年第四季度及全年财报

(03-07 19:52)

英特尔或将获35亿美元政府补贴 为美国军方生产

(03-07 19:38)

英伟达股价频创纪录之际 两名董事近日出售了约1

(03-07 19:08)

房地产危机重压下 德国银行PBB停止派息

(03-07 18:47)

埃克森美孚挥起裁员大刀,年内第一刀砍向低碳业务

更多

(03-06 18:26)广联工程控股(01413)拟认购湖南芒果云播文化传媒600万元的注册股本(03-06 09:59)塔吉特推出即日送服务 今年美国零售市场有望好转(03-06 08:32)美国零售巨头塔吉特2023财年收入录得7年来首次下滑(03-06 08:00)厦门钨业拟收购中投老挝矿业90%股权 聚焦三大核心业务净利增超10%(03-06 08:00)安晋城|股权并购的瑕疵救济(03-06 07:35)隔夜美股 | 三大指数齐跌 科技股成为最大拖累 比特币历史新高后崩跌近万美元(03-06 05:53)海南海汽运输集团股份有限公司 关于本次发行股份及支付现金购买资产 并募集配套资金暨关联交易方案调整的 公告(03-06 05:53)海南海汽运输集团股份有限公司 第四届监事会第十九次会议决议公告

展开网友评论

收起网友评论

多空看板

买入

增持

持有

减持

卖出

网友评论

您好,

您好,发言请先进行微博授权

已有1360条评论,共有1217人参与

还可以输入137个字符

到 微博 查看您的发言

更多...

可能感兴趣的人

换一换

认证微博

关注TGT的好友

(@num@)

上一页 下一页

关注TGT的还关注

名称

最新价

涨跌幅

更多网友正在看

名称

最新价

涨跌幅

正在查看当前页的好友

美股行情(含NASDAQ、NYSE、AMEX)为实时行情,由纳斯达克提供。沪深股市、港股、外汇、黄金、原油等行情均为实时行情;其他市场指数行情至少延时15分钟。新浪财经免费提供的行情数据以及其他资料均来自合作方,仅作为用户获取信息之目的,并不构成投资建议。新浪财经以及其合作机构不为本页面提供的信息错误、残缺、延时或因依靠此信息所采取的任何行动负责。市场有风险,投资需谨慎。

客户服务热线:4000520066  

欢迎批评指正

常见问题解答

互联网违法和不良信息举报 

新浪财经意见反馈留言板

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 通行证注册 | 产品答疑新浪公司 版权所有

新浪财经免费提供股票、基金、债券、外汇等行情数据以及其他资料均来自相关合作方,仅作为用户获取信息之目的,并不构成投资建议。新浪财经以及其合作机构不为本页面提供信息的错误、残缺、延迟或因依靠此信息所采取的任何行动负责。市场有风险,投资需谨慎。

用户名:

密  码:

记录登录状态一个月

登录

找回密码

登录帮助

还不是新浪会员?

新用户注册

×

Attention Required! | Cloudflare

Attention Required! | Cloudflare

Please enable cookies.

Sorry, you have been blocked

You are unable to access investing.com

Why have I been blocked?

This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.

What can I do to resolve this?

You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.

Cloudflare Ray ID: 860ae9eba815e540

Your IP:

Click to reveal

49.157.13.121

Performance & security by Cloudflare