五 Wireless LANs(Wi-Fi)
如今非常流行的一种接入互联网的方式就是Wi-Fi了,我们用的ipad、手机、笔记本电脑等等都可以用这种方式接入互联网,非常方便灵活。一个典型的Wi-Fi网络如下图所示,一些基本概念大致了解。
1. 802.11标准帧格式
802.11标准规定了Wi-Fi帧格式,如下图所示,当然,并不是每一种类型的帧都具备所有的部分。
一开始的preamble是用来同步的,它依靠于使用的802.11版本,PLCP提供对应的物理层的一些信息。我们姑且认为这两个部分是与物理层相关的一些细节,不用太关心,主要来看MPDU,它类似于以太网帧格式,但是又添加了一些别的东西。MPDU的开始部分是帧控制字 (Frame Control Word),占据两个bit,用来表示帧类型。帧类型一共有三种,管理帧(management frames),控制帧(control frames)和数据帧(data frames)。
(1)管理帧(management frames)
管理帧用来创建、维持和结束设备和接入点(AP)之间的连接,它也能决定是否使用加密,网络的名称(SSID/ESSID),支持的传输速率以及共同的时基等。这些帧用来提供当一个wifi设备寻找附近的接入点时所必须的信息。
(2)控制帧 (control frames)
控制帧能进行流量控制,即当发送方发送数据速度太快时,接收方告知发送方使其速度慢下来。当接收方收到一帧数据时,可以通过控制帧给发送方发送确认信号,告知它已经成功接收。这和TCP协议比较相似。控制帧还能提供一个可选的功能,request-to-send(RST)/clear-to-send(CTS)。工作过程大概是这样的,在发送数据之前,发送方先发送RST表明自己希望发送数据,接收方接收到该RST之后,反馈一个CTS,即清除发送请求,表明自己愿意接收数据,然后发送方开始发送数据,没发送一帧,接收方发送一个确认信号。
无线传输之所以需要确认信号,是因为传输的数据很容易丢失。如果发送方发送数据之后在一定的时间之内没有收到确认信号,则认为该数据丢失,重新发送该数据,并把Frame Control Word里的Retry部分置位。这样接收方知道发生了什么,如果收到两份同样的数据,能够做出相应的处理。
(3)数据帧(data frames)
2.节能模式和Time Sync Function(TSF)
节能模式让设备的无线接收电路在某些时候关闭,没有进入节能模式时,接收电路一直运行,不停的消耗能量。当进入节能模式时,在Frame Control Word中对应位将置位,然后发送出去,与之连接的AP接收到这些置位的数据帧之后,会将原本应该发送到该设备的帧数据先存到缓存中,等到设备需要时再发送给它。
这里有个同步的问题。wifi协议是使用TSF来进行时间同步的。
3. 802.11介质访问控制(Media Access Control)
还记得之前讨论以太网的时候介绍了一种CSMA/CD协议,那是一种介质访问控制(Mac)协议,用来解决多设备同时传输数据时的冲突问题,同样,在Wi-FI协议中,也需要类似的协议。802.11标准有三种方法去控制无线媒介的共享问题:PCF,DCF,和HCF。我们这里主要介绍DCF(distributed coordinating function)。DCF是一种基于竞争的媒介访问控制协议,与CSMA/CD类似,设备在发送数据之前检测媒介是否空闲,如果空闲则发送数据,否则等待一段时间知道检测到媒介是空闲为止,不同的地方在于,DCF为不同的设备或者不同类型的帧设置了不同的优先级。通常情况下,设备在检测到媒介空闲,准备发送数据之前,会等待一段时间(distributed inter-frame space or DIFS),让更高优先级的设备接入信道。另外还有个不同的地方在于,DCF有两种检测冲突的方法,物理的方法(physical)和虚拟的方法(virtual carrier sense)。
(1)虚拟冲突检测(virtual carrier sense)
在802.11标准Mac协议中,虚拟冲突检测机制实际上就是观察mac帧数据中的Duration字段。设备会监听哪怕不是发给自己的数据,甚至是在RTS和CTS中也携带Duration字段,当然,数据帧中肯定也是有的,它表示该帧数据知道传输结束所需要占据媒介的时间。也就是告诉别的设备我这帧数据传输完需要多长时间,传输完了你们就可以准备传输自己的数据了。
这个值是根据帧的大小、传输速率以及物理媒介等信息来估算的。每个设备都会在本地生成一个NAV(Network Allocation Vector)用来保存当前媒介中正在传输的数据需要多长时间才能传输完,以此决定自己尝试传输数据的时间。如果检测到的Duration值大于本地NAV值,显然要用这个大的值对其进行更新,当然,随着时间的推移,NAV值要慢慢减小,这表示当前传输数据里目的地越来越近,但只要非0,则该数据仍然占据传输媒介,当收到ACK确认信号时,说明已经传输完成,这个时候将NAV置0.
(2)物理冲突检测(Physical Carrier Sense or CCA)
这是通过物理的方法来检测冲突,不同的传输媒介会提供各自的方法。需要注意的是,MAC层通过物理的方法和上面所说的虚拟检测的方法结合来判断冲突的。
(3)DCF Collision Avoidance/Backoff Procedure
在设备检测到媒介空闲时,会等待一段时间,然后开始发送数据。这里,等待的这段时间,通常是一个随机的整数值和一个叫做slot time的值相乘的结果。slot time是几十微秒的数量级,随机的整数值在一个固定的范围之内。这和我们之前讨论的CSMA/CD中,当检测到冲突后,等待一段随机的时间再尝试发送有点类似。这个过程(产生随机等待时间的过程),称为backoff procedure.
在无线环境下,因为接收设备和发送设备很难同步,所以通常用冲突避免(collision avoidance),而不是冲突检测。并且,当接收到一帧数据,需要返回一个ACK确认信号时,通常只会等待非常小的一段时间(普通设备正常情况下等待DIFS时间,ACK等待时间小于DIFS),并且,不管此时媒介是忙碌或是空闲,只要成功接收到一帧数据,都是等待这样非常小的一段时间就立即发送,我们说,ACK帧具有更高的优先级。同样,RTS和CTS也有相似的性质。
4.物理层细节
5.Wi-Fi安全
六 点对点协议(PPP)
1.LCP协议(Link Control Protocol)
PPP帧的Protocol字段被置为固定值0xC021,以此来表示这是LCP帧数据。Ident字段是一个序列号码,它由发送方提供。发送方每发送一帧数据,都会提供一个特定的Ident值,并且随着更多的数据发送,Ident值对应增加。在接收方没收到一帧数据时,需要对其作出应答,这时接收方会将收到的数据里的Ident值复制到应答数据里,反馈给发送者。这样发送者就知道哪些数据被正确接收,而哪些数据没有。Code字段表示操作类型,标识该帧是请求帧还是应答帧等等。Lenghth字段表示LCP packet的长度,单位是字节。需要注意的是,该字段是有LCP packet提供的,普通的PPP协议并不提供该字段。
通过上图,我们可以对LCP协议有个更加直观的了解。LCP协议通过两个对等端的交流协商,负责两者之间链路的创建、维护和终止。典型的交换内容如上图所示,包括自身的配置,身份验证,已经终止连接等。
在LCP协议建立连接的过程中,发送方和接收方协商的内容之一是某些选项是否设置。Asynchronous Control Character Map(ACCM)就是其中之一,它用来设置某些控制字符(比如0x00-0x1F范围内的ASCII字符)需不需要转义。转义的意思就是将原本的字符内容变为转义字符(0x7D)加上原字符与(0x20)作异或的结果。比如0x13的转义字符是0x7D33.这样做是因为某些控制字符可能会对硬件造成某些特殊的影响,转义之后,这种影响将消失。默认情况下,所有的ASCII控制字符(值小于0x20)都要进行转义。
由于PPP没有长度字段(Length),因此理论上没有什么办法来限制PPP帧数据的长度。在实际应用中,最大帧长度通常是通过指定MRU来限制的,这有点类似于MTU,最大路径传输单元。当比较大的帧数据和比较小的帧数据同时在链路中传输时,大数据将占据大部分带宽,这导致小的数据传输速度变慢。在某些应用中,比如远程登录或者VoIP,需要传输的都是小的数据,在这样的环境下可能就会变得不太正常。通过减小MRU可以改善这种现象,当然,这样会导致数据传输效率降低,因为每帧数据都有帧头部分。
PPP还支持一种叫做Link Quality Reports(LQRs)的机制。在协商过程中,通过配置信息,PPP可以将该功能开启,这样发送端和接收端可以在规定的时间内周期性的交换LQR信息。LQRs表示传输质量的相关参数,包括:magic number,发送和接收的帧数量和大小,接收到的错误帧数量,丢弃帧的数量以及交换的LQR数据总数量。LQRs信息的交换是周期性的,这个周期是可以手动设置的。当LQRs的值没有达到某个要求时,我们还可以设置终止连接
一些PPP实现还支持回调(callback)能力,典型的异步回调过程如下图:
2.多链路点对点协议(Multilink PPP or MP)
用来将多个点对点链路连接成为一个,就好像我们之前介绍过的将多个端口聚合成为一个端口一样。一个聚合的链路,我们称之为一个捆绑(bundle),操作起来就像一个完整的虚拟链路一样,它拥有自己的配置信息。当然,实际上这个捆绑是由许多成员链路组成的,每个成员可能都拥有自己的一些设置选项。
实现MP最直观的方法就是轮流从成员链路中发送数据,但是这样会给其他协议带来不好的影响。所以通常在每个MP帧中放置一个2到4字节的序列头字段,然后远程的MP接收者负责按照顺序重新组装数据。
我们可以从上图看到,有一个开始(B)和结束(E)字段,以及序列数字字段(sequence number),如果一帧数据没有分片(fragment),那么B和E位都置为1,否则,在第一个分片数据内,B置为1,E置为0,最后一个分片数据内,B置为0,E置为1.在中间的分片中,B和E都置为0,并且按照序列号码进行排序。
因为MP捆绑跨越躲过成员链路,因此需要有种方法来确认哪些链路属于同一个捆绑。PPP通过设置endpoint discriminator选项来确定,该值可以是IP地址或者mac地址。
另外,BAP协议可以动态的从一个捆绑中添加或者删除某个链路,BACP能获取BAP过程所必须的信息。这样使得一个捆绑根据实际情况(比如网络是否拥塞)动态的添加或者删除链路,使得虚拟链路更加灵活。
3. 压缩控制协议(Compression Control Protocol) CCP
压缩控制协议负责在PPP链路上的两端配置并协商使用哪种压缩算法。并且用可靠的方式来标志压缩和解压缩机制的失败。
4. PPP身份验证
PPP定义了一个课扩展的LCP版本,支持协商身份验证协议,这样路由器在允许网络层协议通过链路传输数据前需要验证对方的身份。
5. 网络控制协议(Network Control Protocols)NCPs
用来建立和配置不同网络层的协议。
6. 头压缩(Header Compression)
六 环回接口
大多数的产品都支持环回接口,以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。A类网络号127就是为环回接口预留的。通常,大多数系统吧IP地址127.0.0.1分配给这个接口,并命名为localhost。一个传给环回接口的IP数据报不能再任何网络上出现。可能在我们的想象中,一旦传输层检测到目的端地址是环回地址时,应该可以省略部分传输层和所有网络层的逻辑操作。但是大多数的产品还是照样完成传输层和网络层的所有过程,只是当IP数据报离开网络层时把它返回给自己。看上去用传输层和IP层的方法来处理环回数据似乎效率不高,但它简化了设计,因为环回接口可以被看做是网络层下面的另一个链路层。网络层把一份数据报传送给环回接口,就像传给其他链路层一样,只不过环回接口把它返回到IP的输入队列中。
七 最大传输单元MTU
数据链路层对数据帧的长度都有一个限制。比如以太网的数据帧最大不超过1500字节,这个数值就叫做MTU,最大传输单元,不同类型的网络都有一个MTU。如果IP层有一个数据要传,而且数据的长度比链路层的MTU大,那么IP层就需要进行分片,把数据报分成若干片,这样每一片都小于MTU。在PPP中的MTU并非指的是网络媒体的物理特性,相反,它是一个逻辑限制,目的是为交互使用提供足够快的相应时间。
当在同一个网络上的两台主机互相通信时,该网络的MTU是非常重要的。但是如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU,这时起决定作用的是两台通信主机路径中最小的MTU,称之为路径MTU。需要注意的是,两台主机之间的路径MTU不一定是个常数。它取决于当时所选择的路由,而选路不一定是对称的,因此路径MTU在两个方向上不一定是一致的。后面提到IP层和传输层时,还会介绍MTU发现机制。