免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 796 | 回复: 0
打印 上一主题 下一主题

《基于Linux的C编程与内核导读》连载(33) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-07 19:11 |只看该作者 |倒序浏览

第七章Linux网络编程
7.1 基础理论知识
7.1.1 TCP/IP网络基础
在一个TCP/IP网络中,每台主机都分配有一个32位的IP地址,该地址可以唯一地标识主机。IP地址通常用“.”隔开的四个十进制数表示,称为点分十进制表示,如IP地址0x81124C15(16进制)通常写成129.18.76.21。
IP地址由两部分组成:网络(network)地址和主机(host)地址。网络地址由IP地址的高位组成,主机地址由低位组成,这两部分的大小取决于网络的类型。如一个B类地址(IP地址的第一个字节大小在128到191之间),其IP地址的前两个字节是网络地址,后两个字节表示主机地址,这样一个B类地址可支持65536个网络,同时每个网络中可容纳65536台主机。
IP地址的主机部分可以分出多个子网,利用子网技术,大的网络(即主机地址部分占较多字节)可以被分为若干小的子网(subnetwork),每一个子网均可独立维护。例如,IP地址16.42.0.9,可将其设置为子网地址16.42.0,其主机地址16.42.0.9,这种技术通常用来划分一个企业的网络,如将16.42作为ACME计算机公司的网络地址,那么16.42.0则为子网0,16.42.1则为子网1,这些子网或许位于相分离的建筑物中,它们通过租用的电话线甚至微波相连。通常由网络管理员为主机分配IP地址,使用了子网技术将更有助于网络管理员的分派,并且管理员在其所辖子网内可以随意分配IP地址而不会有IP地址冲突。
一般说来,点分十进制表示的IP地址不易记,而记名字则容易多了。因此,每台网络主机还有一个名字,由域名服务(DamainNameService,DNS)负责IP地址与网络主机名的互译,并在整个因特网上发布名字—IP地址数据库。使用网络主机名使得一台机器的IP地址改变(例如,这台机器被移到了另外一个网络上)时,不必担心别人在网络上找不到这台机器,这台机器的DNS记录只是更新了IP地址,所有用网络主机名对这台机器的访问将继续有效。在Linux中,主机名字可静态地在/etc/hosts文件中定义;也可请求分布式域名服务器(Distributed Name Server,DNS)为其指定一个,这样主机必须应该知道一个或多个DNS服务器的IP地址,这些信息定义在/etc/resolv.conf文件中。
    当连接一台主机或访问一个Web主页时,都要通过本机的IP地址与被访问主机通信,用IP报文交换数据。IP报文分为两部分:IP报头与数据,在IP报头中,包含有源主机IP地址、目的主机IP地址、校验和和其他一些有用信息(详见图7-1),其中校验和是由源主机利用IP报文数据计算得出的,目的主机据此判断报文在传输过程中是否被破坏。为了便于控制,应用程序传输的数据可能会被分片为更小的IP报文,而IP报文的大小则由传输介质所决定:以太网报文通常要比点到点(Paint to Point Protocal,PPP)报文大一些,而目的主机在将数据交给应用程序之前,必须先重组报文。IP报头中的“标识”(IDENTIFICATION)域、“标志”(FLAG)域和“片偏移”(FRAGMENT OFFSET)域用来进行数据的分片与重组。如果通过较慢的网络传输图片,那么看一下图片的显示过程,即可感受到分片与重组的过程。
同一网络中的主机相互间可直接发送报文,但不同网络中的主机要通信,则必须通过一台特殊的主机:网关(Gateway)。网关(或路由器)是一台同两个或更多个网络有直接连接的节点,网关可以在网络之间交换信息,把报文从一个网络传递到另一个网络。例如,网络16.42.1.0与16.42.0.0通过一个网关相连,则所有从网络16.42.1.0发送到16.42.0.0的报文都须先发给网关,再由网关为其选择路由,转发报文。对应于每一个目的IP地址,网关中的路由表都提供一个入口用以查询将该报文发送到哪台主机。这些路由表动态刷新,随应用程序使用网络的时机和网络技术的不同而改变。
从协议分层来看,IP是网络层协议,TCP是一个可靠的端到端传输层协议,它利用IP层传接报文。TCP是面向连接的,它通过建立一条虚电路在不同的网络间传输报文,可以保证所传输报文的无丢失性和无重复性。用户数据报协议(UserDatagram Protocol,UDP)也要利用IP层传输报文,但它是一个非面向连接的传输层协议。利用IP层传输报文时,当目的方IP层收到IP报文后,必须能够识别出该报文所使用的上层协议(即传输层协议)。因此,在IP报头(参见图7-1)中,设有一个“协议”域(PROTOCOL)。通过该域的值,即可判明其上层协议类型。传输层与网络层在功能上的最大区别是前者提供进程通信能力,而后者则不能。在进程通信的意义上,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/UDP提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。例如,Web服务器进程通常使用端口80,在/etc/services文件中有这些注册了的端口地址。
分层协议不只包括TCP、UDP与IP,IP层本身亦要用到许多不同的物理介质来传输IP报文,这些介质也有自己的报头信息,例如以太网层。一个以太网允许多台主机同时连到一根缆线上,任一台主机发送的帧对其他所有主机都是可见的,因此每台主机都有一个唯一的以太网地址,指明了目的以太网地址的帧将只被拥有该地址的主机接收。以太网地址是一个48比特的整数,以机器可读的方式存入主机接口中,叫作硬件地址(hardware address)或物理地址(physical address)。以太网地址的一个重要特性是每一地址都与一个特定主机接口联系在一起,接口与地址一一对应。以太网地址共6字节长,为保证主机以太网地址的全球唯一性,以太网采用一种层次型地址分配方式:以太网地址管理机构(IEEE)将以太网地址(48比特的不同组合)分成若干独立的连续地址组,生产以太网接口板的厂家从中购买一组,具体生产时,再从所购地址中逐个将唯一地址赋予接口板。以太网地址中有一些保留地址用于多目的通信,当某一以太网帧拥有这样一个目的地址时,以太网上将会有多台主机同时接收这一帧。像IP报文一样,以太网帧同样支持多种上层协议,这样在以太网帧头中也有一个协议域,通过该域的值,以太网层即能将所收到的IP报文正确地传给IP层。
IP地址是一种简单的地址,在分配或改变IP地址时,网络管理员可以随心所欲,但同时物理地址是固定的,而网络硬件只响应物理地址,这样就必须提供一种机制,来完成这两种地址的映射。在Linux中采用的是地址解析协议(Address Resolution Protocol,ARP)和逆向地址解析协议(Reverse Address Resolution Protocol,RARP)。ARP用于从IP地址到物理地址的映射,RARP用于从物理地址到IP地址的映射。当主机A欲解析主机B的IP地址 时,A首先广播一个ARP请求报文,请求IP地址为 的主机回答其物理地址 。网上所有主机(包括B)都将收到该ARP请求,但只有B识别出自己的 地址,并作出应答:向A发回一个ARP响应,回答自己的物理地址 。ARP并非只能服务于以太网,它也支持其他一些物理介质,例如FDDI。RARP通常由网关所用,以响应对远程网络IP地址的ARP请求。
     图7-2描述了Linux对IP协议族的实现机制,如同网络协议自身一样,Linux也是通过视其为一组相连的软件层来实现的。其中BSD套接字(Socket)由通用的套接字管理软件所支持,该软件是INET套接字层,它来管理基于IP的TCP与UDP的端到端互联问题。如前所述,TCP是一个面向连接协议,而UDP则是一个非面向连接协议,当一个UDP报文发送出去后,Linux并不知道也不去关心它是否成功地到达了目的主机。对于TCP传输,传输节点间先要建立连接,然后通过该连接传输已排好序的报文,以保证传输的正确性。IP层中代码用以实现网际协议,这些代码将IP头增加到传输数据中,同时也把收到的IP报文正确地转送到TCP层或UDP层。IP层之下,是支持所有Linux网络应用的网络设备层,例如点到点协议(Point to Point Protocol, PPP)和以太网层。网络设备并非总代表物理设备,其中有一些(例如回送设备)则是纯粹的软件设备,网络设备与标准的Linux设备不同,它们不是通过mknod命令创建的,必须是底层软件找到并进行了初始化之后,这些设备才被创建并可用。因此只有当启动了正确设置了以太网设备驱动程序的内核后,才会有/dev/eth0文件。ARP协议位于IP层和支持地址解析的协议层之间。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/26619/showart_336028.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP