链路层-路径MTU

2009年04月24号 22:20  |  分类:协议基础

当在同一个网络上的两台主机互相进行通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通信主机路径中的最小MTU。它被称作路径MTU。

两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。

RFC1191[MogulandDeering1990]描述了路径MTU的发现机制,即在任何时候确定路径MTU的方法。我们在介绍了ICMP和IP分片方法以后再来看它是如何操作的。以后,我们将看到ICMP的不可到达错误就采用这种发现方法。还会看到,traceroute程序也是用这个方法来确定到达目的节点的路径MTU。同时还将讲解当软件支持路径MTU的发现方法时,UDP和TCP是如何进行操作的。

文章来源于>>TCP/IP协议分析博客   转载请注明:Toad的博客

链路层-最大传输单元MTU

2009年04月24号 22:09  |  分类:协议基础

以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称作MTU,最大传输单元。不同类型的网络大多数都有一个上限。如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大,那么IP层就需要进行分片(fragmentation),把数据报分成若干片,这样每一片都小于MTU。我们将在以后讨论IP分片的过程。下图列出了一些典型的MTU值:

几种常见的最大传输单元(MTU)

它们摘自RFC1191[MogulandDeering1990]。点到点的链路层(如SLIP和PPP)的MTU并非指的是网络媒体的物理特性。相反,它是一个逻辑限制,目的是为交互使用提供足够快的响应时间。在以后的文章中,我们将看到这个限制值是如何计算出来的。

文章来源于>>TCP/IP协议分析博客        转载请注明:Toad的博客

链路层-环回接口

2009年04月20号 23:09  |  分类:协议基础

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

 我们想象,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回给自己。

      下图是环回接口处理IP数据报的简单过程。

环回接口架构图

 图中需要指出的关键点是:

 1)传给环回地址的任何数据均作为IP输入。

 2)传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身。

3)任何传给该主机IP地址的数据均送到环回接口。

看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但它简化了设计,因为环回接口可以被看作是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中。

 在上图中,另一个隐含的意思是送给主机本身的IP地址的IP数据报一般不出现在相应的网络上。例如,在一个以太网上,分组一般不被传出去然后读回来。某些BSD以太网的设备驱动程序的注释说明,许多以太网接口卡不能读回他们自己发送出去的数据。由于一台主机必须处理发送给自己的IP数据包,因此上图所示的过程是最为简单的处理办法。

文章来源于>>TCP/IP协议分析博客 需转载请注明:Toad的博客

链路层-PPP:点对点协议(3)

2009年04月19号 21:59  |  分类:协议基础

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

与SLIP类似,由于PPP经常用于低俗的串行链路,因此减少每一帧的字节数可以降低应用程序的交互时延。利用链路控制协议,大多数的产品通过协商可以省略标志符和地址字段,并且把协议字段由2个字节减少到1个字节。如果我们把PPP的帧格式与前面的SLIP的帧格式进行比较会发现,PPP只增加了3个额外的字节:1个字节留给协议字段,另2个给CRC字段使用。另外,使用IP网络控制协议,大多数的产品可以通过协商采用Van Jacobson报文首部压缩方法(对应于CSLIP压缩),减小IP和TCP首部长度。

总的来说,PPP比SLIP具有下面这些优点:(1)PPP支持在单根串行线路上运行多种协议,不只是IP协议;(2)每一帧都有循环冗余检验;(3)通信双方可以进行IP地址的动态协商(使用IP网络控制协议);(4)与CSLIP类似,对TCP和IP报文首部进行压缩;(5)链路控制协议可以对多个数据链路选项进行设置。为这些优点付出的代价是在每一帧的首部增加3个字节,当建立链路时要发送几帧协商数据,以及更为复杂的实现。

文章来源于>>TCP/IP协议分析博客   转载请注明:Toad的博客

链路层-PPP:点对点协议(2)

2009年04月18号 23:39  |  分类:协议基础

PPP数据帧的格式看上去很像ISO的HDLC(高层数据链路控制)标准。下图就是PPP数据帧的格式

PPP数据帧格式

每一帧都以标志字符0×7e开始和结束。紧接着是一个地址字节,值始终是0xff,然后是一个值为0×03的控制字节。

接下来是协议字段,类似于以太网中类型字段的功能。当它的值为0×0021时,表示信息字段是一个IP数据包;值为0xc021时,表示信息字段是链路控制数据;值为0×8021时,表示信息字段是网络控制数据。

CRC字段(或FCS,帧检验序列)是一个循环冗余检验码,以检测数据帧中的错误。

由于标志字符的值是0×7e,因此当该字符出现在信息字段中时,PPP需要对它进行转义。在同步链路中,该过程是通过一种称作比特填充(bit stuffing)的硬件技术来完成的。在异步链路中,特殊字符0×7d用作转义字符。当它出现在PPP数据帧中时,那么紧接着的字符的第6个比特要取其补码。具体实现过程如下:

1)当遇到字符0×7e时,需要连续传送两个字符:0×7d和0×5e,以实现标志字符的转义。

2)当遇到转义字符0×7d时,需连续传送两个字符:0×7d和0×5d,以实现转义字符的转义。

3)默认情况下,如果字符的值小于0×20(比如,一个ASCII控制字符),一般都要进行转义。例如,遇到字符0×01时需连续传送0×7d和0×21两个字符(这时,第6个比特取补码后变为1,而前面两种情况均把它变为0)。

 

 文章来源于>>网络协议分析博客   转载请注明:Toad的博客

链路层-PPP:点对点协议

2009年04月15号 22:16  |  分类:协议基础

PPP,点对点协议修改了SLIP协议中的所有权限。PPP包括以下三个部分:

1)、在串行链路上封装IP数据包的方法。PPP既支持数据为8位和无奇偶检验的异步模式,还支持面向比特的同步链接。

2)、建立,配置及检测数据链路的LCP(链路控制协议)。它还允许通信双方进行协商,以确定不同的选项。

3)、针对不同网络层协议的网络控制协议(NCP)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。例如:IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP。

RFC 1548描述了报文封装的方法和链路控制协议。RFC 1332描述了针对IP的网络控制协议。

链路层-压缩的SLIP

2009年04月15号 21:58  |  分类:协议基础

由于串行线路的速率通常较低,而且通信经常是交互式的,因此在SLIP线路上有许多小的TCP分组进行交换。为了传送1个字节的数据都需要20个字节的IP首部和20个字节的TCP首部,总数超过40个字节。

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

链路层-SLIP的缺陷

2009年04月14号 23:27  |  分类:协议基础

SLIP是一种简单的帧封装方法,“简单”是它的优点也是它的缺点:

1)、每一端必须知道对方的IP地址。没有办法把本端的IP地址通知给另一端。

2)、数据帧中没有类型字段。如果一条串行线路用于SLIP,那么它不能同时使用其他协议。

3)、SLIP没有任何数据帧中加上检验和。如果SLIP传输的报文被线路噪声影响而发生错误,只能通过上层协议来发现。这样,上层协议提供某种形式的CRC就显得很重要。这里,我们先提一下:IP首部和TCP首部及其数据始终都有检验和,同时,UDP首部及其数据的检验和是可选的。

链路层-SLIP:串行线路IP

2009年04月14号 23:20  |  分类:协议基础

串行线路IP全称是:Serial Line IP。它是一种在串行线路上对IP数据包进行封装的简单形式,在RFC 1055中有详细描述。SLIP适用于家庭中每台计算机几乎都有的RS-232串行端口。

还是先看看SLIP的封装格式:

1

1)、IP数据包一个称作END(0xc0)的特殊字符结束。同时,为了防止数据报到来之前的线路噪声被当成数据报内容,大多数实现在数据报的开始处也传一个END字符,这样做的目的是:如果有线路噪声,那么END字符将结束这份错误的报文。这样当前的报文得以正确的传输,而前一个错误报文交给上层后,会发现其内容毫无意义而被丢弃

2)、如果IP数据包中某个字符为END,那么就要连续传输两个字节0xdb和0xdc来取代它。0xdb这个特殊字符被称作SLIP的ESC字符,但是它的值与ASCII码的ESC字符不同。

3)、如果IP数据包中某个字符为SLIP的ESC字符,那么就要连续传输两个字节0xdb和0xdd来取代它。

链路层-已废弃的封装格式:尾部封装

2009年04月13号 23:39  |  分类:协议基础

RFC 893描述了另一种用于以太网的封装格式, 称作尾部封装。这是一个早期BSD系统在DEC VAX机上运行时运行时的试验格式,他通过调整IP数据报中字段的次序来提高性能。在以太网数据帧中,开始的那部分是变长的字段(IP首部和TCP首部)。把他们移到尾部(CRC之前),哈哈,前面忘了说CRC是什么东东。我们称其为:CRC检验码,一种验证数据包的机制。判断,从遥远网络传来的数据,是否是正确的(中国到美国够远了吧,还要走海底线缆)!其算法好像是:二进制反码求和(记不清了,抱歉!)。

把协议首部移到数据的尾部,这样一来,当把数据复制到内核时,就可以把数据帧中的数据部分映射到一个硬件页面,节省内存到内存的复制过程。TCP数据报的长度是512字节的整数倍,正好可以用内核中的页表来处理。两台主机通过协商使用ARP扩展协议对数据帧进行尾部封装。这些数据帧需要定义不同的以太网帧类型值。

现在,尾部封装已被废弃,我也不知道原因!

Pages: 1 2 Next