8

《深入理解Android:Wi-Fi、NFC和GPS卷》勘误

 3 years ago
source link: https://blog.csdn.net/Innost/article/details/26979289
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

《深入理解Android:Wi-Fi、NFC和GPS卷》勘误

original.png
阿拉神农 2014-05-25 21:23:36 11839

请看博主的置顶博文下载资源

段昌志兄认真阅读了几遍,还把所有的反馈给集中整理了下。非常感谢,一本真正的好书是需要作者和读者一起努力打造才可以创造的!感谢段兄,感谢所有兄弟

感谢段昌志兄的细心反馈,不论前期如何细致,书写过程还是有一些错误。此处整理下段兄所反馈的错误。

时间稍紧,以后再针对此处的bug进行回复。

倒数第4行

“然后查看下网络内部是否有其他主机再用”

这里出现错别字”再”

页面中部介绍伪终端的时候出现拼写错误.

“伪终端(psuedo terminal)”

应该是pseudo terminal

psuedo这个单词从有道词典中仅能查到网络释义,我又百度了下UNIX伪终端,发现拼写确实错了,应该是pseudo terminal

在讲802.11c和802.11d的时候对LLC的翻译不太准确.

这里把LLC翻译为链路连接控制

协议上LLC的全称是logical link control,一般都翻译为逻辑链路控制

在图3-3下面的第5行中说”在RTS帧中会说明要发送的数据帧的长度”,在下面一行中说”在CTS帧中也附上站A欲发送的数据帧的长度(从RTS中将次数据复制到CTS中)”

但是我在具体的RTS和CTS帧中都没有知道这里说的数据帧的长度.

RTS帧如下:

CTS帧如下:

根据协议(IEEE Std 802.11 - 2007)来看,在RTS的帧格式中也没有发现传输数据长度的表示字段,倒是发现了一个Duration字段,但是这个字段表示的是时间,也就是说这个RTS预约了多少时间用于传输后续的数据或者管理帧,加上CTS帧和ACK以及SIFS的时间.

具体协议是这么描述的(在协议的72页):

For all RTS frames sent by non-QoS STAs, the duration value is the time, in microseconds, required to transmit the pending data or management frame, plus one CTS frame, plus one ACK frame, plus three SIFS intervals.

CTS也是同理,也没有发现传输数据的帧长度这个字段,同样存在Duration字段,也是表示时间.

我翻译的不好,具体协议是这样描述的(协议73页):

For all CTS frames sent in response to RTS frames, the duration value is the value obtained from the Duration field of the immediately previous RTS frame, minus the time, in microseconds, required to

transmit the CTS frame and its SIFS interval. If the calculated duration includes a fractional microsecond, that value is rounded up to the next higher integer.

另外发现,在本书的P91上你也描述了RTS,这里的描述就是根据协议描述的了.

“非QoS情况下,很明显那些UP较高的数据见得到优先处理.”

这里是错别字.应该是”就”

在(3)Address域下面的第4行:

“0~23位是厂商向IETF等机构申请用来表示厂商的代码”,查了下资料,发现MAC中的OUI应该是向IEEE申请的吧.

我找了协议和百度百科的资料如下:

在IEEE Std802.11 – 2007的P128页上有这么一句:

在百度百科的如下地址:

http://baike.baidu.com/link?url=uag8NiziyQTNjzYpMrDGQrSSLl00nMQMHKYZWs73g3EMy7ibaNOLUw7NEfANsf4K

中说到:组织唯一标志符(OUI)是由电器和电子工程师协会(IEEE)分配给单位组织的,它包含了24位(3字节)。各个单位组织依次被分配一个全局管理地址(24位,或3个字节),对于厂家生产的每一块网卡来说,这个地址是唯一的。

在页面最下方的”提示”的后半行”因为Wi-Fi以空气为传输媒介”

这里表达不严谨.

Wi-Fi是采用射频传输,也就是电磁波.电磁波可以穿过空气,真空,水泥等物体传播,只是这些物体对电磁波造成的衰减不一样.

比如卫星通信,也是采用电磁波,但是太空中已经是真空了;再比如火星探测器在火星上向地球传输信号.

在1.WEP介绍中说到"WEP是802.11规范的元老,在1999年规范诞生..."

规范是1997年出来的.

本页文字的第10行

“XOR操作后的数据即图3-29所示的Encrypted部分”

引用错误,从上下文理解以及核对图3-29,发现这里引用的应该是图3-31.

在"规范阅读提示"下面的第三行中,"WPA采用了新的MIC算法"

这里的MIC的解释应该是Message Integrity Code,

见协议(802.11-2012)第21页上有MIC的解释:message integrity code

通常会译为"消息完整性验证码"

建议还是按照协议.

图3-36下面第一行的括号中:

"EAP Over LAN, 基于LAN的扩展EAP协议"

本身EAP中的E就是扩展的意思,P就是协议的意思.

这里应该解释为”基于LAN的EAP”吧.这样感觉拗口,还不如说”基于LAN的扩展认证协议”呢

倒数第6行首次出现”RSNE”,前文中没有对此做出解释.

根据802.11-2012协议来看RSNE是robust security network element

图4-11时,解释struct wpa_supplicant时:

a).解释l2时,说L2是Link Layer的缩写.这么说没错.但是对于初学者可能不理解为什么l2是Link Layer.我觉得解释l2 是Layer 2,也就是”层2”更好一些.然后再说明一下层2是数据链路层,层3是网络层.

b).解释own_addr时,说ETH_ALEN个数为16. 但是ETH_ALEN表示MAC地址长度,是6字节,48bit.

c).在解释第9个成员变量bssid时,有错别字吧.说”元素各位为ETH_ALEN”,应该是”元素个数”吧.

d).在解释第12个成员变量disconnected时,有错别字”链接”,应该是”连接”.

第5行解释countermeasures的时候引用了MIC,括号说是(Message Integrity Check),在<<802.11-2012>>第21页中有解释:

我们通常把MIC称之为消息完整性校验码,这里的C应该是Code的意思.

建议还是参考上面协议的说明.

图4-19中解释成员变量own_addr的时候说”ETH_ALEN,值16”:

ETH_ALEN是MAC地址的长度,是6个字节,48bit.

在[àstate_machine.h]下面的第一个注释部分,把EAP SM写成了EAP SSM,如下:

“而STATE_MACHINE_DATA也是一个宏.对与EAP SSM来说”.

第7行最后几个字:

“所有,直接来看”

这里应该是”所以”

中间部分的wpa_supplicant_set_state()这句后面的主是中”设置wpa_sm装为WPA_ASSOCIATED”

这里出现错别字

第二行注释的后半部分:

“将状态机一系列动作”

这里感觉语句不顺,猜了半天也没明白什么意思.

倒数第11行,分析eapol_sm_notify_portEnabled的时候,函数原型少了左边括号.应该是

void eapol_sm_notify_portEnabled(struct eapol_sm *sm, Boolean enabled)

“的IE信息对于nl80211来说…………..”

这里感觉不通,应该在”的IE信息”后有逗号.你从个前面一页的最后一行开始读一下感觉感觉.

在4.6.1本章总结中的第6行

“该流程实际上包含的代码远比书中给多”

这里语句不通顺,应该是”远比书中给的多”.

倒数第10行,在块注释中解释RSSI的时候少了个顿号

“WPAS支持的RSSI信息包括:接受信号强度、连接速度(link speed)噪声强度(noise)和频率”

在连接速度(link speed)后面少了顿号

第19行,讲WifiApConfigStore的时候

“配置信息存储于/data//misc/wifi/softap.conf”

这里在/data后出现了2个/

在wifi_start_supplicant()中的第12行

“//P2P _PROP_NAME值为….”

这里在P2P后多了个空格

最后缺少句号.

我对比了其他地方,这里确实需要一个句号.

在5)的地方下面一行

“初始化WPS相关的信息、设置WifiState”

我感觉这里WPS拼错了.因为我研究了下这个函数,没发现有WPS相关的代码,应该是WPAS.

“并为  该WLAN添加无线设备”

这里多了个空格.

倒数第7行中间:

“这个流程讲涉及M1~M8相关的知识.”

这里有错别字,应该是将

第7行最后:

“wpas_wps_ssid_wildcard_ok”

这里函数被加粗,但是第一个字母w没有被加粗.

格式上不一致.

在case EAP_CODE_REQUEST下面的第5行后半句

“ESC_Start属于扩展EAP协议”

这个问题在前面一章提出过,就是EAP本身就是扩展认证协议的意思,

这里再说是扩展EAP协议有点重复了.

中间部分介绍wps_get_msg下面的那句话中把WPAS拼错了.我当初也经常拼错.

“我们在前面已经介绍过M1~M8的内容.在WAPS的代码中….”

图6-7下面第一段

