最知名的网络协议就是TCP/IP协议了。事实上,TCP/IP协议是一个协议集,由很多协议组成。TCP和IP

协议是这个协议集中两个,TCP/IP协议集是用这两个协议来命名的。

TCP/IP协议集中的每一个协议涉及的功能,都用程序来实现。TCP协议和IP协议有对应的TCP程序和IP程

序。

 

根据TCP协议我们了解到,网络协议是一个约定,该约定规定了:

① 实现这个协议的程序要完成什么功能;

② 如何完成这个功能;

③ 实现这个功能需要的通讯的报文包的格式。

 

如果一个网络协议涉及了硬件的功能,通常就被叫做标准,而不再称为协议了。网络标准还需要约定硬

件的物理尺寸和电气特性。

 

ISO发布了注明的开放系统互联参考模型(Open System Interconnection Reference Model),简称OSI。

OSI模型详细规定了网络需要实现的功能、实现这些功能的方法、以及通讯报文包的格式。但是,没有

一个厂家遵循OSI模型来开发网络产品。不论是网络操作系统还是网络设备,不是遵循厂家自己制订的

协议(Novell公司的Novell协议,苹果公司的AppleTalk、微软公司的NetBEUI、IBM公司的SNA),就是

遵循某个政府部门制订的协议(如TCP/IP协议)。而现在TCP/IP已经占主流。

 

4.1 OSI模型

    wKiom1dNAJaSrWzoAAByuuk9v4U417.jpg

    图4.1 OSI模型的7层协议

 

    当需要把一个数据文件发送往另外一个主机之前,这个数据要经历这7层协议每一层的加工。例如我

    们要把一封邮件发送往服务器,当我们在Outlook中编辑完成,按发送键后,Outlook就会把我们的

    邮件交给第7层中按POP3或SMTP协议编写的程序。POP3或SMTP程序按自己的协议整理数据格式,然后

    发给下面层的某个程序。每个层(除了物理层,它是硬件电路和网线,不再加工数据)也会对数据

    格式做一些加工,还会用报头的形式增加一些信息。经过加工后的数据以帧的形式交给物理层,物

    理层的电路再以位流的形式发送数据到网络中。

    接受方的过程是相反的,物理层接收到数据后,以相反的顺序遍历OSI的所有层,使接收方收到这个

    电子邮件。接收方的主机,每一层都会阅读本层对应的报头,拆除自己层的报头把数据传送给上一

    层。

 

    wKioL1dNBj7CuR31AAF5TmYqwfs598.jpg

    图4.2 OSI模型的7层协议功能描述

 

