网际网路协定( IP )是整个 TCP/IP 协定的基础﹐它的一些功能在前面的介绍 OSI 和 TCP/IP 模型的时候已经略略提过了﹐不过﹐由于它的重要性实在太值得了解﹐因此我们在这里再深入的探讨一下网际网路层的协定。而事实上,若 IP 这个环节若不过关的话,我会劝您别偿试网路相关的工作了,否则会桶苦一辈子!
大体而言,网际网路协定的功能包括如下﹕
· 定义资网际网路中传输的基本单位。
· 定义网际网路的定址方式。
· 负责网路存取层和传送层之间的资料传递。
· 决定资料传送的路由路径。
· 执行资料的分解和重组。
这层协定主要要做的事情﹐是将从传送层传来的资料准确的送到远端机器上。让我们温习一下刚学过的 ARP 协定﹐我们知道当主机获得应该 IP 后﹐如果在 ARP 表格中找不到目的主机的实体位址的时候(因为底层的传送是以实体位址为依据的)﹐那么就理由 ARP 协定是以广播的方式去寻问对方的实体位址。不过﹐这里有一个限制﹕广播封包是有限制的﹐只能在同一个网段( segment )上的节点才能收到广播封包。假如当我们有一个封包﹐从教室传到网际网路上地球另一边的主机﹐那这时候要如何处理呢﹖
Okay﹐这就是 IP 协定要解决的问题了。让我们先看看 IP 封包的格式吧。
IP 封包表头格式
首先﹐让我们看看IP封包的组成部份﹐以及各部件的长度﹕
在上图中﹐括号之内的数字就是各部件的长度 (bit)﹐如果您够细心﹐就会计算得出每一行的总长度都是 32bit。事实上,真正的封包是有连续的位元依序排列在一起的,之所以分行,完全是因为排版的关系。下面,我们分别对各部件名称解释一下﹕
Version
版本 (VER)。表示的是 IP 规格版本﹐目前的 IP 规格多为版本 4 (version 4)﹐所以这里的数值通常为 0x4 (注意﹕封包使用的数字通常都是十六进位的)。
Internet Header Length
标头长度 (IHL)。我们从 IP 封包规格中看到前面的 6 行为 header ﹐如果 Options 和 Padding没有设定的话﹐也就只有5 行的长度﹔我们知道每行有 32bit ﹐也就是 4byt e﹔那么, 5 列就是 20byte 了。20 这个数值换成 16 进位就成了 0x14﹐所以﹐当封包标头长度为最短的时候﹐这里数值会被换算为 0x14 。
Type of Service
服务类型 (TOS)。这里指的是 IP 封包在传送过程中要求的服务类型﹐其中一共由 8 个 bit 组成﹐每组 bit 组合分别代表不同的意思﹕
Total Length
封包总长 (TL)。通常以 byte 做单位来表示该封包的总长度﹐此数值包括标头和数据的总和。
Identification
识别码 (ID)。每一个IP封包都有一个 16bit 的唯一识别码。我们从 OSI 和 TCP/IP 的网路层级知识里面知道﹕当程式产生的数据要通过网路传送时﹐都会在传送层被拆散成封包形式发送﹐当封包要进行重组的时候﹐这个 ID 就是依据了。
Flag
旗标 (FL)。这是当封包在传输过程中进行最佳组合时使用的 3 个 bit 的识别记号。请参考下表﹕
000. 当此值为 0 的时候﹐表示目前未被使用。
.0.. 当此值为 0 的时候﹐表示封包可以被分割﹐若为 1 则不能被分割。
..0. 当上一个值为 0 时﹐此值为 0 就示该封包是最后一个封包﹐如果为 1 则表示其后还有被分割的封包。
Fragment Offset
分割定位 (FO)。当一个大封包在经过一些传输单位(MTU)较小的路径时﹐会被被切割成碎片(fragment) 再进行传送(这个切割和传送层的打包有所不同﹐它是由网路层决定的)。由于网路情况或其它因素影响﹐其抵达顺序并不会和当初切割顺序一至的。所以当封包进行切割的时候﹐会为各片段做好定位记录﹐所以在重组的时候﹐就能够依号入座了。 DL@bitsCN_com网管软件下载
如果封包没有被切割﹐那么 FO 的值为“0”
。
Time To Live
存活时间 (TTL)。这个 TTL 的概念﹐在许多网路协定中都会碰到。当一个封包被赋予 TTL 值(以秒或跳站数目(hop)为单位)﹐之后就会进行倒数计时。在 IP 协定中,TTL 是以 hop 为单位,每经过一个 router 就减一)﹐如果封包 TTL 值被降为 0 的时候﹐就会被丢弃。这样﹐当封包在传递过程中由于某些原因而未能抵达目的地的时候﹐就可以避免其一直充斥在网路上面。有只叫做 traceroute 的程式﹐就是一个上佳的 TTL 利用实作﹐我们会在后面的章节里面讨论。
Protocol
协定(PROT)。这里指的是该封包所使用的网路协定类型﹐例如﹕ICMP 或 TCP/UDP 等等。要注意的是﹕这里使用的协定是网路层的协定﹐这和上层的程式协定(如﹕FTP﹑HTTP 等)是不同的。您可以从 Linux 的 /etc/protocol 这个档案中找到这些协定和其代号﹔其内容如下﹕
------------------------------------------------------
ip 0 IP # internet protocol, pseudo protocol number
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # Internet Group Management bitsCN.nET*中国网管博客
ggp 3 GGP # gateway-gateway protocol
ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'')
st 5 ST # ST datagram mode
tcp 6 TCP # transmission control protocol
egp 8 EGP # exterior gateway protocol
pup 12 PUP # PARC universal packet protocol
udp 17 UDP # user datagram protocol
hmp 20 HMP # host monitoring protocol
xns-idp 22 XNS-IDP # Xerox NS IDP
rdp 27 RDP # "reliable datagram" protocol
iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4
xtp 36 XTP # Xpress Tranfer Protocol
ddp 37 DDP # Datagram Delivery Protocol
idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport
rspf 73 RSPF #Radio Shortest Path First.
vmtp 81 VMTP # Versatile Message Transport
ospf 89 OSPFIGP # Open Shortest Path First IGP
ipip 94 IPIP # Yet Another IP encapsulation
encap 98 ENCAP # Yet Another IP encapsulation
------------------------------------------------------
Header Checksum
标头检验值(HC)。这个数值主要用来检错用的﹐用以确保封包被正确无误的接收到。当封包开始进行传送后﹐接收端主机会利用这个检验值会来检验余下的封包﹐如果一切看来无误﹐就会发出确认信息﹐表示接收正常。
Source IP Address
来源位址(SA)。相信这个不用多解释了﹐就是发送端的 IP 位址是也﹐长度为 32 bit。
Destination IP Address
目的地位址(SA)。也就是接收端的 IP 位址﹐长度为 32 bit。
Options & Padding
这两个选项甚少使用﹐只有某些特殊的封包需要特定的控制﹐才会利用到。这里也不作细表啦。
前面所介绍的 IP 封包格式﹐请花点时间研究一下﹐因为在日后的网路生涯中﹐许多概念都要求设计者非常了解 IP 和 TCP 封包(标头)的结构﹐例如﹕防火墙设定和 socket 程式设计。 中国_网管联盟bitsCN.com
IP 位址
当我们知道 IP 封包结构之后﹐接着我们就要接触一个在 TCP/IP 网路管理中最重要的一个概念﹕ 子网切割( subnetting ) 。子网路这个名词我们前面不断的碰到过﹐或许同学们心里都很纳闷它究竟是什么东东?不过﹐在真正了解子网路的定义之前﹐我们必须要先了解的一个概念是 IP 位址。
IP 位址虽然只有 4 组用小点 (.) 分开的数字(IP v4)﹐然而它却是整个 TCP/IP 协定的基石。如果我们在讨论 TCP/IP 网路的时候﹐不知道 IP 位址的各个数字代表什么意思﹐那就什么都免谈了。
那我们如何解读出 IP 位址所隐含的深刻意思呢﹖首先,我们要具备一定的数学和逻辑基础﹐下面两个概念是一定要知道的﹕十进位和二进位的换算﹐以及基本逻辑运算。这里不打算讨论十进位和二进位的换算了﹐如果您忘记了﹐请回学校问问数学老师吧。然而﹐逻辑运算也不打算详细讨论了﹐下面只把在学习 IP 子网计算所需的几个运算﹐作一简单归纳而已﹕
如果不知道它们的工作原理﹐那么以后我们在讨论 IP 位址和子网的时候﹐您就只能靠死记一途了。不过,一旦你知道了其原理﹐那么您在任何的 IP 网路中都不至于迷失﹐所谓“万变不离其宗”是也。 中国_网管联盟bitsCN.com
我们在前面讲述网路存取层的时候﹐层介绍过 ifconfig 命令来查找界面实体位址。事实上,在命令的输出结果里面﹐还包含了一个非常重要的资讯﹕inet addr 和 Mask﹕
eth0 Link encap:Ethernet HWaddr 00:A0:0C:11:EA:11 inet addr:203.30.35.134 Bcast:203.30.35.159 Mask:255.255.255.224 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:3 Base address:0x300eth1 Link encap:Ethernet HWaddr 00:80:C7:47:8C:9A inet addr:192.168.0.17 Bcast:192.168.0.255 Mask:255.255.255