赞
踩
IP协议工作在网络层,网络层处于传输层之下,从而向传输层提供最基本的端到端的数据传送服务;
在TCP/UDP协议的学习中,了解到了双方通信发送数据由操作系统完成,这个通信过程依靠的就是网络层(以及网络层之下的各层),网络层在复杂的网络环境中确定一个合适的路径;
因此,IP协议提供了一种能力,一种能将数据从主机A传输到主机B的能力: 通过选择合适的路由,使源主机运输层所传下来的数据包最终能够交付到目的主机的能力;
传输层的TCP协议提供了可靠性,而网络层的IP协议提供的则是将数据可以从A主机传到B主机的能力,它只是尽可能快地把分组从源结点送到目的结点!,不提供可靠性,丢包什么的,传输层来决策(重传等机制);
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4;(IPV6尚未普及)
4位头部长度(header length): IP首部的长度是多少个4字节, 也就是 length * 4 的字节数(与TCP首部长度类似). 4bit表示最大的数字是15, 因此IP头部最大长度是15 *4 = 60字节; -->解决了如何将报头和有效载荷分离的问题
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).;4位 TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本.;这四者相互冲突, 只能选择一个.;对于 ssh/telnet这样的应用程序, 最小延时比较重要; 而对于ftp这样的程序, 最大吞吐量比较重要,那么这个服务类型应根据具体的应用场景选择.
16位总长度(total length): IP数据报整体占多少个字节.
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 如果直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型; —>解决了有效载荷交付给上层哪一协议的问题
;
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏(与TCP校验和类似)
32位源地址和32位目标地址: 表示发送端和接收端.
选项字段(不定长, 最多40字节): 略
第三行的三个陌生信息,下面进行详细讲解:(网络分片和组装)
为什么要进行分片?
网络层搞定了A传输到B的能力后,还是需要靠下层数据链路层传送,而链路层有最大单元约束MTU;那么一个IP报文超过这个大小(普遍为1500字节),就需要被分片传送到对端,对端再组装好进行使用;
显然这个分片的过程不仅增加了空间成本(一个ip报文通过切分正文内容,分成若干个带首部的完整的ip报文);而且分的子报文越多,丢包风险就越大,保证可靠性的TCP协议甚至不知道下层你IP协议分片,有一个包丢了,那么为了可靠性,tcp会决定重传整个报文,显然效率很低,所以分片/组装机制一般不使用(少数情况用);
分片详解:
假设我们有IP报头(20)+有效裁荷(2980) 大小 = 3000字节,显然超过了1500字节,那么需要分片,且最少分成三片(两片的话,再带上两个首部最大3000字节,而实际2980+20*2 = 3020字节,装不下);
可以看到3个分片各自报头内的三个字段对应如下:
如果对端读到IP报文的3位标志位为001(代表报文结束标志),**且13位片偏移为0,**那么这个IP报文没有被分片,直接使用就行;
如果在对端检测到分片了,那么就需要组装之后再使用,组装过程按照13位片偏移升序,再验证一下当前片的偏移地址是不是上一片的偏移量+当前片的报文大小(理应对的上,防止中间某片丢包),否则丢包,tcp可靠性,重传;
验证第一个分片丢没丢:看升序排好后第一个分片的13位片偏移是不是为0
验证最后一个分片丢没丢:看升序排好后最后一个分片的3位置标志是不是001(分片结束标志)
在介绍IP协议之前,我们知道IP地址为网络地址 + 主机地址,即确定了某个网段上的某台主机。
因此通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同;
那么怎么样才算合理划分呢?人为的手动设置网络号和主机号不就很麻烦了?
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器
过去曾经提出过一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示:
但是,随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
A类一个子网内能分出24位存主机号,可是网络号只有7位,然而实际网络架设中, 不会存在一个子网内有这么多主机的情况. 因此大量的IP地址都被浪费掉了
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):
下面举两个划分子网的例子:
划分子网的例子1:
划分子网的例子2:
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0
动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
NAT技术(后面会重点介绍);
IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及。
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都 可以,但是RFC 1918规定了用于组建局域网的私有IP地址
包含在这个范围中的, 都称为私有IP, 其余的则称为全局IP(或公网IP);
公网IP跟国内三大运营有关。
我们国内的三大运营商(电信,移动,联通)通过组件基础设施–硬件(基础硬件的铺设)和软件(网络的划分),形成国内的广域网。而国内的广域网是划分好的,互联网公司在每个运营商旗下一定会隶属于其中一个子网范畴。
eg:这样,不管我们用的是电信还是移动的流量,都能通过运营商 与 互联网公司旗下的服务器进行交互(通过其公网IP地址);可见,运营商相当于路,用户和互联网产品相当于两地,有了路,两地才能进行交流沟通,否则一切皆是空谈;
路由是指在复杂的网络结构中, 找出一条通往终点的路线。
路由的过程, 就是这样一跳,一跳(Hop by Hop) “问路” 的过程.
所谓 “一跳” 就是数据链路层中的一个区间.,后续详讲
具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
IP数据包的传输过程也和问路一样:
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;
- 路由表可以使用route命令查看;
- 如果目的IP经过子网掩码的&操作之后,命中了路由表中的IP, 就直接按规则转发即可;
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
假设某主机网络接口配置及路由表如下:
- 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络;
- 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络**,不必经路由器转发,而直接发送接口转发**;
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
- 首先和第一行的子网掩码255.255.255.0做与运算得到192.168.56.0,与第一行的目的网络地址192.168.10.0不匹配,
- 再和第二行的子网掩码做与运算,也为192.168.56.0,与第二行的目的网络地址192.168.56.0匹配,因此由eth1接口直接发送出去
- 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发送到目的主机,不需要经路由器转发。
转发过程例2:如果要发送的数据包的目的地址是202.10.1.2
- 依次与路由表前几项对比,发现都不匹配
- 按缺省default路由条目,由eth0接口发出去,发往192.168.10.1路由器
- 由192.168.10.1路由器再根据它的路由表决定下一跳地址
路由表生成算法:路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由).
常见的生成算法有:距离向量算法, LS算法, Dijkstra算法等。本文不作详细介绍,读者可以自行了解。
ICMP协议是一个网络层协议,一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因;
ICMP正是提供这种功能的协议; ICMP主要功能包括:
ICMP报文格式(简单了解):
ICMP大致分为两类报文:
一类是通知出错原因
一类是用于诊断查询
ICMP协议报文中类型大致分为以下内容:
ping命令底层就是基于ICMP协议来测试网络连通性;
注意,这里ping + 域名,而非url,一个域名可以通过域名解析协议解析成IP地址。
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
ping命令会先发送一个 ICMP Echo Request给对端.
对端接收到后,会返回一个ICMP Echo Reply.
-
在面试中面试官可能会问telnet是23端口, ssh是22端口, 那么ping是什么端口?
ping底层基于ICMP协议,属于网络层的协议,不是传输层,自然就没有所谓的端口号了;
端口号是传输层与应用层之间的联系,与网络层无关,网络层不关注端口号,网络层有协议号;
traceroute命令也基于ICMP协议,能够打印出可执行程序主机, 一直到traceroute的目标主机之前经历多少路由器。
传输层提供了传输的可靠性保证,网络层提供了从主机A找到主机B的能力,那么再下一层数据链路层则是数据传输的具体执行;
数据链路层是我们介绍的TCP/IP协议结构模型中的最后一层,用于两个设备(同一种数据链路节点)之间进行传递,一帧一帧的跳过去,属于计算机网络体系的底层.
任何东西传输都需要介质,物理层的线路是由传输介质(光纤等)与通信设备组成,而物理层面的传输是有误差的,因此引入数据链路层在物理层之上,采用差错检测、差错控制和流量控制等方法,向网络层提供高质量的数据传输服务;
有了数据链路层,就不需要关注底层物理层使用哪种传输介质or通信设备传送数据了;
总结来讲:数据链路层是向网络层提供高质量的数据传输服务
我们经常使用电脑看到自己的宽带连接显示的是以太网,这是一种技术标准,由于已十分普遍,厂商默认将具有唯一mac地址的以太网网卡嵌入计算机主板中了;
“以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的 内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
例如: 规定了网络拓扑结构,访问控制方式, 传输速率等; 以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
以太网的帧格式如下:
IP地址描述的是路途总体(A去往B)的起点A和终点B
MAC地址描述的是路途上的每一个区间(A与B之间相邻站)的起点和终点;
MTU为最大传输单元(Maximum Transmission Unit),相当于发快递时对包裹尺寸的限制.
这个限制是不同的数据链路对应的物理层, 产生的限制,是包或帧的最大长度,一般以字节记;
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
- 最大1500字节称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的MTU是不同的;
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包;(IP层详细介绍过)
- 将较大的IP包分成多个小包, 并给每个小包打上标签; 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为,否则置为1);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层; 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败.
- 但是传送失败后IP层不会负责重新传输数据,这是传输层TCP需要做的;这也就是为什么说IP协议是不可靠的。
我们知道UDP协议是不可靠的,也就是说UDP协议只管将数据发送出去,而不管对端是否接受到;
- 因为层层封包,那么一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这么多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败.;那么这就意味着, 如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了.
让我们再回顾一下TCP协议:
- TCP的一个数据报也不能无限大, 还受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值. 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
–>体现了TCP的分包优化ip分包导致的整体报文重传–TCP分包(相当于利用数据流体系把一个整体大的TCP包分成了若干个小包,保证IP层不用分包了) 只需要传丢的报文,IP分包(相当于整体一个大的TCP包下来的),丢一个,整体重传- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
使用ifconfig命令,即可查看ip地址,mac地址,MTU。
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网 络层之间的协议;(数据链路层之上,网络层之下)
ARP(Address resolution protocol)即地址转换协议,其作用为建立了主机 IP地址 和 MAC地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址;而ARP协议便是解决这个问题的。
源主机发出ARP请求,询问“IP地址是172.20.1.2的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内使用这个表项,就不用询问目的主机硬件地址了,直接从表里读出;没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
想一想,为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?
ARP缓存表无非是方便我们短时间内再次发送数据时无需去询问目的主机的物理地址了。
而为什么需要清除ARP缓存,我们上面提到ARP请求是广播出去的,那么就不止目的主机能接收到这个请求,于是不是正确的主机也能够响应我们的请求,从而让数据发送到错误的主机上,这就是“ARP欺骗”,即利用了ARP协议设计上的缺陷,防止方法是设置静态“IP-MAC对照条目”。
而清除ARP缓存防止对照表欺骗,可能解决因ARP攻击导致的不能上网或链接错识的问题.其次,ARP缓存如果不清除的话,占用的内存会越来越多,导致机器越来越卡。
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,这对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层网络类型,1为以太网;协议类型指要转换的地址类型,0x0800为IP地址;硬件地址长度对于以太网地址为6字节;协议地址长度对于IP地址为4字节; (这些内容一般是固定的IP网络类型)
- op字段为1表示ARP请求,op字段为2表示ARP应答;(这个op字段是区分arp请求还是应答,进而进行下一步处理的关键!)
RARP:Reverse Address Resolution Protocal,逆地址解析协议。特殊场景下,广播出MAC地址请求RARP服务器分配一个IP地址给自己;
允许局域网的物理机器从网关服务器的ARP表或缓存上请求IP地址。
比如局域网中有一台主机只知道自己的物理地址而不知道自己的IP地址,那么可以通RARA协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。
RARP协议广泛应用于无盘工作站引导时获取IP地址。RARP允许局域网的物理机器从网关服务器ARP表或者缓存上请求其IP地址。
DNS是一整套从域名映射到IP的系统,即域名系统;
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆. 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系;(简单来说,IP是给程序员用的,跟一个域名绑定,域名是给用户看的便于记忆)
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
但是:
- 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这这样就太麻烦了, 于是产生了DNS系统:
- 一个组织的系统管理机构,维护系统内每个主机的IP和主机名的对应关系.
- 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
其实,至今 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容;
cat /etc/hosts
需要注意的是:DNS协议规范使用UDP进行传输.此外,DNS的默认端口为53。
www:只是一种习惯用法. 之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格 式, 来表示
baidu:二级域名,公司名.
com:一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) ,“edu”(教育组织)等.
安装dig工具:
yum install bind-utils
使用dig指令查看域名解析过程:
dig www.baidu.com
- 开头位置是 dig 指令的版本号
- 第二部分是服务器返回的详情, 重要的是 status 参数, NOERROR 表示查询成功
- QUESTION SECTION 表示要查询的域名是什么
- ANSWER SECTION 表示查询结果是什么. 这个结果先将 www.baidu.com 查询成了 www.a.shifen.com, 再将 www.a.shifen.com 查询成了两个 ip 地址.
- 最下面是一些结果统计, 包含查询时间和 DNS 服务器的地址等.
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
很多学校, 家庭,公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP; 全局IP要求唯一, 但是私有IP不需要,(很多私有ip可以复用了,解决IP数量不足);
在不同的局域网中出现相同的私有IP是完全不影响的;
- NAT路由器发数据时将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
- NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
- 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
- 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;因此回来的时候也有迹可循;
在NAT技术的基础上,假设下列场景:
如果同一个局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同
的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了,即使用IP+port来区分这个关联关系。
路由器会给同一局域网的不同主机在进行NAT:IP私有转换成全局IP后,末尾加上端口号进一步区分!
这种关联关系也是由NAT路由器自动维护的.
例如在TCP的情况下, 建立连接时, 就会生成这个表项(握手也是源向目的发报文); 在断开连接后, 就会删除这个表项。
由于NAT技术依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;也就是说只能从客户端去访问服务器,而外部服务器并不能够直接访问客户端,必须建立好连接后才行。(因为服务器外部就算找到了某客户端主机的全局IP,进而找到了所在局域网,但是因为没有端口号也无法确定是局域网内的具体的哪台主机)
- 转换表的生成和销毁都需要额外开销。
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开。
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程;
代理服务器看起来和NAT设备有一点像. 客户端向代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器有什么区别呢?
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像游戏加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换(都换IP地址了肯定再路由器里上走到网络层了). 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
代理服务器又分为正向代理和反向代理:
拿代购举例子,我想买国外的iphone,于是让在国外的表姐到当地的实体店中购买后邮递给我,此时实体店老板看到买东西的是我表姐,于是我表姐就是“正向代理”。—请求转发
后来找我表姐买iPhone的人太多了,于是我表姐就买了许多iPhone屯在家里,只要有人来找她代购,她就直接把囤着的iPhone邮递过去,这时我表姐就是“反向代理”。 —缓存
代理服务器是一种应用比较广的技术.
- “科学上网”: 广域网中的代理.
所谓的"科学上网",根据国家政策,外网不能访问,运营商内部设置了域名阻拦;根据代理技术,我们找到一台可以访问外网的主机(eg香港 台湾等地区),让他当中间人,我们包装http请求向代理中间人发数据包,可通过我俩的https协议将报文加密,只有双方收到,那么就穿过了运营商的"墙",代理再把https报文转给对应外网服务器,外网服务器发送响应给代理,代理再加密后交回给我的主机,借助代理“跨过”运营商的限制,完成“科学上网”;—我们要守法,这种行为不可取,是违法的!
负载均衡: 局域网中的代理
公司内网中部署反向代理机器,把接入的请求按照相对均匀的数量动态分配给内网业务主机;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。