4.2 TCP/IP协议

    wKiom1dNBn_ANWtqAAD1KkRvuWI481.jpg

    图4.3 OSI模型和TCP/IP协议集模型对比

    

    TCP/IP协议是一个协议集,它由十几个协议组成。

    

    wKioL1dNCKuBqp46AAB1c9krHxs317.jpg

    图4.4 TCP/IP协议集中的各个协议

 

    主要的TCP/IP协议有:

    . 应用层:FTP,TFTP,Http,SMTP,POP3,SNMP,DNS,Telnet

    . 传输层:TCP,UDP

    . 网络层:IP,ARP,RARP,ICMP,RIP,IGRP,OSPF

    

    4.2.1 应用层协议

          FTP:文件传输协议。用于主机间文件交换。FTP使用TCP协议进行数据传输,是一个可靠的、

               面向连接的协议。FTP支持二进制文件和ASCII协议。

          TFTP:简单的文件传输协议。它比FTP简易,是一个非面向连接的协议,使用UDP进行传输,

                因此传送速度更快。该协议多用于局域网中,交换机和路由器把自己的配置文件传

                送到主机上。

          SMTP:简单邮件传输协议。

          POP3:邮件传输协议,比SMTP更科学,本不属于TCP/IP协议集。

          Telnet:远程终端仿真协议。可以使一台主机远程登录到其他机器,成为那台远程主机的显

                  示和键盘终端。

          DNS:域名解析协议。根据域名,解析出对应的IP地址。

          SNMP:简单网络管理协议。网管工作站搜集、了解网络中交换机、路由器等设备的工作状态

                所使用的协议。

          NFS:网络文件系统协议。允许网络上的其他主机共享某台机器目录的协议。

    

    4.2.2 传输层协议

          TCP/IP协议集在传输层只有两个协议:传输控制协议(TCP)和用户数据报协议(UDP)。

 

          TCP协议要完成5个主要功能:

          . 端口地址寻址;

          . 连接的建立、维护与拆除;

          . 流量控制;

          . 出错重发;

          . 数据分段。

 

          (1) 端口地址寻址

              端口地址到底有什么用呢?当数据报到达主机后,链路层的程序会通过数据报的帧报尾

              进行CRC校验,校验合格的数据帧被去掉帧报头向上交给IP程序。IP程序去掉报头后,

              再向上把数据交给TCP程序。待TCP程序把TCP报头去掉后,它把数据交给谁呢?这时,

              TCP程序就可以通过TCP报头中由源主机指出的端口地址,了解到发送主机希望目标主机

              的什么应用程序接收这个数据报。

              因此,端口地址寻址是对应用层程序寻址

 

              wKioL1dNKdODPltwAADsYlYkmD8174.jpg

              图4.5 常用端口地址

 

              详细的端口号编排可以在TCP/IP的注释RFC1700查到。

              TCP/IP规定端口号的编排方法:

              低于255的编号:用于FTP、Http这样的公共应用层协议。

              255到1023的编号:提供给操作系统开发公司,为市场化的应用层协议编号。

              大于1023的编号:普通应用程序。

              端口号的编码范围从0到65535。从1024到49151的地址范围需要注册使用,49152到

              65535的地址范围可以自由使用。

 

              端口地址被源主机在数据发送前封装在其TCP报头或UDP报头中。图4.6给出了TCP报头

              的格式:

              wKioL1dNLEiwabGeAAD_SAN_SBs575.jpg

              图4.6 TCP报头格式

 

              计算机网络中约定,当一台主机向另一台主机发出连接请求时,这台发送请求的机器被

              视为客户机,而那台接受请求的机器被视为服务器。通常,客户机在给自己的程序编端

              口号时,随机使用一个大于1023的编号。例如一台主机访问WWW服务器,在其TCP报头中

              的源端口地址封装为1391,目标端口地址则需要为80,指明与Http通讯。

              

          (2) TCP连接的建立、维护与拆除

              TCP协议是一个面向连接的协议,所谓面向连接,是指一台主机需要和另外一台主机通

              讯时,需先呼叫对方,请求与对方建立连接,只有对方同意,才能开始通讯。

              所谓呼叫,就是连接的发起方发送一个“建立连接请求”的报文给对方,对方如果同

              意这个连接,就简单的发回一个“连接响应”的应答包,连接就建立起来了。

              图4.7描述了TCP建立连接的过程。

              wKiom1dNLuqR2hisAADxx6-0e2Y405.jpg

              图4.7 建立TCP连接

 

              主机A希望与主机B建立连接以交换数据,它的TCP程序首先构造一个请求连接报文包给对

              方,请求连接包的TCP报头中报文性质码标志为SYN(见图4.8),声明是一个“连接请求

              包”。主机B的TCP程序收到主机A的连接请求后,如果同意这个连接,就发回一个“确

              认连接包”,应答A主机。主机B的“确认连接包”的TCP报头中的报文性质码标志为

              ACK。

              

              wKioL1dNODjxepgFAAEMQ5mPml0640.jpg

              图4.8 SYN标志位和ACK标志位

              

              SYN和ACK是TCP报头中报文性质码的连接标志位(见图4.8),建立连接时,SYN标志置

              1,ACK标志置0,表示本报文包是个同步包;确认连接包,ACK置1,SYN置1,表示本报

              文包是确认包。

 

              从图4.7可以看到,建立连接的第3个包,是主机A对主机B的连接确认。主机A为什么要发

              送第3个包呢?

              注:这里的第3个包是这样计算得来的:主机A连接请求包是第1个包,主机B的应答包是

                  第2个包,主机A收到主机B的应答包后再发的包(ACK=y+1)就是第3个包了。

              继续讨论为什么要发第3个包。考虑这样一种情况:主机A发送一个请求包,但这个请求

              包在传输过程中丢失主机A再重发连接请求包,第2个连接请求包到达主机B,保证了

              连接的建立。但是如果连接请求包没有丢失而只是网络慢而导致主机A超时呢?这就会

              使主机B收到两个连接请求包,使主机B误以为第2个连接请求是主机A的又一个请求。第

              3个确认包就是为防止这样的错误而设计的。这样的连接机制被称为三次握手

              从TCP程序设计的深层看,源主机发送“连接请求包”是为了触发对方主机的TCP程序开

              辟一个对应的TCP进程。你的主机可以邀请对方开辟多个TCP进程,同时进行多路通讯。

              FLOOD******就是采用无休止的邀请对方建立连接,使对方主机开辟无数个TCP进程与

              之连接,最后耗尽对方主机资源。

 

              可以理解,当通讯结束时,发起连接的主机应该发送拆除连接的报文包,通知对方主机

              关闭响应的TCP进程,释放资源。拆除连接报文包的TCP报头中,报文性质码的FIN标志

              置1。

              为了防止连接双方的一侧出现故障后异常关机,而另外一方的TCP进程无休止地驻留,任

              何一方如果发现对方长时间没有通讯流量,就会拆除连接

              但是有时确实有一段时间没有流量,但还需要保持连接,就需要发送空的报文包,以维

              持这个连接。维持连接的报文包叫:keepalive。为了在一段时间内没有数据发送但还

              需要保持连接而发送keepalive包,被称为连接的维护

 

          (3) TCP报头中的报文序号

              TCP是将应用层交给的数据分段发送的。为了支持数据出错重发和数据段组装,TCP为

              每个数据段封装的报头中,设计了两个数据报序号字段,分别称为发送序号确认序

              号

              

              出错重发是指一旦发现有丢失的数据段,可以重发丢失的数据,以保证数据传输的完整

              性。如果数据没有分段,出错后源主机就不得不重发整个数据。为了确认丢失的数据是

              哪个数据段,报文就需要安装序号。

              

              数据分段可以使报文在网络中的传输非常灵活。一个数据的各个分段,可以选择不同的

              路径到达目标主机。由于网络中各条路径在传输速度上不一致性,有可能前面发出的数

              据段后到达,而后出发的数据段先到达。为了使目标主机能够按照正确的次序重新装配

              数据,也需要在数据段的报头中安装序号。

              

              TCP报头中的第3,4个字段分别是发送序号和确认序号。发送序号是指本数据段是第几个

              报文包,确认序号是指对方发来的下一个数据段该是第几号段。


              wKiom1dNU4ajY9XEAAGmCW-cxJs728.jpg

              图4.9 发送序号与确认序号

 

          (4) PAR出错重发机制

              在网络中有两种情况会丢失数据包。如果网络设备的负荷太大,当其数据包缓冲区满的

              时候,就会丢失数据包。另外一种情况是,如果在传输中因为噪声干扰、数据碰撞或设

              备故障,数据包就会受到损坏。在接受主机的链路层接受校验时就会被丢弃。

 

              发送主机应发现丢失的数据段,并重发出错的数据。

 

              TCP使用PAR(Positive Acknowledgement and Retransmission)的出错重发方案。

 

              TCP程序在发送数据时,先把数据段都放到其发送窗口中,然后发送出去。然后,PAR会

              为发送窗口中每个已发送的数据段启动定时器,被对方主机确认收到的数据,将从发送

              窗口中删除。如果某数据段的定时时间到,仍然没有收到确认,PAR就会重发这个数据

              段。

              

              wKioL1dNVu2xL3MRAAEIYPgCatY775.jpg

              图4.10 PAR出错重发机制

 

              在图4.10中,发送主机的2号数据段丢失,接收主机只确认了1号数据段。发送主机从发

              送窗口中删除已确认的1号包,放入4好数据段,将2,3,4号发送出去,其中,2,3是重发

              的数据段。你会发现,尽管数据段3已经被接收主机收到,仍然被重发,这显然是一种

              浪费。但是PAR机制只能这样处理,因为只有一个确认序号字段,如果有丢失大于一个数

              据段,一个确认序号无法记录多个丢失数据包。而单独设计一个包来通知源主机也不

              行,因为这个通知包也丢失了该怎么办呢?

 

         (5) TCP流量控制

             如果接收主机同时与多个TCP通讯,接收的数据包的重新组装需要在内存中排队。如果

             接收主机的负荷太大,因为内存缓冲区满,就有可能丢失数据。因此,当接收主机无法

             承受发送主机的发送速度时,就需要通知发送主机放慢数据的发送速度。事实上,接收

             主机并不是通知发送主机放慢发送速度,而是直接控制发送主机的发送窗口大小。接收

             主机如果需要对方放慢数据的发送速度,就减小数据报中TCP报头里“发送窗口”字段

             的数值。对方主机必须服从这个数值,减小发送窗口的大小,从而降低了发送速度。

 

             wKiom1dNrxeDA6IsAAFYsuShfn8367.png

             图4.11 TCP流量控制

              

             极端的情况,如果接收主机把窗口大小字段设为0,发送主机将暂停发送数据。有趣的

             是,尽管发送主机接受接收主机的窗口设置降低了发送速度,但是,发送主机会自己渐

             渐扩大窗口,这样做的目的是尽可能的提高数据的发送速度。也就是说,发送主机会降

             低发送速度,但不一定会减小窗口大小。

             在实际中,TCP报头中的窗口字段不是用数据段的个数来说明大小,而是以字节数来说

             明大小。

 

         (6) UDP协议

             TCP/IP协议集中设计了另外一个传输层协议:无连接数据传输协议(Connectionless

             Data Transport Protocol)。这是一个简化了的传输层协议。UDP去掉了TCP协议5个功

             能中的3个:

             连接建立、流量控制、出错重发,只保留端口寻址和数据分段2个功能。

 

             UDP通过牺牲可靠性换得通讯效率的提供。对于那些数据可靠性要求不高的数据传输,

             可以使用UDP协议完成。如DNS,SNMP,TFTP,DHCP。

              

             UDP的报头格式非常简单,核心内容只有源端口地址和目标端口地址两个字段。DHCP的

             细节详见RFC768。

 

             wKioL1dNtK2DcXPBAAAwLmoh3E8846.png

             图4.12 UDP报头格式

 

             UDP程序需要与TCP一样完成端口地址寻址和数据分段两个功能。但是它不知道数据包是

             否到达目标主机,接收主机也不能抑制发送数据的速度。由于数据报中不再有报文序

             号,一旦数据包沿不同路径到达目标主机的次序出现变化,目标主机也无法按正确的次

             序纠正这样的错误。

 

     4.2.3 网络层协议

           TCP/IP协议集中最重要的网络层协议是IP和ARP。除了这两个协议外,网络层还有一些其

           它的协议,如RARP,DHCP,ICMP,RIP,IGRP,OSPF等。这些协议的功能是:

           IP协议:

                   用于将多个包交换网络连接起来的。


           ARP(Address Resolution Protocol)协议

                   根据IP地址获取MAC地址


           RARP(Reverse Address Resolution Protocol)协议

                   将局域网中某个主机的MAC地址转换为IP地址

           BOOTP(Bootstrap Protocol)协议

                   是一种引导协议,基于IP/UDP协议,也称自举协议,是DHCP协议的前身。BOOTP用

                   于无盘工作站的局域网中,可以让无盘工作站从一个中心服务器上获得IP地址。通过

                   BOOTP协议可以为局域网中的无盘工作站分配动态IP地址,这样就不需要管理员去为

                   每个用户去设置静态IP地址。


           DHCP(Dynamic Host Configuration Protocol)协议

                   是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网

                   络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央

                   管理的手段,在RFC 2131中有详细的描述。DHCP有3个端口,其中UDP67和UDP68

                   为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546号

                   端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别

                   开启的服务,DHCP failover是用来做“双机热备”的。


           ICMP(Internet Control Message Protocol)协议

                    Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间

                    传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身

                    的消息。


           RIP协议

           是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由

                    信息的传递。RIP协议基于距离矢量算法(DistanceVectorAlgorithms),使用“跳数”(即

                    metric)来衡量到达目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与

                    自己相邻的路由器交换信息,范围限制在15跳(15度)之内,再远,它就不关心了。RIP应

                    用于OSI网络七层模型的应用层。

                    各厂家定义的管理距离(AD,即优先级)如下:

                    华为定义的优先级是100,思科定义的是120。

           IGRP(Interior Gateway Routing Protocol)协议

           是一种内部网关路由协议,它由Cisco公司八十年代中期设计。

           OSPF(Open Shortest Path First 开放式最短路径优先)协议

                   是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统

                   (Autonomous System,AS)内决策路由

 

4.3 IEEE 802标准

    TCP/IP没有对OSI模型最下面两层的实现,TCP/IP协议主要是在网络操作系统中实现的。主机中的

    应用层、传输层、网络层任务由TCP/IP程序来完成,而主机OSI模型的最下面两层数据链路层和物

    理层的功能由网卡制造厂商的程序和硬件电路来完成。

      

    网络设备厂商在制造网卡、交换机、路由器的时候,其数据链路层和物理层的功能是依照IEEE

    802规范,也没有按照OSI的具体协议开发。

    IEEE制订的802规范标准规定了数据链路层物理层功能是:

    . 物理地址寻址

      发送方需要对数据包安装帧报头,将物理地址封装在帧报头中。接收方能够根据物理地址识别

      是否是发给自己的数据。

    . 介质访问控制

      如何使用共享传输介质,避免介质使用冲突。

      知名的介质访问控制技术有以太网技术、令牌网技术、FDDI技术等。

    . 数据帧校验

      数据帧在传输过程中是否受到损坏,丢弃损坏了的帧。      

    . 数据的发送和接收

      操作内存中的待发送数据向物理层电路中发送的过程。在接收方完成相反的操作。

 

    IEEE 802根据不同功能,有相应的协议规范,统称为IEEE 802x标准。

    图4.13列出了现在流行的IEEE 802标准。

    

    wKioL1dOf7PiA_W2AAHX5Ys6t_M962.jpg

    图4.13 IEEE协议标准

    由图4.13可见,OSI模型把数据链路层又划分为两个子层:

    逻辑链路控制(LLC: Logical Link Control)子层

    和

    介质访问控制(MAC: Media Access Control)子层

    LLC子层任务是提供网络层程序与链路层程序的接口,使得链路层主体MAC子层的程序设计独立于

    网络层的某个具体协议程序。这样设计是有必要的,例如新的网络层协议出现时,只需要为这个新

    的网络层协议程序写出对应的LLC子层接口程序,就可以使用已有的链路层程序,而不需要全部推翻

    过去的链路层程序。

    

    MAC子层完成所有OSI对数据链路层要求完成的功能:物理地址寻址、介质访问控制、数据帧校验、

    数据发送与接收的控制。


    IEEE 802.2协议对应OSI模型的LLC子层。


    IEEE 802x的核心标准是10余个跨越MAC子层和物理层的设计规范。下面列出了一些常见的IEEE 802

    协议:

    IEEE 802.3

    以太网标准协议规范,提供10M局域网的介质访问控制子层和物理层设计标准。


    IEEE 802.3u

    快速以太网标准规范,提供100M局域网的介质访问控制子层和物理层设计标准。

    IEEE 802.3ab

    千兆以太网标准规范,提供1000M局域网的介质访问控制子层和物理层设计标准。


    IEEE 802.5

    令牌环网标准规范,提供令牌环网的介质访问控制子层和物理层设计标准。


    IEEE 802.11

    无线局域网标准规范,提供2.4G微波波段1-2Mbps低速WLAN的介质访问控制子层和物理层设计标准。

    

    IEEE 802.11a

    无线局域网标准规范,提供5G微波波段54Mbps高速WLAN的介质访问控制子层和物理层设计标准。

    IEEE 802.11b

    无线局域网标准规范,提供2.4G微波波段11Mbps高速WLAN的介质访问控制子层和物理层设计标准。

    IEEE 802.11g

    无线局域网标准规范,提供IEEE 802.11a和IEEE 802.11b兼容标准。

    

    IEEE 802.14

    有线电视网标准规范,提供Cable Model技术所设计的介质访问控制子层和物理层设计标准。