Linux 核心--11.网络( 二 )








图 10.1: TCP/IP 协议层

IP协议是一个传输层的协议,其它协议可以用它来传输数据 。传输控制协议(TCP)是一个可靠的端对端的协议,它用IP来传送和接收它自己的包 。正如IP包有它自己的头一样,TCP也有它自己的头 。TCP是一个面向连接的协议,两个网络应用程序通过一个虚连接相连,即使它们之间可能隔着很多子网、网关、路由器 。TCP可靠地传送和接收两应用程序间的数据,并保证数据不会丢失 。当用IP来传输TCP包时,IP包的数据段就是TCP包 。每一个通讯主机的IP层负责传送和接收IP包 。用户数据报协议(UDP)也用IP层来传输它的包,不象TCP,UDP不是一个可靠的协议,但它提供了一种数据报服务 。有多个协议可以使用IP层,接收IP包的时候必需知道该IP包中的数据是哪个上层协议的,因此IP包头中有个一字节包含着协议标识符 。例如,当TCP请求IP层传输一个IP包时,IP包的包头中用标识符指明该包包含一个TCP包,IP接收层用该标识符决定由哪一协议来 接收数据,这个例子中是TCP层 。当应用程序通过TCP/IP进行通讯时,它们不仅要指定目标的IP地址,而且还 要指定应用的端口地址 。一个端口地址唯一地标识一个应用,标准的网络应用使用标准的端口地址;如,Web 服务使用80端口 。这些已登记的端口地址可在 /etc/services 中看到 。

这一层的协议不仅仅是TCP、UDP和IP 。IP协议层本身用很多种物理媒介将IP包从一个主机传到其它主机 。这些媒介可以加入它们自己的协议头 。以太网层就是一个例子,但PPP和SLIP不是这样 。一个以太网络允许很个主机同时连接到同一根物理电缆 。传输中的每一个以太网帧可以被所有主机看见,因此每一以太网设备有个唯一的地址 。任何传送给该地址的以太网帧被有该地址的以太网设备接收,而其它主机则忽略该帧 。这个唯一的地址内置于每一以太网设备中,通常是在网卡出厂时就写在SROM2中了 。以太网地址有6个字节长,如: 08-00-2b-00-49-A4。一些以太网地址是保留给多点传送用的,送往这些地址的以太网帧将被网上所有的主机接收 。以太网帧可以携带很多种协议(作为数据),如IP包,并且也包括它们头中的协议标识符 。这使得以太网层能正确地接收IP包并将它们传给IP层 。

为了能通过象以太网这样的多连接协议传送IP包,IP层必须找到每一IP主机的以太网地址 。IP地址仅仅是一个地址概念,以太网设备有它们自身的物理地址 。从另一方面说,IP地址是可以被网络管理员根据需要来分配和再分配的,而网络硬件只对含有它们自己的物理地址或多点传送地址的以太网帧作出响应 。Linux用地址 解析协议(ARP)来允许机器将IP地址转变成真正的硬件地址,如以太网地址 。如果一个主机想知道某一IP地址对应的硬件地址,它就用一个多点传送地址将一个包含了该IP地址的ARP请求包发给网上所有节点,拥有该IP地址的的目标主机则响应一个包含物理硬件地址的ARP应答 。ARP不仅仅局限于以太网设备,它能够用来在其它一些物理媒介上解析IP地址,如FDDI 。那些不支持ARP的网络设备会被标记出来,Linux将不会用ARP 。还有一个提供相反功能的反向地址解析协议(RARP),用来将物理网络地址转变为IP地址 。这一协议常常被网关用来响应包含远程网络IP地址的ARP请求 。

10.2Linux TCP/IP 网络层





图 10.2: Linux 网络层

正如网络协议本身,图 10.2 显示出Linux用一系列相互连接层的软件实现Internet协议地址族 。BSD套接字(BSD sockets)由专门处理BSD sockets通用套接字管理软件处理 。它由INET sockets层来支持,这一层为基于IP的协议TCP和UDP管理传输端点 。UDP(用户数据报协议)是一个无连接协议而TCP(传输控制协议)是个可靠的端对端协议 。传输UDP包时,Linux不知道也不关心是否它们安全到达目的地 。TCP包则被TCP连接两端编号以保证传输的数据被正确接收 。IP层包含了实现Internet协议的代码 。这些代码给要传输的数据加上IP头,并知道如何把传入的IP包送给TCP或UDP 。在IP层以下,是网络设备来支持所有Linux网络工作,如PPP和以太网 。网络设备不总是物理设备;一些象loopback这样的设备是纯软件设备 。标准的Linux设备用mknod命令建立,网络设备要用底层软件发现并初始化它 。建立一个有适当的以太网设备驱动在内的内核后,你就可以看到 /dev/eth0。ARP协议位于IP层与支持ARP的协议之间 。

推荐阅读