网际网路协定( IP )是整个 TCP/IP 协定的基础﹐它的一些功能在前面的介绍 OSI 和 TCP/IP 模型的时候已经略略提过了﹐不过﹐由于它的重要性实在太值得了解﹐因此我们在这里再深入的探讨一下网际网路层的协定而事实上若 IP 这个环节若不过关的话我会劝您别偿试网路相关的工作了否则会桶苦一辈子!
大体而言网际网路协定的功能包括如下﹕
·定义资网际网路中传输的基本单位
·定义网际网路的定址方式
·负责网路存取层和传送层之间的资料传递
·决定资料传送的路由路径
·执行资料的分解和重组
这层协定主要要做的事情﹐是将从传送层传来的资料准确的送到远端机器上让我们温习一下刚学过的 ARP 协定﹐我们知道当主机获得应该 IP 后﹐如果在 ARP 表格中找不到目的主机的实体位址的时候(因为底层的传送是以实体位址为依据的)﹐那么就理由 ARP 协定是以广播的方式去寻问对方的实体位址不过﹐这里有一个限制﹕广播封包是有限制的﹐只能在同一个网段( segment )上的节点才能收到广播封包假如当我们有一个封包﹐从教室传到网际网路上地球另一边的主机﹐那这时候要如何处理呢﹖
Okay﹐这就是 IP 协定要解决的问题了让我们先看看 IP 封包的格式吧
IP 封包表头格式
首先﹐让我们看看IP封包的组成部份﹐以及各部件的长度﹕
在上图中﹐括号之内的数字就是各部件的长度 (bit)﹐如果您够细心﹐就会计算得出每一行的总长度都是bit事实上真正的封包是有连续的位元依序排列在一起的之所以分行完全是因为排版的关系下面我们分别对各部件名称解释一下﹕
Version
版本 (VER)表示的是 IP 规格版本﹐目前的 IP 规格多为版本(version)﹐所以这里的数值通常为x(注意﹕封包使用的数字通常都是十六进位的)
Internet Header Length
标头长度 (IHL)我们从 IP 封包规格中看到前面的行为 header ﹐如果 Options 和 Padding没有设定的话﹐也就只有行的长度﹔我们知道每行有bit ﹐也就是byt e﹔那么列就是byte 了这个数值换成进位就成了x﹐所以﹐当封包标头长度为最短的时候﹐这里数值会被换算为x
Type of Service
服务类型 (TOS)这里指的是 IP 封包在传送过程中要求的服务类型﹐其中一共由个 bit 组成﹐每组 bit 组合分别代表不同的意思﹕
Total Length
封包总长 (TL)通常以 byte 做单位来表示该封包的总长度﹐此数值包括标头和数据的总和
Identification
识别码 (ID)每一个IP封包都有一个bit 的唯一识别码我们从 OSI 和 TCP/IP 的网路层级知识里面知道﹕当程式产生的数据要通过网路传送时﹐都会在传送层被拆散成封包形式发送﹐当封包要进行重组的时候﹐这个 ID 就是依据了
Flag
旗标 (FL)这是当封包在传输过程中进行最佳组合时使用的个 bit 的识别记号请参考下表﹕
当此值为的时候﹐表示目前未被使用
当此值为的时候﹐表示封包可以被分割﹐若为则不能被分割
当上一个值为时﹐此值为就示该封包是最后一个封包﹐如果为则表示其后还有被分割的封包
Fragment Offset
分割定位 (FO)当一个大封包在经过一些传输单位(MTU)较小的路径时﹐会被被切割成碎片(fragment) 再进行传送(这个切割和传送层的打包有所不同﹐它是由网路层决定的)由于网路情况或其它因素影响﹐其抵达顺序并不会和当初切割顺序一至的所以当封包进行切割的时候﹐会为各片段做好定位记录﹐所以在重组的时候﹐就能够依号入座了
如果封包没有被切割﹐那么 FO 的值为
Time To Live
存活时间 (TTL)这个 TTL 的概念﹐在许多网路协定中都会碰到当一个封包被赋予 TTL 值(以秒或跳站数目(hop)为单位)﹐之后就会进行倒数计时在 IP 协定中TTL 是以 hop 为单位每经过一个 router 就减一)﹐如果封包 TTL 值被降为的时候﹐就会被丢弃这样﹐当封包在传递过程中由于某些原因而未能抵达目的地的时候﹐就可以避免其一直充斥在网路上面有只叫做 traceroute 的程式﹐就是一个上佳的 TTL 利用实作﹐我们会在后面的章节里面讨论
Protocol
协定(PROT)这里指的是该封包所使用的网路协定类型﹐例如﹕ICMP 或 TCP/UDP 等等要注意的是﹕这里使用的协定是网路层的协定﹐这和上层的程式协定(如﹕FTP﹑HTTP 等)是不同的您可以从 Linux 的 /etc/protocol 这个档案中找到这些协定和其代号﹔其内容如下﹕
ipIP# internet protocolpseudo protocol number
icmpICMP# internet control message protocol
igmpIGMP# Internet Group Management
ggpGGP # gatewaygateway protocol
ipencapIPENCAP# IP encapsulated in IP (officially ``IP)
stST# ST datagram mode
tcpTCP # transmission control protocol
egpEGP # exterior gateway protocol
pupPUP # PARC universal packet protocol
udpUDP # user datagram protocol
hmpHMP # host monitoring protocol
xnsidpXNSIDP # Xerox NS IDP
rdpRDP #reliable datagramprotocol
isotpISOTP# ISO Transport Protocol class
xtpXTP # Xpress Tranfer Protocol
ddpDDP # Datagram Delivery Protocol
idprcmtpIDPRCMTP # IDPR Control Message Transport
rspfRSPF#Radio Shortest Path First
vmtpVMTP# Versatile Message Transport
ospfOSPFIGP # Open Shortest Path First IGP
ipipIPIP# Yet Another IP encapsulation
encapENCAP # Yet Another IP encapsulation
Header Checksum
标头检验值(HC)这个数值主要用来检错用的﹐用以确保封包被正确无误的接收到当封包开始进行传送后﹐接收端主机会利用这个检验值会来检验余下的封包﹐如果一切看来无误﹐就会发出确认信息﹐表示接收正常
Source IP Address
来源位址(SA)相信这个不用多解释了﹐就是发送端的 IP 位址是也﹐长度为bit
Destination IP Address
目的地位址(SA)也就是接收端的 IP 位址﹐长度为bit
Options & Padding
这两个选项甚少使用﹐只有某些特殊的封包需要特定的控制﹐才会利用到这里也不作细表啦
前面所介绍的 IP 封包格式﹐请花点时间研究一下﹐因为在日后的网路生涯中﹐许多概念都要求设计者非常了解 IP 和 TCP 封包(标头)的结构﹐例如﹕防火墙设定和 socket 程式设计
IP 位址
当我们知道 IP 封包结构之后﹐接着我们就要接触一个在 TCP/IP 网路管理中最重要的一个概念﹕ 子网切割( subnetting )子网路这个名词我们前面不断的碰到过﹐或许同学们心里都很纳闷它究竟是什么东东?不过﹐在真正了解子网路的定义之前﹐我们必须要先了解的一个概念是 IP 位址
IP 位址虽然只有组用小点 () 分开的数字(IP v)﹐然而它却是整个 TCP/IP 协定的基石如果我们在讨论 TCP/IP 网路的时候﹐不知道 IP 位址的各个数字代表什么意思﹐那就什么都免谈了
那我们如何解读出 IP 位址所隐含的深刻意思呢﹖首先我们要具备一定的数学和逻辑基础﹐下面两个概念是一定要知道的﹕十进位和二进位的换算﹐以及基本逻辑运算这里不打算讨论十进位和二进位的换算了﹐如果您忘记了﹐请回学校问问数学老师吧然而﹐逻辑运算也不打算详细讨论了﹐下面只把在学习 IP 子网计算所需的几个运算﹐作一简单归纳而已﹕
如果不知道它们的工作原理﹐那么以后我们在讨论 IP 位址和子网的时候﹐您就只能靠死记一途了不过一旦你知道了其原理﹐那么您在任何的 IP 网路中都不至于迷失﹐所谓万变不离其宗是也
我们在前面讲述网路存取层的时候﹐层介绍过 ifconfig 命令来查找界面实体位址事实上在命令的输出结果里面﹐还包含了一个非常重要的资讯﹕inet addr 和 Mask﹕
ethLink encap:EthernetHWaddr:A:C::EA:inet addr:Bcast:Mask:UP BROADCAST RUNNING MULTICASTMTU:Metric:RX packets:errors:dropped:overruns:frame:TX packets:errors:dropped:overruns:carrier:collisions:txqueuelen:Interrupt:Base address:xethLink encap:EthernetHWaddr::C::C:A inet addr:Bcast:Mask: