链路层

互联网的底层基于包交换(packet-switched),而不是链接。技术上分为WAN和LAN。

链路层是TCP/IP协议栈的最底层。TCP/IP支持很多不同的链路层协议,这取决于网络所使用的硬件,如以太网、令牌环网、FDDI(光纤分布式数据接口)及RS-232串行线路等。我们只关注常见的几个。

1. 以太网

局域网出现过很多种协议,FDDI、ATM。很多已经被淘汰,以太网已成为最常见的局域网网络。最早是用同轴电缆(coaxial cable),最远能传输500米,然后大部分被双绞线(twisted pair cable)取代。双绞线去掉了屏蔽层,更容易被干扰,虽然只能传输100米,但是更便宜和更容易安装。

最开始以太网公用一条线路的时候,电脑可以访问共享的线路(shared medium)不需要任何的确认和同步。这个方法叫做:carrier sense, multiple access with collision detection (CSMA/CD),是一个MAC协议(Media Access Control)。

TCP/IP协议栈是没有物理层的概念,物理层的标准由IEEE做了规范。Institute of Electrical and Electronics Engineers(IEEE)是美国的电子电气工程师协会。所有的IEEE 802标准是为了满足家庭和企业网络的应用;802随着时间发展出了很多协议,其中最广泛的是802.3(essentially Ethernet)和802.11(WLAN/Wi-Fi)。在IEEE的设计概念里,是有物理层的。

以太网的速度和cpu的速度是相伴相生的。cpu速度的提高促进了更高速的以太网。

以太网帧(Ethernet frames)

Ethernet II最常使用的格式。是几家大公司协定的协议,随后被IEEE标准化为802.3。最开始标准和实际还是有细微局别,最后IEEE标准允许其中一个字段既可以为Length也可以为Type。当Ethernet II定义的EtherType大于等于1536(ox0600),这两种格式就能同时在一个物理媒介上运行。

IEEE 802.3 packet and frame format: 1

IEEE Packet是物理层相关的,preambleSFD都是物理层使用的。preamble是交替的1和0,像这样10101010 10101010 10101010 10101010 10101010 10101010 10101010,SFD 是0xAB,标识preamble的结束。这些数据用来让接受者的电路做clock recovery。暂未做深入分析,涉及物理层。

最初以太网位编码是用Manchester Phase Encoding (MPE)。用电压变化而不是绝对值表示0或1。 -0.85到+0.85V表示0,+0.85v到-0.85v表示1。 IEEE 802.2

和tcpip协议相关的一些IEEE 802标准:

Name Description Official Reference
802.1w Rapid Spanning Tree Protocol (RSTP) [802.1D-2004]
802.2 Logical Link Control (LLC) [802.2-1998]
802.3 Baseline Ethernet and 10Mb/s Ethernet [802.3-2008] (Section One)
802.3u 100Mb/s Ethernet (“Fast Ethernet”) [802.3-2008] (Section Two)
802.3z/802.3ab 1000Mb/s Ethernet (“Gigabit Ethernet”) [802.3-2008] (Section Three)
802.3ae 10Gb/s Ethernet (“Ten-Gigabit Ethernet”) [802.3-2008] (Section Four)
802.11a 54Mb/s Wireless LAN at 5GHz [802.11-2007]
802.11b 11Mb/s Wireless LAN at 2.4GHz [802.11-2007]
802.11n 6.5–600Mb/s Wireless LAN at 2.4 and 5GHz using optional MIMO and 40MHz channels [802.11n-2009]

物理地址

48bit的物理地址,也分为三类,单播地址,广播地址,组播地址。

Frame sizes

最小64字节,如果不够,会在末尾加pad,这在之前CSMA/CD上很有用。一个空的TCP包是60直接,所有会有pad。传统以太网最大为1518字节。一种提高大数据传输性能的方法是使用非标准的巨型帧,但是只能在特定环境下使用,因为大多以太网设备不支持。

以太网帧之间还有12个字节的空隙。所以frame efficiency是1500/(12+8+14+1500+4) =0.975。大约98%。

桥接和交换机

最早的集线器(HUB)或中续器,只是在电信号层面的广播,数据包会发送给所有的端口。现在基本是交换机来扩展局域网,以加入更多的电脑。交换机可以在packet的基础上,只对目的包的端口发生数据。交换机本质上就是高性能的桥接。对网口桥接就是将多个网口当做一个交换机。 2

交换机会对每个端口自动映射对应的mac地址,存储在filtering databases。当第一次启动,database是空的时候,交换机会将数据包拷贝多份,发送到每个交换机端口。 3 多个交换机并且有循环的links。可能造成广播风暴(broadcast storm)。STP协议可以解决这个问题。 3

路由器实现了网络层,比交换机拥有更多的功能。如下图,不过这是理想情况下,实际上路由器为了方便管理,一般都有web界面,实际上是实现了应用层的。

4

在linux中可以通过brctl命令,进行桥接的操作。

vlan和QoS

802.1q标准定义了virtual LANs,用于将大局域网拆分成更小的局域网。接入同一交换机的两个不同vlan的电脑,需要一个路由来支持流量隔离。所以支持vlan的交换机需要一定程度的路由功能,比普通交换机会贵点。

802.1p扩展了802.1q,提供了QoS(Quality of service)优先级的定义。。Qos指的是流量优先级和resource reservation control mechanisms,不是能达到服务质量。但是如何处理不同优先级的packet,没有统一规范,不同路由器支持配置不同的等待队列,每个队列的优先级和保留带宽等。

QoS对实时视频很重要。

QoS应用,IPTV,需要稳定的传输速率和低延时。不能降低传输速率来避免拥塞。电信的网络和电视就分属于不同的vlanId。看电视和上网需要插入对应的lan口上,如果家里拉线,只拉了一根线,那么只能上网,或者只能看电视。用支持vlan的交换机,就能够单线复用了。

2. PPP

点对点协议(Point-to-Point Protocol)也是一种链路层协议,包含了一系列协议。用来在两个路由器之间,中间不包含其它任何主机上建立连接。PPP可以在多种物理网络上运行,串行线路、电话线、光纤等。

可以提供连接认证,传送机密和压缩。 常用来在串行线路(serial links)上从低速的dial-up modems到高速的optical links发送IP数据包。

The PPP basic frame: 5

因为是点对点的线路,Addr和Control都是固定值,甚至可以去除。

点对点协议和P2P是两个不同的东西。P2P传输是一种区别于client-server的网络应用方式。比如BitTorrent,就能在用户之间建立TCP链接,来加快文件的下载。

PPPoE

ppp over Ethernet(PPPoE)。当广域网的连接设备充当桥接的时候。通过PC来建立PPP链接

PPPoE的示意图 6 DSL电话网络已经很少了,现在都是光纤入户。除了DSL Modem换成光猫,原理还是差不多。

全双工 ,自动协商

windows电脑在以太网配置->高级里面可以看见。

Linux# ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
Supports auto-negotiation: Yes
...

链路层重传多少次,提供多高的稳定性的争论在RFC3366。


参考

  1. TCPIP详解
  2. 单线复用、单线多用和vlan的理解:https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=309204&page=1#pid2503294
  3. Ethernet_frame: https://en.wikipedia.org/wiki/Ethernet_frame https://en.wikipedia.org/wiki/Ethernet_physical_layer
  4. Qos:https://en.wikipedia.org/wiki/Quality_of_service
  5. Point-to-Point Protocol:https://en.wikipedia.org/wiki/Point-to-Point_Protocol

Updated: