在阅读“TCP-IP协议详解”系列文章之前,建议阅读以下两篇文章,以便对互联网协议有个快速的全局了解和把握!

互联网协议入门(一)

互联网协议入门(二)

“小喇叭开始广播啦”,如果你知道这个,你一定是老一辈的人。“小喇叭”是五十年代到八十年代的儿童广播节目。在节目一开始,都会有一段这样的播音:“小朋友,小喇叭开始广播了!” 听到这里,收音机前的小朋友就兴奋起来,准备好听节目了:这一期的内容是以太网(Ethernet)协议与WiFi。

我们在邮差与邮局中说到,以太网和WiFi是链路层的两种协议。在连接层,信息以帧(frame)为单位传输。帧像信封一样将数据(payload)包裹起来,并注明收信地址和送信地址。连接层实现了“本地社区”的通信。我们先来看看以太网的帧。

以太网的帧格式

帧本身是一段有限的0/1序列。它可以分为头部、数据(Payload)和尾部三部分:

Preamble SFD DST SRC Type Payload (Data) Pad FCS Extension

帧按照上面的顺序从头到尾依次被发送/接收。我们下面进一步解释各个区域。

头部

帧的最初7个byte被称为序言(preamble)。它的每个byte都是0xAA。通常,我们都会预定好以一定的频率发送0/1序列(比如每秒10bit)。如果接收设备以其他频率接收(比如每秒5bit),那么就会错漏掉应该接收的0/1信息。但是,由于网卡的不同,发送方和接收方即使预订的频率相同,两者也可能由于物理原因发生偏差。这就好像两个人约好的10点见,结果一个人表快,一个人表慢一样。序言是为了让接收设备调整接收频率,以便与发送设备的频率一致,这个过程就叫做时钟复原(recover the clock)。

(就像在收听广播之前,调整转钮,直到声音清晰。网卡会在接收序言的过程中不断微调自己的接收频率,直到自己“听到”是…1010…)

时钟调整好之后,我们等待帧的起始信号(SFD, start frame delimiter)。SFD是固定的值0xAB。这个0xAB就好像“小喇叭开始广播啦”一样,提醒我们好节目就要上演了。

Preamble和SFD

紧随SFD之后的是6 byte的目的地(DST, destination)和6 byte的发出地(SRC, source)。这就是我们在邮差和邮局中的介绍一样,为信封写上目的地和发出地。要注意,这里写在信封上的是对地址的“本地描述”,也就是MAC地址MAC地址是物理设备自带的序号,只能在同一个以太网中被识别 (正如邮差只熟悉自己的社区一样)。

头部的最后一个区域是Type,用以说明数据部分的类型。(比如0×0800为IPv4,0×0806为ARP)

数据

数据一般包含有符合更高层协议的数据,比如IP数据包。连接层协议本身并不在乎数据是什么,它只负责传输。注意,数据尾部可能填充有一串0(PAD区域)。原因是数据需要超过一定的最小长度。

尾部

跟随在数据之后的是校验序列(FCS, Frame Check Sequence)。校验序列是为了检验数据的传输是否发生错误。在物理层,我们通过一些物理信号来表示0/1序列(比如高压/低压,高频率/低频率等),但这些物理信号可能在传输过程中受到影响,以致于发生错误。如何来发现我们的数据是正确的呢?

一个方法是将数据发送两遍,然后对比一下是否一样。但这样就大大降低了网络的效率。FCS采用了CRC(Cyclic Redundancy Check)算法。这就好像是一家饭店的老板雇佣了一个收银员,但他又担心收银员黑钱。可是每天营业额很大,老板即使坐在旁边看,也不能用记住收到的总数。所以他采取了一个聪明的办法:只记住收到钱的最后一位 (比如收到19元,老板记住9)。当有新的进账(比如13,尾数为3),他就将新的尾数和旧的尾数相加,再记住和的尾数(也就是2)。当收银员交给老板钱的时候,老板只用看总额的最后一位是否和自己记的最后一位相同,就可以知道收银员是否诚实了。如果说我们的数据是收银的总额的话,我们的FCS就是老板记录的尾数。如果两者不相符,我们就知道数据在传输的过程中出现错误,不能使用。

有FCS在盯着

上面的比喻实际上是用营业总额不断的除以10,获得最终的尾数。CRC算法也相类似。n位CRC算法取一个n bit的因子,比如下面的1011。数据序列结尾增加n-1个0。因子与数据序列的不断进行XOR运算,直到得到n-1位的余数,也就是100。该余数各位取反(011),然后存储在FCS的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

000<---数据序列末尾增加3位0
              <---因子
000<---XOR结果
            <---因子
000
00010111101100000
00000001101100000
00000000110100000
00000000011000000
00000000001110000
00000000000101000
1
-----------------
100<---3位余数

上面例子用的是4位CRC。在Ethernet中使用的因子为32位的,以达到更好的检测效果。

集线器(Hub) vs. 交换器(Switch)

以太网使用集线器或者交换器将帧从发出地传送到目的地。一台集线器或交换器上有多个端口,每个端口都可以连接一台计算机(或其他设备)。

集线器像一个广播电台。一台电脑将帧发送到集线器,集线器会将帧转发到所有其他的端口。每台计算机检查自己的MAC地址是不是符合DST。如果不是,则保持沉默(丢弃广播收到的报文)。集线器是比较早期的以太网设备。它有明显的缺陷:

1) 任意两台电脑的通信在同一个以太网上是公开的。所有连接在同一个集线器上的设备都能收听到别人在传输什么,这样很不安全。可以通过对信息加密提高安全性。

2) 不允许多路同时通信。如果两台电脑同时向集线器发信,集线器会向所有设备发出“冲突”信息,提醒发生冲突。可以在设备上增加冲突检测算法(collision detection):一旦设备发现有冲突,则随机等待一段时间再重新发送。

交换器克服集线器的缺陷。交换器记录有各个设备的MAC地址。当帧发送到交换器时,交换器会检查DST,然后将帧只发送到对应端口。交换器允许多路同时通信。由于交换器的优越性,交换器基本上取代了集线器。但比较老的以太网还有可能在使用集线器。

WiFi

WiFi的工作方式与集线器连接下的以太网类似。一个WiFi设备会向所有的WiFi设备发送帧,其它的WiFi设备检查自己是否符合DST。由于WiFi采取无线电信号,所以很难像交换器一样定向发送,所以WiFi的安全性很值得关注。WiFi采用加密的方法来实现信息的安全性。

(早期的WEP加密方法非常脆弱,建议使用WPA或者WPA2加密方法。隐藏WiFi设备ID的方法不是很有用。)

总结

我们深入了链路层协议的一些细节。连接层是物理与逻辑的接口,它的设计兼顾了物理需求(比如时钟复原,CRC)和逻辑需求(比如地址、数据)。由于连接层处于网络逻辑的底层,有许多基于连接层的攻击手法,这需要我们对连接层的工作方式有一定的了解,以设计出更好的网络安全策略。

作者:Vamei 出处:http://www.cnblogs.com/vamei

