网际网路协定( 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) 再进行传送(这个切割和传送层的打包有所不同╋它是由网路层决定的)。由于网路情况或其它因素影响╋其抵达顺序并不会和当初切割顺序一至的。所以当封包进行切割的时候╋会为各片段做好定位记录╋所以在重组的时候╋就能够依号入座了。
如果封包没有被切割╋那么 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
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 程式设计。
IP 位址
当我们知道 IP 封包结构之后╋接着我们就要接触一个在 TCP/IP 网路管理中最重要的一个概念? 子网切割( subnetting ) 。子网路这个名词我们前面不断的碰到过╋或许同学们心里都很纳闷它究竟是什么东东?不过╋在真正了解子网路的定义之前╋我们必须要先了解的一个概念是 IP 位址。
IP 位址虽然只有 4 组用小点 (.) 分开的数字(IP v4)╋然而它却是整个 TCP/IP 协定的基石。如果我们在讨论 TCP/IP 网路的时候╋不知道 IP 位址的各个数字代表什么意思╋那就什么都免谈了。
那我们如何解读出 IP 位址所隐含的深刻意思呢?首先,我们要具备一定的数学和逻辑基础╋下面两个概念是一定要知道的?十进位和二进位的换算╋以及基本逻辑运算。这里不打算讨论十进位和二进位的换算了╋如果您忘记了╋请回学校问问数学老师吧。然而╋逻辑运算也不打算详细讨论了╋下面只把在学习 IP 子网计算所需的几个运算╋作一简单归纳而已?
如果不知道它们的工作原理╋那么以后我们在讨论 IP 位址和子网的时候╋您就只能靠死记一途了。不过,一旦你知道了其原理╋那么您在任何的 IP 网路中都不至于迷失╋所谓“万变不离其宗”是也。
我们在前面讲述网路存取层的时候╋层介绍过 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