Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593609
  • 博文数量: 805
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 5000
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-17 14:22
文章分类

全部博文(805)

文章存档

2011年(1)

2008年(804)

我的朋友

分类:

2008-10-17 14:23:15


  网际网路协定( 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
【责编:admin】
--------------------next---------------------

阅读(270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~