“虽然EAP-WSC最终以EAP-Fail帧结束,但是…”

这里一整段,我说下自己的理解.

规范中说,最后的EAP-Fail帧是故意发出来的,目的是终止EAP的交互,也通知上层已经结束了EAP交互.Station在收到此帧后需要主动断开与AP的连接.然后用拿到的密码等重新开始普通的连接和四步握手.

以下是规范的节选:

P31 (WPS规范2.02版)

倒数第7行

“if (data->state == WAIT_FRAG_ACK) {……//MF标志位的处理}”

这里注释的不太对,应该是处理处理WAIT_FRAG_ACK的东西.

表7-4 OUI SubType取值

在表右边第2列的Type中又列出来一遍4 P2P Invitation Response这个字段的介绍,因为在左边那列最后已经列出来了.这是重复了.

我看到这里的时候还仔细看了下这2个有何不同呢.

在讲GO Intent的时候说

“该字段长1字节,目前使用的仅是该字节的前八位”

这里,一字节不就8位吗,所以这里描述为”使用的是该字节的前八位”感觉不妥.

根据协议来看,这一个字节确实没有用满,用最低位的一个bit表示Tie Breaker,用4bit表示Intent,因为最大值是15,因为4bit也就够了.

下图是我的GO Intent,这个字节的值是0C,所以GO Intent是6,Tie Breaker是0

倒数第3行

“Tie Breaker为随机值,所以两个设备的Tie Breaker取值相同的几率非常低”

我感觉取值相同的几率不是太低啊.

Tie Breaker只是1bit,取值只能是0和1,那么就存在下面4种取值情况

00    01    10    11

从上面看,这个Device都取0和都取1的情况就是50%的概率了.

倒数第6行

后半部分”它在P2pEnabeldState中被处理,wpas_supplicant将发起P2P Device Discovery流程…..”

这里把wpa_supplicant拼错了.

图7-29中的p2p_config描述中提到了dev_addr的类型和长度

dev_addr就是一个MAC地址,所以类型肯定是char,代码中显示是u8,也就是unsigned char,长度是6字节.

所以书中描述是int数组和长度是8字节是不对的.

在wpas_start_llisten的讲解中第3行

“调用deriver_nl80211.c的wpa_driver_set_ap_wps_p2p_ie函数,它用于将Probe Response帧信息和Association Response帧信息.”

上面这句话不通,说了一半就没了.所以看不懂什么意思.

在这一页的”提示”那一栏中提到接收PD Request的P2P Device不支持发送者设置的WSC Config Methods时,为什么不在PD Response帧中设置Config Methods为自己所支持的WSC方法呢.

经过分析代码和研究,我发现是如下的原因,他这样设计是合理的.

首先,在P2P Device发送PD Request的时候把自己所支持的所有的WSC Config Methods都列出来,也就是说都放在这个帧中发出去了.这个属性在PD Request帧中的P2P Device Info中,如下图:

build这个P2P Device Info的代码如下:

p2p_buf_add_device_info()

从这里看出,正好和上面的空口信令中抓到的Config Methods是一致的,也就是说,发出PD Request的一方把自己支持的所有方法都给出了.

那么在接收这个PD Request的P2P Device是怎么处理的呢.

看如下的函数:

p2p_process_prov_disc_req()

在这个函数中,接收PD Request的P2P Device的设备在process这个PD Request的时候,把Request中的config_methods和自己所支持的所有的方法匹配一下看看是否有一种方法能匹配上.

如果一种都匹配不上,那么这里就走goto out了.再来看goto out:

上图中,如果接收PD Request的Device自己所有的方法都无法与发送者匹配,那么这里在build PD Resp的时候就会把config_methods填0.

因为自己所有的方法都不匹配了,也就不用给出自己支持的方法了.

从机制上来说,发送者给出了自己所有的支持的方法,那么接收者用自己所有的方法去匹配,发现匹配不上,所以这里直接给出0就结束了.再给出自己支持的方法,发送者也解决不了问题.

在7.4.4这个标题上面的那行有错别字

“现在来看本章关于P2P的最后一到工序”

感谢博客上的好友...

p450页的图8-6上面TNF应该是3bits而不是2bits。
p453页的表8-5status的说明,第7位为0,表示的是utf-8编码。好像书中写反了吧。
p453页的图8-8中的text的那个字符串应该是“Hello,World!”吧,如果是“Hello Word”的话,好像PayLoad Length字段不对。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK