日志分类:协议基础

链路层-环回接口

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扩展协议对数据帧进行尾部封装。这些数据帧需要定义不同的以太网帧类型值。

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

链路层-协议首部(3)

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

上一讲提到了以太网帧的最小长度问题,为什么要定义最小长度呢?为什么最小长度是64字节呢?

这是由以太网的工作模式(CSMA/CD)决定的!传送一个数据帧的时间必须大于碰撞检测所需的最大时间。否则,碰撞检测还没完毕一个数据帧就发送出去了,结果导致碰撞发生,又得重传这个数据帧。传送64字节的数据帧,通常情况下是大于碰撞检测所需的时间!有一个东西,得提一下,一旦碰撞发生,当事主机会随机选择一个延时,重传数据帧!

这一讲我们的主要的任务是通过sniffer手段,来加深对以太网首部的认识!实践。。。。请看下图:

 

sniffer的链路层首部

第一行,就是目的地址(FFFFFFFFFFFF),为什么这里的目的MAC全是F,我们以后会详加解释!目前,大家只需要记住,全F的MAC地址,就是二层的广播地址!

第二行,就是源地址(00FFFFFFFFFF),也就是Toad电脑中网卡的地址。

第三行,就是类型字段了,大家可以看到这是一个ARP包的链路层首部代码是0806。

链路层-协议首部(2)

2009年04月12号 02:50  |  分类:协议基础

      我们先看看以太网和IEEE 802的封装格式:

以太网和IEEE 802封装格式

两种帧格式都采用48位的目的地址和源地址。这就是我们平时所说的硬件地址。ARP和RARP协议分析对32位的IP地址和48位的硬件地址进行映射。

接下来的2个字节在两种帧格式中不相同。在802标准定义的帧格式中,长度字段是指他后续数据的字节长度,但不包括CRC检验码。以太网的类型字段定义了后续数据的类型。在802标准定义的帧格式中,类型字段则由后续的子网接入协议的首部给出。幸运的是,802定义的有效长度值与以太网的有效类型值无一相同,这样,就可以对两种帧格式进行区分。

以太网首部中,类型字段之后就是数据;而在802帧格式中,跟随在后面的是3字节的802.2LLC和5字节的802.2 SNAP。目的服务访问点和源服务访问点的值都设为0xaa。Ctrl字段的值设为3。随后的3个字节org code都置为0。再接下来的2个字节类型字段和以太网帧格式一样。

CRC字段用于帧内后续字节差错的循环冗余码检验。

802.3标准定义的帧和以太网的帧都有最小长度要求。802.3规定数据部分必须至少为38字节,而对于以太网,则要求最少要有46字节。为了保证这一点,必须在不足的空间插入填充字节。在开始观察线路上的分组时将遇到这种最小长度的情况。

Pages: Prev 1 2 3 Next