TCP-IP协议详解(2) 小喇叭开始广播 (以太网与WiFi协议)相关推荐

  1. MQTT协议详解及开发教程(四)MQTT协议报文格式

    推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT MQTT协议详解及开发教程(一)MQTT协议概述 MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建 MQTT协议详解及开发 ...

  2. iOS中 HTTP/Socket/TCP/IP通信协议详解 韩俊强的博客

    版权声明:本文为博主原创文章,未经博主允许不得转载. 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: [objc] view plaincopy //  ...

  3. TCP/IP状态详解

    今天犯懒了,本来自己也做了一些相应的笔记,但是发现这篇写的更好一些,简单易懂,而且有图有真相,为了方便以后查看,在此转载了,在此基础上加了自己的笔记                 TCP正常建立和关 ...

  4. OSI参考模型和TCP/IP参考模型-详解

    <OSI参考模型和TCP/IP参考模型> 目录 OSI七层模型 第7层-应用层 第6层-表示层 第5层-会话层 第4层-处理信息的传输层 第3层-网络层 第2层-数据链路层(DataLin ...

  5. 什么是TCP/IP UDP 详解

    文章目录 TCP/IP TCP/IP协议介绍 TCP协议 TCP应用场景 TCP 三次握手 为什么要三次握手 TCP四次挥手 为什么断开要断四次 常用的TCP端口号及其功能 IP协议 UDP协议 UD ...

  6. 杂谈——TCP/IP 协议栈详解

    说到协议栈,我们就先来看看它的定义是什么. TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输. 本帅博主之前写过一篇 ...

  7. TCP/IP入门详解--业内最佳

    文章目录 什么是协议 什么是协议簇 什么是协议栈 OSI模型和TCP/IP模型及对应协议 OSI七层模型具体作用 TCP/IP四层模型具体作用 数据封装过程 以太网帧 IP帧 TCP 帧 三次握手 四 ...

  8. TCP/IP 数据链路层详解 广播信道局域网网络

    CSMA/CD 广播信道局域网---总线型 总线型网络实在同轴电缆的链路上使用的. 必须有带冲突检测,载波监听 多路访问功能(CSMA-CD) 所有设备都在一条链路上,几乎均等,为了防止数据碰撞,在转 ...

  9. HTTP协议详解 - 通过C++实现HTTP服务剖析HTTP协议

    前言 C/C++程序员一般很少会接触到HTTP服务端的东西,所以对HTTP的理解一般停留在理论. 本文章实现通过C++实现了一个http服务,可以通过代码对HTTP协议有更深的理解,并且通过抓包工具对 ...

  10. MQTT协议详解及开发教程(一)MQTT协议概述

    推荐一款稳定的基于C编写的MQTT Client开源库<cMQTT> 一 概述 MQTT协议目前在物联网技术中应用非常广泛,各种公有云的IOT平台通信基本上都是按照该协议来实现的,这里先简 ...

最新文章

  1. Python多版本pip安装库的问题
  2. 聚类 | 超详细的性能度量和相似度方法总结
  3. boost::remove_vertex用法的测试程序
  4. 2016/1/4 学习笔记 数据类型转换 注释 语句
  5. mysql -b -e_MySQL 的B+树索引.
  6. java synchronized 关键字(1)对象监视器为Object
  7. LeetCode 809. 情感丰富的文字
  8. 小心错误使用EasyUI 让网站性能减半
  9. python中的urlencode和urldecode
  10. MONO Jexus部署最佳体验
  11. CodeVs天梯青铜Bronze题解
  12. 图的绝对中心(bzoj 2180: 最小直径生成树)
  13. LIO-SAM回环检测模块代码解析
  14. 找出数组x中的最大值和该值所在的元素下标,数组元素从键盘输入。
  15. 近期业务大量突增微服务性能优化总结-2.开发日志输出异常堆栈的过滤插件
  16. Go语言中的uint和int的区别
  17. 小傻蛋的妹妹跟随小甲鱼学习Python的第十节010
  18. java毕业设计医疗病历交互系统Mybatis+系统+数据库+调试部署
  19. 嵌入式相关开源项目、库、资料------持续更新中
  20. 2015-07-20-struts-struts2简介

热门文章

  1. 禅智听书《精进:如何成为一个很厉害的人》
  2. 【数据分享】中国城市统计年鉴_2001-2021年
  3. idea中XML注释与取消注释快捷键
  4. 树莓派添加RTC时钟模块的方法
  5. 模拟电路中晶体管阵列的性能感知公共质心布局和布线 ALIGN
  6. NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 标签格式及标准
  7. 极简Markdown程序员简历模板
  8. 【线性代数的本质|笔记】抽象几何空间、克莱姆法则及其几何解释
  9. 怎么用计算机解方程,计算器怎么解方程
  10. KNX转485模块的开发