《TCP/IP详解卷一:协议》数据链路层(二)

来源:互联网 发布:网络攻击鱼叉 水坑 编辑:程序博客网 时间:2024/05/16 07:25

SLIP:串行线路IP

        SLIP的全称是Serial Line IP。它是一种在串行线路上对IP数据报进行封装的简单形式。SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口和高速调制解调器接入Internet。 SLIP协议描述的帧格式如下:


  • IP数据报以一个称作END(0xC0)的特殊字符结束。同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个END字符(如果有线路噪声,那么END字符将结束这份错误的报文。这样当前的报文得以正确地传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃)。
  • 如果IP报文中某个字符为END,那么就要连续传输两个字节ESC,ESC_END(0XDB,0xDC)来取代它。0xDB这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符(0x1B)不同。
  • 如果IP报文中某个字符为SLIP的ESC字符,那么就要连续传输两个字节ESC,ESC_ESC(0xDB,0xDD)来取代它。

        SLIP是一种简单的帧封装方法,同时也有一些值得一提的缺陷:

  • 每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。
  • 数据帧中没有类型字段(类似于以太网中的类型字段)。如果一条串行线路用于SLIP,那么它不能同时使用其他协议。
  • SLIP没有在数据帧中加上检验和(类似于以太网中的CRC字段)。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现(另一种方法是,新型的调制解调器可以检测并纠正错误报文)。这样,上层协议提供某种形式的CRC就显得很重要。


        类比于上面的以太网帧封装格式,我们可以知道:SLIP为链路层协议,其目的类似于以太网封装协议,只是封装的格式不同而已。上面图片以太网封装只是在IP数据报前后添加数据,而SLIP协议的封装要求可能需要对数据内部数据进行更改。同时缺陷上面也提出来了,没有类型字段表示是什么协议的报文,也没有CRC字段进行纠错检验 。然而,尽管存在这些缺点同时它本身的描述是一种非标准的协议,但随着调制解调器的速率和可靠性的提高, SLIP仍然是一种广泛使用的协议。它主要被用于支持TCP/IP网络控制协议(network control protocol,NCP)中。

压缩的SLIP

        由于串行线路的速率通常较低(19200 b/s或更低),而且通信经常是交互式的(如Telnet和Rlogin,二者都使用TCP),因此在SLIP线路上有许多小的TCP分组进行交换。为了传送1个字节的数据需要20个字节的I P首部和20个字节的TCP首部,总数超过40个字节。

        既然承认这些性能上的缺陷,于是人们提出一个被称作CSLIP(即压缩SLIP)的新协议,它在RFC 1144中被详细描述。CSLIP一般能把上面的40个字节(IP首部加TCP首部)压缩到3或5个字节。它能在CSLIP的每一端维持多达16个TCP连接,并且知道其中每个连接的首部中的某些字段一般不会发生变化。对于那些发生变化的字段,大多数只是一些小的数字和的改变。这些被压缩的首部大大地缩短了交互响应时间。现在大多数的SLIP产品都支持CSLIP。

PPP:点对点协议

        点对点协议(PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP-IP 协议集中它是一种用来同步调制连接的数据链路层协议(OSI 模式中的第二层),替代了原来非标准的第二层协议,即 SLIP。除了 IP 以外 PPP 还可以携带其它协议,包括 DECnet和 Novell的Internet 网包交换(IPX)。

        点对点协议修改了SLIP协议中的所有缺陷。PPP包含以下三个部分:

  • 在串行链路上封装IP数据报的方法。PPP既支持数据为8位和无奇偶检验的异步模式,还支持面向比特的同步链接。
  • 建立、配置及测试数据链路的链路控制协议(LCP:Link Control Protocol),允许通信双方进行协商,以确定不同的选项。
  • 针对不同的网络层协议的网络控制协议(NCP:Network Control Protocol)。同时允许通信双方商定是否对报文首部进行压缩。


        PPP帧中每一帧都是以标志字符0X7E开始和结束。前三个字段的值如上图所示。协议字段类似于以太网中类型字段的功能,它的值决定信息字段的类型。CRC字段(FCS,帧检验序列)是一个循环冗余检验码,以检测数据帧中的错误。
        当标志字符出现在信息字段中时,需要对它进行转义。在同步链路中使用比特填充(bit stuffing)的硬件技术来实现。

零比特填充法

        在HDLC的帧结构中,若在两个标志字段之间的比特串中,碰巧出现了和标志字段F(01111110)一样的比特组合,那么就会误认为是帧的边界。为了避免出现这种情况,HDLC采用零比特填充法使一帧中两个F字段之间不会出现6个连续1。更详细地说:帧的头部有8位标识符,其以01111110模式在帧的两端起定界作用。某个标志字段可能既是一个帧的结束标志,也是下一个帧的起始标志。在接收一个帧时,站点也要继续搜索这个序列,以判断这个帧的阶数。而HDLC协议中允许存在任意的二进制比特序列,所以01111110模式可能出现在帧中间的某个地方,从而破坏同步。为了避免这种情况,使用了比特填充。
        填充方法:在帧的传输起始标志和结束标志之间,每当出现5个1之后,发送器就会插入一个附加的0.一旦有5个1模式出现,就会检查第6个比特。若为0,该比特将被删除。若为1,且第7个比特为0,那么这个组合被认为是标志字段。若第六位和第七位都为1,则此时处于异常终止状态。
        在异步链路中,特殊字符0x7d用作转义字符。当它出现在PPP数据帧中,那么紧接着的字符的第6个比特位要取其反码(小端,从低位到高位排序)。具体实现过程如下:

  • 当遇到标志字符0x7e时,需连续传送两个字符:0x7e和0x5e,以实现标志字符的转义。
  • 当遇到转义字符0x7d时,需连续传送两个字符:0x7d和0x5d,以实现转义字符的转义。
  • 默认情况下,如果字符的值小于20,一般都要进行转义。例如,遇到字符0x01时需连续传送0x7d和0x21字符(这时,第6个比特取反码后变成1,而前面两种情况均把它变为0)。

        这样做的原因是防止它们出现在双方主机的串行接口驱动程序或调制解调器中,因为他们会把这些控制字符解释为特殊的含义。另一种可能是用链路控制协议来指定是否需要对这32个字符中的某一些值进行转义。(为什么是32个字符)默认情况是对所有的32个字符都要进行转义。
        总的来说,PPP比SLIP具有的优势有:

  • PPP支持在单根串行线路上运行多种协议,不只是IP协议。
  • 每一帧都有循环冗余检验(CRC)。
  • 通信双方可以进行IP地址的动态协商(使用IP网络控制协议)。
  • 与SLIP类似,对TCP和IP报文首部进行压缩。
  • 链路控制协议可以对多个数据链路选项进行设置,为了这些优点付出的代价为在每一帧的首部增加了3个字节(一个字节给协议字段,两个字节给CEC字段使用)。
        最终PPP应该会取代SLIP(现在虽然SLIP用户仍然比PPP用户多)。 

环回接口(Loopback Interface)

        环回接口,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为了环回接口预留的。根据惯例,大多数系统把IP地址127.0.0.1分配给这个接口。并命名为localhost。一个传回环回接口的IP数据报不能在任何网络上出现。

        

        对链路层封装的帧按照类型值不同而进行分用。(IP数据报、ARP帧、RARP帧)。

  • 传回给环回地址(一般是127.0.0.1)的任何数据都作为IP输入。   
  • 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身。
  • 任何传给该主机IP地址的数据均送到环回接口。
        同时,图中的一个隐含意思是,送给主机本身IP地址的IP数据报一般不出现在相应的网络上。 

最大传输单元MTU

        以太网和802.3帧对数据帧的长度(并不是整体长度)都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称为MTU,最大传输单元。
        分片:如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片,把数据报分为若干片,使每片均小于MTU。
        其中,对点到点的链路层(SLIP和PPP)的MTU并非指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间。两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路径不同),因此路径MTU在两个方向上不一定是一致的。(关于路径MTU 的发现机制及如何确定路径MTU后面再谈,也可见RFC 1191)。

                                                                     

        其中,对点到点的链路层(SLIP和PPP)的MTU并非指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间。(将在后面讨论这个问题)

路径MTU

        当同一网络上的两台主机相互进行通信时,该网络的MTU是非常重要的。但如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,而是两台通信主机路径中最小MTU。两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路径不同),因此路径MTU在两个方向上不一定是一致的。(关于路径MTU的发现机制及如何确定路径MTU后面再谈,也可见RFC 1191)。

串行线路吞吐量计算  

        如果线路速率是9600 b/s,而一个字节有8 bit,加上一个起始比特和一个停止比特,那么 线路的速率就是960 B/s(字节/秒)(SLIP通常是用RS-232来承载的,而RS-232是用UART来传输数据,UART又定义了起止位。(因为没传输时钟信号,所以必须每个字节带停止位/开始位,相当于告诉对方同步时间))。以这个速率传输一个1024字节的分组需要1066 ms。如果用SLIP链接运行一个交互式应用程序,同时还运行另一个应用程序如FTP发送或接收1024字节的数据,那么一般来说就必须等待一半的时间( 533 ms)才能把交互式应用程序的分组数据发送出去。那么这个一半的时间是怎么计算出来的呢?
        这是因为SLIP数据帧中没有类型字段(类似于以太网中的类型字段).一条串行线路使用SLIP就不能同时使用其他协议。 此时就有两种情况:
                1、此交互应用程序先发送数据,它等待的时间是0ms 。
                2、ftp发送数据,将占用1066ms的时间,而交互应用程序将要等待1066ms。
        两种情况平均下来即等待533ms,这里所指的等待时间是平均等待时间。
        假定交互分组数据可以在其他“大块”分组数据发送之前被发送出去。大多数的SLIP实现确实提供这类服务排队方法, 把交互数据放在大块的数据前面。 交互通信一般有Telnet、Rlogin以及FTP的控制部分(用户的命令,而不是数据)。
这种服务排队方法是不完善的。它不能影响已经进入下游(如串行驱动程序)队 列的非交互数据。同时,新型的调制解调器具有很大的缓冲区,因此非交互数据可能 已经进入该缓冲区了。
        对于交互应用来说,等待 533 ms是不能接受的。 关于人的有关研究表明, 交互响应时间 超过100~200 ms就被认为是不好的 [Jacobson 1990a]。 这是发送一份交互报文出去后, 直到接收到响应信息(通常是出现一个回显字符)为止的往返时间。
        把SLIP的MTU缩短到 256ms就意味着链路传输一帧最长需要 266 ms,它的一半是 133 ms (这是一般需要等待的时间)。这样情况会好一些,但仍然不完美。我们选择它的原因(与 64 或128相比)是因为大块数据提供良好的线路利用率(如大文件传输)。假设CSLIP的报文首部是5个字节,数据帧总长为 261个字节, 256个字节的数据使线路的利用率为 98.1 %,帧头占 了1.9 %,这样的利用率是很不错的。如果把 MTU降到256以下, 那么将降低传输大块数据的最大吞吐量。
        点对点链路的MTU是296个字节。假设数据为256字节, TCP和 IP首部占40个字节。由于 MTU是IP向链路层查询的结果,因此该值必须包括通常的 TCP和IP首部。这样就会导致IP如何进行分片的决策。 IP对于CSLIP的压缩情况一无所知。
        我们对平均等待时间的计算(传输最大数据帧所需时间的一半)只适用于 SLIP链路(或 PPP链路)在交互通信和大块数据传输这两种情况下。当只有交互通信时,如果线路速率是 9600 b/s,那么任何方向上的1字节数据(假设有 5个字节的压缩帧头)往返一次都大约需要 12.5 ms。它比前面提到的100~200 ms要小得多。需要注意的是,由于帧头从40个字节压缩到 5个字节,使得1字节数据往返时间从85 ms 减到12.5 ms。
        不幸的是, 当使用新型的纠错和压缩调制解调器时, 这样的计算就更难了。 这些调制解调器所采用的压缩方法使得在线路上传输的字节数大大减少, 但纠错机制又会增加传输的时间。不过,这些计算是我们进行合理决策的入口点。

参考链接  串行线路吞吐量计算

阅读全文
0 0