现阶段计算机网络最好的定义:计算机网络,主要由一些通用的、可编程的硬件(不限于计算机,包括了具有网路功能的传感器以及智能家电等智能硬件,这些硬件必含有CPU)互联而成,而这些硬件并非专门用来实现某一特定目的(如传输数据、视频、音频等),能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用。
注意:MAC 用于实现 [直连] 的两个设备之间通信,而 IP 负责在 [没有直连] 的两个网络之间进行通信传输。
实体:任何可发送或接受信息的硬件或软件进程。
对等实体:收发双方相同层次中的实体。
协议:控制两个对等实体进行逻辑通信的规则的集合。协议的三要素:
服务:在协议的控制下,两个对等实体间的逻辑通信,使得本层能够向上一层提供服务。
服务访问点:在同一系统中相邻两层的实体交换信息的逻辑接口,用于区分不同的服务类型。
服务原语:上层使用下层所提供的服务,必须通过下层交换一些命令,即服务原语。
协议数据单元PDU:对等层次之间传送的数据包称该层的协议数据单元。
服务数据单元SDU:同一系统内,层与层之间交换的数据包称为服务数据单元。
多个SDU可以合并为一个PDU,一个SDU也可以划分为几个PDU。
特点:一旦建立连接后,会一直占用通信资源,直到释放连接时才会归还通信资源。
计算机之间的数据传送是突发式的,当使用电路交换传送计算机数据时,其线路的传输效率一般很低(线路上真正用来传送数据的时间往往不到10%甚至是1%)。
,故综合来看,报文交换比分组交换的转发延时要长很多,且需要交换节点具有很大的缓存空间。
若要连续传送大量的数据,并且数据传送时间远大于建立连接的时间,则使用电路交换可以有较高的传输效率。
然而计算机的数据传输往往是突发式的,采用电路交换时通信线路利用率会很低。
报文交换和分组交换都不需要建立连接(即不需要预先分配通信资源),在传送计算机的突发数据时可以提高通信线路的利用率。
将报文构造成若干个更小的分组进行分组交换,比将整个报文进行报文交换的时延更小,并且还可以避免太长的报文长时间占用链路,有利于差错控制,同时具有更好的灵活性。
物理层考虑的是,怎样才能在连接各种计算机的传输媒体上传输数据比特流。
物理层为数据链路层屏蔽各种传输媒体的差异,使数据链路层只需要考虑如何完成本层的协议和服务,而不必考虑网络具体的传输媒体是什么。
计算机内部常采用并行传输(一般数据总线的长度为8、32、64位等),网络中采用的是串行传输。
码元:在使用时间域的波形表示数字信号时,代表不同离散数值的基本波形。
1码元只能包含1个比特信息。
正交振幅调制QAM
奈氏准则:在假定的理想条件下,为了避免码间串扰,**码元传输速率(又称波特率、调制速率)**是有上限的。
要提高信息传输速率(比特率),就必须设法使每一个码元能携带更多个比特信息量,即采用多元制。
信道中的极限信息传输速率还要限于实际的信道中传输时的信噪比。
频分复用的所有用户同时占用不同的频带资源发送数据。
时分复用的所有用户在不同的时间占用同样的频带。
注意:TDM帧实际上是一段固定长度的时间,它与数据链路层对等实体间逻辑通信的“帧”,是完全不同的概念。
根据频分复用的设计思想,可在一根光纤上同时传输多个频率(波长)相近的光载波信号,实现基于光纤的频分复用技术。
目前可在一根光纤上复用80路或更多路的光载波信号,故又称为密集波分复用DWDM。
由于铺设光缆的耗资巨大,故应尽量在一根光缆中放入尽可能多的光纤,然后对每一根光纤使用密集波分复用技术。
常称为码分多址,是在扩频通信技术的基础上发展起来的一种无线通信技术。
与FDM和TDM不同,CDM的每个用户可以在相同的时间使用相同的频带进行通信。
采用CDM的系统,发送的信号有很强的抗干扰能力,其频谱类似于白噪声。
链路Link
:指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。
数据链路Data Link
是基于链路的。
当在一条链路上传输数据时,不仅需要链路本身还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
注意:计算机中的网络适配器(俗称网卡)和相应的软件驱动程序,就实现了这些协议。一般的网络适配器都包含了物理层和数据链路层这两层的功能。
1、封装成帧:指数据链路层给 “上层交付的协议数据单元PDU” 添加帧头和帧尾使之成为帧。举例点对点传输协议PPP帧。
接收方的数据链路层,如何从物理层交付的比特流中,提取出一个个的帧?
v2
的MAC帧,不需要添加帧头和帧尾,代替的是在物理层添加前导码。由于以太网v2
的MAC帧在传输时,存在帧间间隔时间,故不需要结束标志。2、透明传输:指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
为了实现透明传输,即避免出现误判,解决方式如下:
面向字节的物理链路使用字节填充(或称字符填充)的方法实现透明传输。
如下图所示,通过在非帧尾的标志前加 “转移字符”,当接收方接收到该转义字符后,直接跳过并读取下一个字符,且帧还没结束,继续向后读取…。
注意:
实际通信链路并不是理想的,即比特在传输过程中可能会出现差错:1可能变成0,0可能变成1,这被称为比特差错。
在一段时间内,传输错误比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。
使用差错检验码检测数据在传输过程中是否产生比特差错,是数据链路层所要解决的重要问题之一。
差错检测:主要有 “奇偶校验” 和 “循环冗余校验” 两种算法。
(1)在待发送的数据后面添加一位奇偶校验位,使整个数据(包含所添加的校验位在内)中 “1” 的个数为奇数(即奇校验)或偶数(偶校验)。
(2)如果有奇数个位发生误码,则奇偶性发生变化,可以检查出误码,否则无法检测出是否发生误码(即称为漏检)。
(1)收发双方约定好一个生成多项式G(x)。
(2)发送方基于待发送数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起传输。
(3)接收方通过生成多项式来计算收到的数据是否产生了误码。
注意:
使用差错检测技术(如循环冗余校验CRC),接受方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特错误)。
数据链路层向上层提供的服务类型:可靠传输服务和不可靠传输服务。
一般情况下,有线链路误码率比较低,故为了减少开销,并不要求数据链路层向上提供可靠的传输服务,即使出现了误码,可靠传输的问题也由其上层处理。
无线链路易受干扰,误码率比较高,要求数据链路层必须向上提供可靠传输服务。
从整个计算机网络体系结构来看,传输差错包括:比特差错、分组丢失、分组失序、分组重复。
注:一般 “分组丢失、分组失序、分组重复” 的传输差错,一般不会出现在数据链路层,而会出现在其上层。
可靠传输服务并不仅限于数据链路层,其他各层均可选择实现可靠传输。
可靠传输实现复杂且开销较大,故是否需要可靠传输取决于应用需求。
这三种可靠传输的实现机制的基本原理,并不仅限于数据链路层,可应用到计算机网络体系结构的各层协议。
,常称自动请求重传ARQ(automatic repeat request)
接受和发送过程正常的情况下:
当发送方发送的数据分组中途丢失,即接收方收不到数据分组时,则不会发送ACK或NAK,从而使发送方处于一直等待的ACK或NAK的状态。
为解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器,若到了超时计时器所设置的重传时间(一般重传时间略大于 “发送方到接收方的平均往返时间”),而发送方仍未接收到接收方发送的ACK或NAK,则重传原来的数据分组,该过程称为 “超时重传”。
当发送方的数据分组达到接收方,但发送方始终未收到接收方传来的ACK或NAK,即中途丢失,则会导致发送方进行 “超时重传”,但该数据分组接收方已经收到过了,从而会导致分组重复。
为了避免分组重复,则必须对每个分组带上序号,即进行分组编号。
对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组的序号不同即可,故只需一个比特来编号即可。
当出现下图所示的情况时,发送方可能误认为第二个接收到的ACK是针对数据分组DATA1的确认。
为解决上述问题,故需要对接收方发送的确认分组进行编号。
在数据链路层的点对点传输过程中,数据分组的往返时间比较固定,故不会出现确认迟到的问题,故不需要对确认分组进行编号。
总结:
接收端检测到数据分组有误码时,将其丢弃并等待发送方的超时重传。
但对误码率较高的点对点链路,为使发送方尽早重传,也可给发送方发送NAK分组。
为了让接收方能够判断所收到的数据分组是否重复,需要给数据分组编号。由于停止-等待协议的停等特性,只需1比特编号即可,即编号0或1。
为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组编号。数据链路层一般不会出现ACK分组迟到的情况,故数据链路层实现停止-等待协议可以不用给ACK分组编号。
超时计时器设置的重传时间应仔细选择,一般可选为略大于 “从发送方到接收方的平均往返时间”。
停止-等待协议的信道利用率 U = Td / (Td + RTT + Ta)
当往返时延RTT >> 数据帧发送时延Td时,信道利用率非常低。
若出现重传,则对有用的数据信息来说,信道利用率还要降低。
回退N帧协议Go-Back-N,在流水线传输的基础上,利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。
在协议工作过程中,发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。
细节:
累计确认:接收方不一定要对收到的每个数据分组逐个发送确认,而是可以在收到几个数据分组后(由具体实现决定),对按序到达的最后一个数据分组发送确认。ACKn表示序号为n及以前的所有数据分组都已正确接收。
优点:即使 “确认分组” 丢失,发送方也可能不必重传。
缺点:不能及时的反映出,接收方已正确接收的数据分组信息。
当传输过程中出现误码时,发送方会收到接收方发送的 “重复确认”(该确认是已被接受的最后一个分组),从而可以知道之前所发送的数据分组出现了差错,于是可以不等超时计时器超时立即重传。
至于收到几个重复确认就立刻重传,由具体实现决定。
总结:
由于回退N帧协议的特性,当通信质量不好时,其信道利用率并不比停止-等待协议高。
回退N帧协议的接收窗口尺寸WR只能等于1,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱码和误码)。这必然造成发送方对这些数据分组的超时重传,从而造成通信资源的浪费。
为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸必须满足 WR > 1,以便接收方先收下失序到达但无误码并且序号落在接收窗口内的数据分组,等到所缺分组收齐后再一并送交上层,故被称为选择重传协议。
注:选择重传协议SR(Selective Request),为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需对每个正确接收的数据分组进行逐一确认。
总结:
PPP
:点对点协议(Point-to-PointProtocol)是目前使用最广泛的点对点数据链路层协议。
PPP协议为在点对点链路传输各种协议数据提供了标准方法,主要由以下三种构成:
1、发送方的处理:
7E
(PPP帧的定界符)字节转变成2字节序列(7D,5E
)7D
(转义字符)字节转变成2字节序列(7D,5D
)ASCII
码控制字符(数值小于0x20
的字符),则在该字符前插入一个7D
字节,同时该字符的编码加上0x20
2、接收方的处理:进行反变换,即可恢复出原来的帧的数据部分。
1、发送方的处理:
对帧的数据部分进行扫描(一般通过硬件实现),只要发现5个连续的比特1,则立即填充1个比特0。
2、接收方的处理:
对帧的数据部分进行扫描(一般通过硬件实现),只要发现5个连续的比特1,就把其后的1个比特0删除。
RFC 1662的附录部分,给出了FCS的计算方法的C语言实现(查表法)。
接收方每收到一个PPP帧,就进行CRC检验,若CRC检验正确,就收下该帧,否则会丢弃掉。
使用PPP的数据链路层向上不提供可靠传输服务。
要想连接到以太网,需要使用相应的网络适配器(Adapter),简称网卡。
计算机内部,网卡与CPU之间的通信,一般通过计算机主板上的I/O总线以并行传输方式进行。
网卡与外部以太网(局域网)之间的通信,一般是通过传输媒体(同轴电缆、双绞线电缆、光纤)以串行方式进行。
,故网卡除了要实现物理层和数据链路层功能外,还要进行并行传输和串行传输的转换。由于网络的传输速率和计算机内部总线上的传输速率并不相同,因此在网卡的核心芯片中都会包含用于缓存数据的存储器。
在确保网卡硬件正确的情况下,为了使网卡正常工作,还必须在计算机的操作系统中为网卡安装相应的设备驱动程序,负责驱动网卡发送和接收帧。
当多个主机连接在同一个广播信道上,要想实现两个主机之间的通信,则每个主机必须有一个唯一的标识,即一个数据链路层地址。
在每个主机发送的帧的首部中,都携带有发送主机(源主机)和接收主机(目的主机)的数据链路层地址。由于这类地址是用于媒体接入控制(Media Access Control,MAC)的,因此被称为MAC地址。
MAC地址一般被固化在网卡的电可擦可编程只读存储器EEPROM
中,因此MAC地址也被称为硬件地址 / 物理地址。
一般情况下,普通用户计算机中往往包含两块网卡(每块网卡都有一个全球唯一的MAC地址):
严格来说,MAC地址是对网络上各接口的唯一标识,而不是网络上各设备的唯一标识。
交换机和路由器往往具有更多的网络接口,所以会拥有更多的MAC地址。
注:
全球单播MAC地址:具有唯一性,被固化在网卡上,往往与用户个人信息绑定,尽量确保自己拥有的全球单播MAC地址不被泄露。
为避免连接wifi时泄露MAC地址,现在到多数移动设备都已采用随机MAC地址技术。
MAC地址的发送顺序:1)字节发送顺序:1字节 -> 6字节
;2)字节内的比特发送顺序:b0 -> b7
。
网卡从网络上每收到一个无误码的帧,就检查帧首部中的目的MAC地址,按以下情况处理:
1)目的MAC地址与网卡上固化的全球单播地址相同,则接受该帧
2)目的MAC地址是广播地址(FF-FF-FF-FF-FF-FF
),则接受该帧
3)目的MAC地址是网卡上支持的多播地址,则接受该帧
网卡还可被设置为一种特殊的工作方式:混杂方式。
工作在混杂方式的网卡,只要收到共享媒体上传来的帧,就会收下,而不管帧的目的MAC地址。
1)对网络维护人员来说,这种方式可监视和分析局域网上的流量,以便找到提高网络性能的具体措施;
2)嗅探器Sniffer就是一种工作在混杂方式的网卡,再配合相应的工具软件(WireShark
)就可作为一种有用的网络工具来学习和分析网络。
3)混杂方式,是一把双刃剑,黑客可利用该种方式非法获取网络用户的口令。
接收方可能收到的无效MAC帧包括以下几种:
注:接收方收到无效的MAC帧时,就直接丢弃该帧,以太网的数据链路层没有重传机制。
CSMA/CD
协议的基本原理:共享总线以太网具有天然的广播特性,即总线上某个站点向另一站点发送单播帧时,表示帧的信号也会沿着总线传播到总线上其他站点。
当两个或多个站点同时使用总线发送帧时,就会产生信号碰撞。
为解决各站点争用总线的问题,共享总线提出了一种专用协议CSMA/CD
协议(Carrier Sense Multiple Access Collision Detection
载波监听多址接入/碰撞检测)。
CSMA
属于争用型的媒体接入控制协议,连接在同一媒体上的多个站点使用该协议以竞争方式发送数据帧,可能出现冲突(又称碰撞)。
注:
1)载波监听检测到总线空闲时,但总线并不一定空闲。
2)使用CSMA/CD
协议的共享总线以太网上的各站点,只是尽量避免碰撞并在出现碰撞时做出退避后重发的处理,但不能完全避免碰撞。
3)在使用CSMA/CD协议时,由于正在发送帧的站点必须 “边发送帧边检测碰撞”,因此站点不可能同时进行发送和接收,即只能进行半双工通信。
为确保共享总线以太网上的每个站点在发送完一个完整地帧之前,能够检测出是否产生了碰撞,帧的发送时延就不能少于共享总线以太网端到端的往返时间,即一个争用期2t(t是端到端单程传播时延)。
最小帧长 = 数据传输速率 * 争用期2t。
对于10Mb/s的共享总线以太网,其争用期2t的值规定为51.2us,故最小帧长为512b/64B。
一般来说,帧的数据载荷的长度,应远大于帧首部和尾部的总长度,这样可以提高帧的传输效率。
然而,如果不设置数据载荷的长度上限,就可能使得帧的长度太长,这会带来一些问题。
在使用CSMA/CD协议的共享总线以太网中,正在发送帧的站点一边发送帧一边检测碰撞,当检测到碰撞时会立即停止发送,退一段时间后重发。
如果连续多次发生碰撞,就表明可能有较多的站点参与竞争信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(即动态退避),因而减小产生碰撞的概率。
当重传次数达16次仍不能成功时,应放弃重传并向高层报告。
提高信道利用率:1)共享总线端到端的距离不应太长;2)帧的长度应尽量大。
在使用同轴电缆的共享总线以太网之后,发展出来了一种使用大规模集成电路来替代总线、并且可靠性非常高的设备,称为集线器Hub。
另外的变化,站点通过双绞线电缆连接到集线器。
集线器的特点:
共享总线以太网中两站点之间的距离不能太远,否则传输信号会衰减到使CSMA/CD协议无法正常工作。
IEEE 802.3标准规定,两个网段可用一个转发器连接起来,任意两站点之间最多可经过三个网段。
随着双绞线和集线器的10BASE-T
星型以太网成为主流,扩展网络覆盖范围就很少使用转发器了。
10BASE-T
星型以太网中每个站点到集线器的距离不能超过100m,因此两站点之间通信距离最大不能超过200m。
10BASE-T
星型以太网中,可使用光纤和一对调制解调器来扩展站点与集线器之间的距离。
网桥bridge工作在数据链路层(包含其下的物理层),因此网桥具备属于数据链路层范畴的能力。
1、网桥转发帧的情况:
2、网桥丢弃帧的情况:
3、网桥转发广播帧的情况:
透明网桥Transparent Bridge
通过自学习算法建立转发表。
透明网桥中的 “透明”,指以太网中的各自站点并不知道自己所发送的帧将会经过哪些网桥转发,最终到达目的站点,即以太网中各网桥对于站点而言是看不见的。
透明网桥标准是IEEE 802.1D
,通过一种自学习算法基于以太网中各站点间的相互通信逐步建立起自己的转发表。
STP
:为了提高以太网的可靠性,有时需要在两个以太网之间使用多个透明网桥来提供冗余链路。
但冗余链路在提高以太网可靠性的同时,却给网络引入了环路。广播帧将在环路中永久兜圈,造成网络资源的白白浪费。
为避免广播帧在环路中永久兜圈,透明网桥使用生成树协议Spanning Tree Protocol,STP
。
不管网桥之间连接成怎样复杂的带环拓扑结构,网桥之间通过交互网桥协议单元BPDU
(Bridge Protocol Data Unit
),找出原网络拓扑的一个连通子集,在这个子集里整个连通的网络中不存在环路。
网桥接口数量很少,通常只有2-4个,一般只用来连接不同的网段。
交换式集线器Switching Hub
,本质是多接口的网桥,常称为以太网交换机(Switch
)或二层交换机。
交换机的每个接口可连接到计算机、集线器或另一个交换机。
当交换机的接口与计算机或交换机连接时,可以工作在全双工方式,并能在自身内部同时连通多对接口(每一对相互通信的计算机都能像独占传输媒体一样,无碰撞地传输数据,这样就不需要使用CSMA/CD
协议了)。
当交换机的接口连接的是集线器时,该接口就只能使用CSMA/CD
协议并只能工作在半双工方式。
注意:1)现在的交换机和计算机中的网卡,都能自动的识别上述两种情况,并自动切换到相应的工作方式。2)交换机一般具有多种速率的接口(10Mb/s、100Mb/s、1Gb/s、10Gb/s)的接口,大部分接口支持多速率自适应。
一般交换机都采用 “存储转发” 的方式。但为了减少交换机的转发时延,某些交换机采用了直通交换方式。
采用直通交换(cut-through switching)方式的交换机:接收帧的同时就立即按帧的目的MAC地址决定该帧的转发接口,然后通过其内部基于硬件的交叉矩阵进行转发(不必把整个帧先缓存后再进行处理)。
优点:时延非常小。
缺点:没有差错检测,可能会将一些无用帧转发给其他主机。
交换机自学习和转发帧的流程(与网桥相同)
以太网交换机工作在数据链路层(包括物理层),它接收并转发的PDU通常称为帧。以太网交换机收到帧后,在转发表中查找帧的目的MAC地址(目的物理地址 / 目的硬件地址)所对应的接口号,然后通过该接口转发帧。
隔离冲突域 | 隔离广播域 | |
---|---|---|
集线器 | × | × |
交换机 | √ | × |
路由器 | √ | √ |
以太网交换机工作在数据链路层(也包括物理层)。
使用一个或多个以太网交换机互联起来的交换式以太网,其所有站点都属于同一个广播域
随着交换式以太网规模扩大,广播域也相应扩大。巨大的广播域会带来很多弊端。
广播风暴
网络中会频繁出现广播信息:
TCP/IP
协议栈中很多协议都会使用广播
ARP
:已知IP地址,找出相应的MAC地址RIP
:一种小型的内部路由协议DHCP
:用于自动配置IP地址NetBEUI
:windows下使用的广播型协议IPX/SPX
:Novell
网络的协议栈Apple Talk
:Apple公司的网络协议栈难以维护和管理
潜在的安全问题
使用路由器,可隔离广播域,但成本较高
虚拟局域网技术VLAN(Virtual Local Area Network)是一种将局域网内的设备划分成与物理位置无关的逻辑组技术(这些逻辑组具有某些共同的需求)。
IEEE 802.1Q
帧(Dot One Q
帧):对以太网的MAC帧格式进行了扩展,插入了4字节的VLAN标记。
VLAN标识符VID:即VLAN标记的最后12比特,它唯一标志了以太网帧属于哪一个VLAN。
802.1Q帧是由交换机来处理,而不是用户主机。
交换机各端口的缺省VLAN ID,简称Port VLAN ID,即PVID。
Access端口:
一般用于连接用户计算机
只能属于一个VLAN
PVID值与端口所属VALN的ID相同(默认为1)
Access端口接受处理的方法:
一般只接受 “未打标签” 的普通以太网MAC帧。
根据接收帧的端口的PVID给帧 “打标签” ,即插入4字节VLAN标记字段(字段中的VID取值与端口的PVID取值相等)。
Access端口发送处理的方法:
Trunk端口:
一般用于交换机之间 或 交换机与路由器之间的互联。
可以属于多个VLAN
用户可设置Trunk端口的PVID值,默认情况下为1。
Trunk端口接收处理方法:
接收 “未打标签” 的帧,根据接收帧的端口的PVID给帧 “打标签” ,即插入4字节VLAN标记字段(字段中的VID取值与端口的PVID取值相等)。
Trunk端口发送处理方法:
注意:VID(连接Trunk端口) != PVID(Trunk端口)时,可能会造成转发错误。
802.11无线局域网(Wireless Local Network,WLAN
),是目前使用最广泛的无线局域网之一,简称为WI-FI
(Wireless Fidelity,无线保真度)。
802.11无线局域网可分为:有固定基础设施的、无固定基础设施的。
固定基础设施是指预先建立的、能够覆盖一定地理范围的、多个固定的通信基站。
802.11无线局域网,使用最多的是固定基础设施的组网方式。
802.11标准并没有定义实现漫游的具体方法,仅定义了一些基本服务。
关联Association
服务:
移动站与接入点AP建立关联的方法有以下两种。
重建关联Reassociation
服务和分离Dissociation
服务
如果把一个移动站与某个接入点AP的关联转移到另一个AP,就可以使用重建关联服务。
,又称自组织网络ad hoc Network
。
CSMA/CA
协议:CSMA/CA
协议的原因:由于无线信道与共享总线以太网的传输介质不同,故802.11无线局域网不能简单照搬共享总线以太网使用的CSMA/CD
协议。
802.11无线局域网,采用另一种称为CSMA/CA
的协议,即载波监听多址接入/碰撞避免(Carrier Sense Multiple Access/Collision Avoidance,即CSMA/CA
)。
CSMA/CA
协议仍然采用CSMA/CD
协议中的CSMA
,以 “先听后说” 的方式来减少碰撞的发生,但将 “碰撞检测CD” 改为了 “碰撞避免CA”。
注:CA表示碰撞避免,但并不能避免所有的碰撞,而是尽量减少碰撞发生的概率。
CSMA/CA
的协议的基本工作原理:CSMA/CA
的协议的退避算法:执行退避算法时,站点为退避计时器设置一个随机的退避时间:
DIFS
后,继续启动退避计时器。在进行第i次退避时,退避时间在时隙编号 {0,1,...,2^(2+i)-1}
中随机选择一个,然后乘以基本退避时间(即一个时隙的长度)就可以得到随机的退避时间。当时隙编号达到255(对应第6次退避)时,就不再增加。
为进一步降低发生碰撞的概率,802.11无线局域网允许源站对信道进行预约。
网络层的主要任务是:将分组从源主机经过多个网络和多段链路传输到目的主机。可将任务划分为:分组转发、路由选择。
多个异构网络,
要将众多的异构型网络都互联起来,并且能够互相通信,则会面临许多需要解决的问题。
核心思想:可靠通信应由网络自身来保证。
核心思想:可靠通信应由用户主机来保证。
网际协议(Internet Protocol,IP)是TCP/IP体系结构(TCP是传输控制协议、IP是网际协议)网际层中的核心协议。
IPv4地址,就是给因特网Internet上的每台主机(或路由器)的每个接口分配一个(全世界范围内唯一的)32位比特的标识符。
32位比特的IPv4地址,采用点分十进制表示方法。
分类编址(1981) —> 划分子网(1985) —> 无分类编址(1993)
网络类型的判断(网络号):
<127
为A
类、128 < B < 191
为B
类、192 < B < 223
为C
类。
地址为0.0.0.0
是一个特殊的IPv4
地址,只能作为源地址使用,表示 “本网络上的本主机”。
以127开头且后面三个字非 “全0” 或 “全1” 的IP
地址,是一类特殊的IPv4
地址,既可作为源地址使用,也可作为目的地址使用,用于本地环回测试(常用的本地环回测试地址:127.0.0.1
)。
以下三种情况的地址不能指派给主机或路由器接口:
1)A类网络号的0 和 127
2)主机号为 “全0”
3)主机号为 “全1”
32位比特的子网掩码可表明分类IP地址的主机号部分借用了几比特作为子网号。
1、将IPv4=218.75.230.0
,使用子网掩码为255.255.255.1
进行子网划分。
2、将IPv4=218.75.230.0
,使用子网掩码为255.255.255.192
进行子网划分。
由于分类编址(ABC类和子网掩码)和划分子网均会产生地址浪费的问题,故采用无分类编址方法,来进一步解决IP地址紧张的问题。
无分类域间路由选择(classless inter-domain routing)CIDR
:
CIDR
消除了传统的A类、B类和C类地址,以及划分子网的概念CIDR
可以更有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增加CIDR
使用 “斜线记法” ,即在IPv4地址后面加上斜线 “/”,并在其后写上网络前缀所占的比特数量。
CIDR
实际上是将网络前缀都相同的连续的IP地址,组成一个 “CIDR地址块”。只需知道CIDR地址块中的任何一个地址,就可知道该地址块的全部细节:
路由聚合(构建超网)的方法:找共同前缀。
网络前缀越长,地址块越小,路由越具体。
若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,称为最长前缀匹配(这样的路由更具体)。
(Fixed Length Subnet Mask)FLSM
:(Variable Length Subnet Mask)VLSM
:IP地址是因特网上的主机和路由器所使用的地址,用于标识两部分信息:
之前介绍的MAC地址不具备区分不同网络的功能。
主机发送IP数据报
判断目的主机是否与自己在同一个网络(网段):
路由器转发IP数据报
1)检查IP数据报首部是否出错:
2)根据IP数据报的目的地址在路由表中查找匹配的条目:
为了重点强调TCP/IP协议栈的网际层发送和转发IP数据报的过程上,本节忽略使用ARP协议来获取目的主机或路由器接口的MAC地址、以太网交换机自学习和转发帧的过程。
IP路由器工作在TCP/IP体系结构的网际层(或称IP层),TCP/IP体系结构的网际层并不负责可靠传输,也就是不能确保传输的IP分组不丢失。
设备 | 工作范围 | 隔离冲突域 | 隔离广播域 |
---|---|---|---|
中继器、集线器 | 物理层 | × | × |
网桥、交换机(多端口网桥) | 数据链路层(包含物理层) | √ | × |
路由器 | 网络层 | √ | √ |
IP路由器对收到的IP分组进行差错校验,当发现错误时会丢弃该IP分组并向源主机发送ICMP差错报告报文(类型为参数错误)。
源主机如何知道目的主机是否与自己在同一个网络中?
答:目的地址 & 源子网掩码 != 源网络地址 ==> 不在同一网络
目的地址 & 源子网掩码 = 源网络地址 ==> 在同一网络
主机C如何知道路由器R的存在?
答:通过将路由器接口0的IP地址,作为左边子网的默认网关
通过将路由器接口1的IP地址,作为右边子网的默认网关
路由器收到IP数据报后如何转发?
检查IP数据报首部是否出错:
出错,则直接丢弃该IP数据报并通告源主机
没有出错,则进行转发
根据IP数据报的目的地址在路由表中查找匹配的条目:
找到匹配的条目,则转发给条目中指示的下一跳
找不到,则丢弃该IP数据报并通告源主机
版本:表示IP协议的版本。目前广泛使用的IP协议版本号为4,即IPv4
。
注:通信双方必须使用相同版本的IP协议。
首部长度:表示IP数据报首部的长度。以4字节为单位。
可选字段:用来支持排错、测量及安全等措施。(很少被使用)
填充字段:确保首部长度为4字节的整数倍,用0填充。
区分服务:用来获得更好的服务。只有在使用区分服务时,该字段才起作用,一般情况下都不能使用该字段。
总长度:表示IP数据报的总长度 = 首部 + 数据载荷。
标识、标志、片偏移:
标识:属于同一个数据报的各分片数据报应该具有相同的标识
标志:DF位、MF位、保留位
1)DF
位:1表示不允许分片、0表示允许分片
2)MF
位:1表示“后面还有分片”、0表示“这是最后一个分片”
3)保留位:必须为0
片偏移:指出分片数据报的数据载荷部分偏移其原数据报的位置有多少个单位。
举例:
生存时间TTL:
最初以秒为单位,最大生存周期为255秒。
路由器转发IP
数据报(不为0才转发,否则直接丢弃)后需要减掉其在本路由器上耗费的时间。
现在以 “跳数” 为单位,路由器转发IP数据报(不为0就转发;否则就丢弃)后,该字段的值减1。
协议:指明IPv4
数据报的数据部分是何种协议数据单元。
常用的一些协议和相应的协议数据字段值:
协议名称 | ICMP | IGMP | TCP | UDP | IPv6 | OSPF |
---|---|---|---|---|---|---|
协议字段值 | 1 | 2 | 6 | 17 | 41 | 89 |
首部检验和:用来检测首部在传输过程中是否出现差错,比CRC
检验码简单,称为因特网检验和。
源IP地址和目的IP
地址:发送该IP数据报的源主机的IP
地址、接收该IP数据报的目的主机的IP
地址。
直连网络
静态路由(人工配置)
常见的静态路由:
① 人工配置的网络路由
② 默认路由(目的网络为0.0.0.0,地址掩码为0.0.0.0)
③ 特定主机路由(目的网络为特定主机IP地址,地址掩码为255.255.255.255)
④ 黑洞路由(下一跳为null0
)
这种人工配置方式简单、开销小,但不能及时适应网络状态(流量、拓扑等) 的变化
一般只在小规模网络中采用
动态路由(路由选择协议)
静态路由配置是指用户或网络管理员,使用路由器的相关命令给路由器进行人工配置路由表。
使用静态路由配置,可能出现以下导致产生路由环路的错误:
路由信息协议RIP(Routing Information Protocol
)是内部网关协议IGP中最先得到并广泛使用的协议之一。
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
注:允许一条路径最多只能包含15个路由器(16表示目的网络不可达),故RIP只适用于小型互联网。
RIP要求自治系统AS内, 每个路由器都要维护从它自己到AS内其他每个网络的距离记录。这是一组距离,又称 “距离向量D-V(Distance-Vector)”。
RIP包含以下三个要点:
举例:RIP的基本工作过程。
举例:RIP的路由条目更新规则。
RIP存在 “坏消息传播很慢” 的问题:
,又称为路由环路或无穷计数问题,这是距离向量算法的一个固有问题。
可采用很多措施减少出现该问题的概率或减小该问题带来的危害。
基本介绍:开放最短路径优先OSPF(Open Shortest Path First
),是为了克服RIP的缺点开发出来的。
“开放”:OSPF协议是公开发表的
“最短路径优先”:指使用了Dijkstra提出的最短路径算法SPF。
采用SPF算法计算路由,从算法本身保证了不会产生路由环路。
OSPF不限制网络规模,更新效率高,收敛速度快。
工作原理:
OSPF是基于链路状态的,而不像RIP那样是基于距离向量的。
链路状态:本路由器都和哪些路由器相邻,以及相应链路的 “代价”。
代价:表示费用、距离、时延、带宽等,这都是由网路管理人员来决定。
OSPF相邻路由器通过交互问候(Hello)分组,建立和维护邻居关系。
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement),并用链路状态数据库LSDB存储LSA
LSA中包含的内容:
LSA被封装在链路状态更新分组LSU中,采用洪泛法发送。
使用链路的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他路由器的最短路径,即构建各自的路由表。
OSPF有以下五种分组类型:
类型1:问候(Hello)分组
用来发现和维护邻居路由器的可达性
类型2:数据库描述(Database Description)分组
向邻居路由器给出自己的链路状态数据库中,所有链路状态项目的摘要信息
类型3:链路状态请求(Link State Request)分组
向邻居路由器请求发送某些链路状态项目的详细信息
类型4:链路状态更新(Link State Update)分组
路由器使用这种分组将其链路状态进行泛洪发送,即用泛洪法对全网更新链路状态
类型5:链路状态确认(Link State Acknowledgment)分组
这是对链路状态更新分组的确认分组
OSPF的基本工作过程:
OSPF在多点接入网络中路由器邻居关系的建立:
选举指定路由器DR(designed router)和备用的指定路由器BDR(backup designed router)
所有的非DR/BDR只与DR/BDR建立邻居关系
非DR/BDR之间通过DR/BDR交换信息
为了使OSPF能够用于大规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,称为区域(Area)。
通过将AS划分为不同的区域,降低了每个区域内交换路由信息的通信量大小,从而能适应大规模的网络。
不同的自治系统内,度量路由的 “代价”(距离、带宽、费用等)可能不同。在不同的自治系统间的路由选择,使用 “代价” 作为度量来寻找最佳路由是不行的。
自治系统间的路由选择必须考虑相关策略(政治、经济、安全等)。
BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈),而并非寻找一条最佳路由。
基本工作原理:
BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)
互相交换网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好路由,即构造树形结构(不存在回路的自治系统连通图)
BGP-4有以下四种报文:
注:目前使用最多的BGP协议的版本BGP-4。BGP报文被封装在TCP报文段中进行传输。
网络传输中遇到问题,需要传出消息(报告遇到了什么问题),这样才可以调整传输策略,以此来控制整个局面。即为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。
注:ping 就是基于 ICMP 协议工作的 。
主机或路由器使用ICMP来发送差错报文和询问报文。
ICMP报文被封装在IP数据报中发送。
终点不可达:
当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可根据ICMP字段细分为:目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络/主机未知等13中错误。
源点抑制:
当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率降低。
时间超时:
当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段值减一。
参数问题:
当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
改变路由(重定向):
路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
回送请求和回答
ICMP回送请求报文是由主机或路由器向一个特定目的主机发出的询问。收到此报文的主机,必须给源主机或路由器发送ICMP回送回答报文。
这种询问报文用来测试目地站是否可达,及了解有关状态。
时间戳请求和回答
ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。
ICMP时间戳回答报文中,有32位的字段,存放的1900-1-1到当前时刻的秒数。
这种询问报文用来进行时钟同步和测量时间。
tracert
命令traceroute
命令利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。
IPv4地址较紧张,故一个机构能申请的IPv4地址数量远小于本机构主机数量。
因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址。因特网使用的是公用地址。
无分类编址、网络地址转换NAT(Network Address Translation
),均是为了缓解IPv4地址空间即将耗尽的问题。
NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
该转换方法存在的问题:如果NAT路由器具有n个全球IP地址,那么至多只能有N个主机同时和因特网上的主机通信。
由于绝大多数网络应用都是用的是TCP/UDP来传输数据,故可以利用运输层的端口号和IP地址一起进行转换。这样,同一个全球IP地址,就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址同时进行转换的技术,称为网络地址与端口号转换NAPT(Network Address and Port Translation
)。
注意:1)外网主机能否首先发起通信?
2)由于NAT对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。
多播Multicast
是一种实现 “一对多” 通信的技术与传统的单播 “一对一” 通信相比,可极大地节省网络资源。
因特网上进行的多播,称为IP多播。
因特网上进行IP多播通信,路由器需要解决哪些主要问题?
IPv4中,D类地址被称为多播地址。多播地址只能作为目标地址,不能作为源地址。
用每一个D类地址来标识一个多播组,使用用一个IP多播地址接收IP多播数据报的所有主机就构成了一个多播组。
非多播组的成员,也可以向多播组发送IP多播数据报
与IP数据报相同,IP多播数据报也是“尽最大努力交付”,不保证一定能够交付给多播组的所有成员。
由于MAC地址(又称为硬件地址)有多播MAC地址这种类型,故只需要把IPv4多播地址映射成多播MAC地址,即可将IP多播数据报封装在局域网的MAC帧中,而MAC帧首部的目的MAC地址字段的值,就设置为由IPv4多播地址映射成的多播MAC地址。这样,就方便地利用硬件多播来实现局域网内的IP多播。
由于IP多播地址与多播MAC地址的映射关系不是唯一的,因此收到IP多播数据报的主机还要在网际层利用软件进行过滤,将不是主机要接收的IP多播数据报丢弃。
在因特网上进行IP多播,就必须考虑IP多播数据报经过多个多播路由器进行转发的问题。
在因特网上进行IP多播需要两种协议:
注:目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把IP多播数据报在局域网上用硬件多播交付给多播组的所有成员。
IGMP(Internet Group Management Protocol)是TCP/IP体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(实际上是主机中的某个进程)加入或退出某个多播组。
注:IGMP仅在本网络中有效,使用IGMP并不知道多播组包含成员的数量 和 成员分布在那些网络中。
成员查询报文、成员报告报文、离开组报文
IGMP被封装在IP数据报中传送:
多播路由器默认每个125秒就向其直连网络发送一个封装有IGMP成员查询报文的IP多播数据报。
主要任务是:在多播路由器之间为每个多播组建立一个多播转发树。
针对不同的多播树需要维护不同的多播转发树,而且必须动态适应多播组成员的变化。
为了覆盖多播组的所有成员,多播转发树可能要经过一些没有多播组成员的路由器。
基于源树Source-Base Tree
多播路由选择:反向路径多播算法Reverse Path Multicasting
,RPM(其中 “反向路径” 在计算最短路径时把源点作为终点)。
RPM算法包含的步骤:
利用反向路径广播(Reverse Path Broadcasting
,RPB)算法建立一个广播转发树
RPB算法的要点:每台主机收到一个广播分组后,先检查广播分组是否是从源点经最短路径传送来的。
利用剪枝(Pruning)算法,剪除广播转发数树中的下游非成员路由器,获得一个多播转发树
要建立广播转发树,可使用洪泛(Flooding)法。
注:利用反向路径广播RPB算法生成的广播转发树,不会存在环路,因此可以避免广播分组在环路中兜圈。
组共享树Group-Shared Tree
多播路由选择:采用基于核心的分布式生成树算法来建立共享树。
该方法在每个多播组中指定一个核心Core路由器,以该路由器为根,建立一棵连接多播组的所有成员路由器的生成树,作为多播转发树。
每个多播组中除了核心路由器,其他所有成员路由器都会向所在多播组中的核心路由器单播加入报文。
移动IP(Mobile IP)技术,使得移动主机在各网络之间漫游时,仍能保持其原来的IP地址不变。
移动IP技术,还为因特网中的非移动主机提供了相应机制,使得它们能够将IP数据报正确发送到移动主机。
软件定义网络(Software Defined Network
,SDN
)是一种新型的网络。
路由器的功能:
路由器之间传送的消息:
在SDN体系结构中,路由器中的路由软件都不存在了,故路由器之间不再交换路由信息。
SDN新型网络体系结构,核心思想:将网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。
该协议,可看作是SDN体系结构中,控制层面与数据层面之间的通信接口。
OpenFlow协议可使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制。
传统意义上的数据层面的任务:根据转发表转发分组。转发分组分为以下步骤:
在SDN的广义转发中,完成 “匹配+动作” 的设备并不局限在网络层工作,因此不再称为路由器,而称为OpenFlow交换机、分组交换机、交换机。
相应的,取代传统路由器中转发表的是“流表(Flow Table)”。
每个OpenFlow交换机,必须有一个或多个流表
每个流表可以包含多个流表项
每个流表项包含三个字段:首部字段值(或称匹配字段)、计数器、动作
前面提到的物理层、数据链路层、网络层等,共同解决了将主机通过异构网络互连起来所面临的问题,实现了主机到主机的通信。
实际中,计算机网络中进行通信的真实实体是位于通信两端主机中的进程。
如何为运行在不同主机上的应用程序,提供直接的通信服务是运输层的任务,运输层协议又称端到端的协议。
运行在计算机上的进程,需要进程标识符PID来标识
因特网上的计算机,不同的操作系统(windows、Linux、Mac OS)使用不同格式的进程标识符
为了使运行在不同操作系统上的计算机应用程序,能够相互通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识
TCP/IP体系结构的运输层,使用端口号来区分不同的应用进程:
端口号:使用4字节表示,取值范围0~65535
熟知端口号:0 ~ 1023,IANA把这些端口号分配给了TCP/IP体系中最重要的一些应用协议,如下图
登记端口号:1024 ~ 49151,为没有熟知端口号的应用程序使用,使用该类端口号需要在IANA按照规定的手续登记防止重复
短暂端口号:49152 ~ 65535,留给客户进程选择暂时使用。当服务器进程收到了客户端进程的报文时,就知道客户进程使用了动态端口号。通信结束后,会将该端口号分配给其他客户进程以后使用。
端口号只具有本地意义,即只是为了标识本计算机应用层中的各进程,在因特网中不同计算机中的相同端口是没有联系的。
源端口:用来标识发送TCP报文段的应用进程
目的端口:用来标识接收该TCP报文段的应用进程
序号 & 确认号 & 确认标志位ACK:
序号:取值范围[0, 2^32-1],序号增加到最后一个后,下一个序号就又回到0。作用:指出本TCP报文段数据载荷的第一个字节的序号。
注:用来解决网络包乱序的问题。
确认号:取值范围[0, 2^32-1],确认号增加到最后一个后,下一个确认号就又回到0。作用:指出期望接收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
注:若确认号=n,则标识序号n之前的所有数据都已被正确接收,期望接收序号为n的数据。用来解决丢包问题。
确认标志位ACK:取值为1时确认号字段才有效,为0则无效。
注:TCP规定在连接建立后,所有传送的TCP报文段都必须把ACK置1。
控制位:
同步标志位SYN:在TCP连接建立时,用来同步序号,
终止标志位FIN:用来释放TCP连接
复位标志位RST:用来复位TCP连接。
RST=1表明TCP连接出现异常,必须释放连接,然后再重新建立连接。(即将RST置一,可拒绝一个非法的报文段或拒绝打开一个TCP连接。)
推送标志位PSH:接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满再向上交付。
紧急标志位URG :URG=1时紧急指针字段有效,否则无效。
紧急指针:用来指明紧急数据的长度。
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
窗口:指出发送本报文段的一方的接收窗口。
窗口值作为接收方让发送方设置其发送窗口的依据。
以接收方的接收能力,来控制发送方的发送能力,称为流量控制。
发送窗口 = min{ 接收窗口,拥塞窗口 },即swnd = min{ rwnd,cwnd }
注:窗口大小,用来做流量控制。
数据偏移:用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,即TCP报文段的首部长度。
以4字节为单位,
校验和:检查范围包括TCP报文段的首部和数据载荷两部分,在计算校验和时,要在TCP报文段前加12字节的伪首部。
保留:保留为今后使用,但目前应置为0。
选项(长度可变):用来增加TCP的功能。
填充:(因选项长度可变)需要确保报文段首部能被4整除(因数据偏移字段(首部长度),是以4字节为单位的)。
TCP是面向连接的协议,基于运输连接来传输TCP报文段的。
TCP运输连接的建立和释放每一次面向连接的通信中必不可少的过程。
起初,客户端和服务端都处于CLOSE状态,先是服务端主动监听某个端口,处于LISTEN状态。
客户端随机初始化序列号client_isn
,之后置 “序号=client_isn
" 和 ”SYN=1”,并标识该报文为SYN报文。
将该SYN报文(该报文不包括应用层数据)发送给服务端(即向服务端发起连接),之后客户端处于**SYN-SENT
状态**。
服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号server_isn
,并置 “序号=server_isn
”、“确认应答号ack =client_isn
+ 1” 和 “SYN=1”、“ACK=1”,并标识该报文为SYN+ACK报文。
将该SYN+ACK报文发给送给客户端,之后服务器处于**SYN-RCVD
状态**。
客户端收到服务器的SYN+ACK报文后,还要向服务端回应最后一个ACK应答报文,其需要置 “确认应答号ack =Server_isn + 1
” 和 “ACK=1”。
将该ACK报文发送给服务端(可以携带客户端到服务端的数据),之后客户端处于**ESTABLISHED
状态**。
① 建立TCP连接过程中,前两次握手不可以携带数据,但第三次可携带数据。
② 一旦完成三次握手,客户端和服务器端两者均处于ESTABLISHED状态
,即可以相互通信了。
必须经历三次握手,主要有下列三种原因:
双方都可以主动断开连接,断开连接后主机中的资源将被释放。
客户端打算关闭连接,此时会发送一个TCP首部**FIN
=1的FIN报文**,之后客户端进入**FIN_WAIT_1
状态**。
服务端口接收到该报文后,就向客户端发送**ACK
应答报文**,接着服务端进入**CLOSE_WAIT
状态**。
客户端收到服务端的ACK
应答报文后,进入**FIN_WAIT_2
状态**。
等待服务端处理完数据后,也向客户端发送**FIN
报文**,之后服务端进入**LAST_ACK
状态**。
客户端收到服务端的FIN
报文后,会发送**ACK
报文**,之后进入**TIME_WAIT
状态**。
服务端收到ACK
报文后,就进入**CLOSE
状态**,至此服务端已关闭连接。
客户端在经历过2MSL
时间后,自动进入**CLOSE
状态**,至此客户端已关闭连接。
注:由于通信双方都可以发起关闭连接的请求,故主动发起关闭连接的一方,才会有TIME_WAIT
状态。。
TIME_WAIT
状态存在的必要性?如果客户端发起断开请求即发送FIN
报文,之后客户端在接收到服务器的FIN
报文后发送ACK
报文,进入TIME_WAIT
状态,即需要等待2MSL
的时间才能进入CLOSED
状态。
如果客户端不经历TIME_WAIT
状态,在发送完ACK
报文后直接进入CLOSED
状态,会出现如下图的情况:
注:TCP连接释放过程中,在发送完最后一个ACK
报文后,会进入TIME_WAIT
状态,该状态的等待时间2MSL
中会使本次连接持续时间内产生的所有报文段都会从网络中消失。
TCP服务器进程每收到一次TCP客户进程的数据,就重新设置并启动保活计时器(2h
定时)
若保活计时器定时周期内,未收到TCP客户进程发来的数据,则当保活计时器到时后,TCP服务器进程就向TCP客户端进程发送一个探测报文段,以后则每隔75s
发送一次。
若一连发送10个探测报文段后仍无客户进程的响应,TCP服务器进程就认为TCP客户进程所在主机出故障了,接着会关闭这个TCP连接。
TCP基于以字节为单位的滑动窗口来实现可靠传输。
举例说明数据传输时滑动窗口的变化:
虽然发送方的发送窗口是根据接收方窗口设置的,但同一时刻,发送方的发送窗口并不总是和接收方窗口一样大。
对不按需到达的数据如何处理,TCP没有明确规定:
TCP要求接收方必须有累积确认和捎带确认机制,这样可以减小传输开销。接收方可在合适的时机发送确认,也可在自己有数据要发送时把确认信息捎带上。
接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,这反而浪费网络资源。
TCP标准规定,确认推迟时间不应超过0.5 s。
若收到一连串的MSS最大长度的报文段,则必须每隔一个报文段发送一个确认。
TCP通信是全双工通信,即双方都可发送和接收数据,故双方都有发送窗口和接收窗口。
如果发送方一直不断的发送数据给接收方,当接收方处理不过来且缓存已满时,就会丢弃数据包,之后会导致触发发送方的重传机制,从而导致网络资源被无故浪费。
TCP通过流量控制flow control
,即可让发送方根据接收方的(接收)处理能力控制发送的数据量,避免因丢包而导致的重传问题。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
TCP中,接收方在向发送方发送ACK
报文时,通告窗口的大小的,进而限制发送方的窗口大小进而实现流量控制。
如果窗口大小为0时,发送方会停止发送数据给接收方。直到,接收方处理完数据后,会向发送方通告一个窗口非0的ACK
报文,如果该报文在网络中丢失,这回导致发送方一直等待接收方的非0窗口通知、接收方一直等待发送方发送的数据,如不采取措施,这种相互等待就会造成 “死锁” 的现象。
如何解决窗口关闭时,潜在的死锁问题?
为了解决窗口关闭带来的死锁问题,TCP为每个连接设有一个持续定时器,只要TCP连接一方收到对方的零窗口通知,就启动持续计时器。
一旦持续计时器超时,就会发送零窗口探测报文,而对方在确认该探测报文后,会向其通告自己的接收窗口大小。
注:1)零窗口探测报文发送次数一般为3次,如果三次后,收到的接收窗口的大小仍为0,则会发送**RST
报文**中断TCP连接。
2)零窗口探测报文段,设置有重传计时器。即使传输过程中丢失了,也会在一定时间后重传零窗口探测报文。
3)TCP发送方的发送窗口 = min{ 自身拥塞窗口,TCP接收方的接收窗口 }。
接收方的接收窗口为0,如何接收零窗口探测报文,又如何会发送(携带有自己接收窗口大小的)确认报文呢?
答:TCP规定,即使接收窗口为0,接收方也必须接收零窗口报文段、确认报文段、携带有紧急数据的报文段。
流量控制是为了避免发送方的数据填满接收方的缓存,通过接收方的窗口大小来限制发送窗口的大小,从而实现流量控制。
在网络中出现拥塞时,如果继续发送大量数据包时,可能会导致数据包时延、丢失等,会导致TCP重传数据,进而又加大了网络的负担…
当网络出现拥塞时,TCP就会降低发送的数据量(即是无私的协议)。
某段时间,若网络中某个资源(计算机中,链路的容量(即带宽)、交换节点中的缓存和处理机等,都称为网络资源)的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况称为拥塞congestion
。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
拥塞窗口**cwnd
是发送方维护的一个状态变量,该变量会根据网路中的拥塞程度动态变化**。
发送窗口swnd = min{ 接收窗口rwnd,拥塞窗口cwnd }
。cwnd
的维护原则**:只要网路没有出现拥塞,拥塞窗口就再增大一些;只要网络出现拥塞,则拥塞窗口就会减少一些。ACK
确认应答报文(即发生超时重传),则此时出现了网络拥塞。下面各种算法讨论中的基本假设:
swnd = cwnd
(考虑接收方缓存大小有限时,swnd = min{ rwnd, cwnd }
)。MSS
的个数为讨论问题的单位,不是以字节为单位。由于考虑到接收方缓存大小足够大,则swnd = cwnd
。
初始化cwnd=1
,表示初始时可传输一个MSS
大小的数据段。
慢启动算法的规则:发送方每收到一个ACK
,拥塞窗口cwnd
的大小就增加1。
维护一个**慢开始门限ssthresh
**状态变量:
cwnd < ssthresh
时,则使用慢启动算法(发包个数是指数级增加的)cwnd >= ssthresh
时,则改用拥塞避免算法(发包个数是线性级增长的),即一旦cwnd
超过ssthresh
值时,会采用拥塞避免算法。
拥塞控制算法的规则:发送方每收到一个ACK
,拥塞窗口cwnd
的大小就增加1/cwnd
。
如果继续按照拥塞避免算法发送,网络就会慢慢进入拥塞状态,即会出现丢包进而导致重传计时器超时。
此时判断网络可能出现了拥塞,故对发送方做如下调整:
ssthresh
值为发生拥塞时cwnd
的一半,即ssthresh = cwnd / 2(拥塞时)
cwnd=1
,并重新开始慢启动算法之后继续前面的过程…
总的来说,当个别报文段在网络中丢失,但实际上并未发生拥塞时
cwnd=1
,并错误的开始慢启动算法,故而降低了传输效率。采用快重传算法,可让发送方尽早知道是个别报文段的丢失。
所谓快重传,就是使发送方尽快进行重传,而不是等超时计时器超时再重传。
快重传算法,对于个别丢失的报文段,发送方不会出现超时重传,即也就不会立即误认为出现了拥塞(进而降低拥塞窗口cwnd=1
)。使用快重传可使整个网络的吞吐量提高约20%。
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段,于是不启动慢开始算法,而是执行快恢复算法
ssthresh
和拥塞窗口cwnd
值调整为当前窗口的一半**,之后开始执行拥塞避免算法cwnd=ssthresh+3
总的来说,所涉及到的算法如下图:
不能直接使用某次测量得到的RTT样本来计算超时重传时间RTO。
利用每次测量得到的RTT样本,计算加权平均往返时间RTTs(又称为平滑的往返时间)。
新的RTTs = (1 - a) * 旧的RTTs + a * 新的RTT样本
上式中,0 <= a < 1
,且a越接近1新的RTT样本对RTTs影响越大,a越接近0新的RTT样本对RTTs影响越小。
RFC标准建议a=1/8=0.125。
用这种方法,得出的加权平均往返时间RTTs就比测量出的RTT值更加平滑.
超时重传时间RTO应略大于加权平均往返时间RTTs。
RFC建议使用下公式,计算超时重传时间RTO:RTO = RTTs + 4 * RTTd
。
针对出现超时重传时,无法准确测量往返时间RTT的问题。Karn
算法:在计算加权平均往返时间RTTs时,只要报文段重传了,就不采用其往返时间RTT样本。即出现超时重传,则不计算RTTs,故也不会计算RTTd。
当报文段的时延突然增大,并且之后很长一段时间都保持该时延,则原来的重传时间内无法收到确认报文段,即会发生反复被重传的现象。
因此,对Karn
算法做出修正,报文段每重传一次,就把超时重传时间RTO增大一些。典型做法,超时重传后新的RTO扩大为旧RTO的一倍。
之前提到的TCP的快重传和可靠传输时,TCP接收方只能对按序收到的数据中的最高序号给出确认。当发送方超时重传后,接收方之前已收到的未按序到达的数据也会被重传。
能否设法只传送缺少的数据而不重传已正确到达,但未按序接收的数据?
答:TCP可通过选择确认(Selective ACK,SACK)。
目的:解决数据丢失的问题。
通过序列号和确认应答机制,来实现TCP重传机制。
如何重传?
注:使用TCP协议传输时,SYN、FIN、数据包
会重传,但ACK
并不会重传。
应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的。
经典的网络应用(原理、协议和实现):
网络应用程序运行在处于网络边缘的不同的端系统上,通过彼此间的通信来共同完成某项任务。
网络应用程序在各种端系统上的组织方式和它们之间的关系,目前主要有两种:
Client/Server,C/S
方式)Peer-toPeer,P2P
)方式http
服务的默认端口号为80
),而运行服务器的主机也具有固定的IP
地址。C/S
应用中,常会出现服务器计算机跟不上众多客户机请求的情况。C/S
方式,如万维网www
、电子邮件、文件传输FTP
等。DHCP
:因特网采取发的域名结构,由若干个分量组成,各分量之间用 “,” 隔开,分别代表不同级别的域名。
域名系统,既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表的含义。
各级域名由其上一级域名管理机构管理,而最高的顶级域名由ICANN管理。
顶级域名TLDTop Level Domain
,分为三类:
在国家顶级域名下,注册的二级域名均由该国家自行确定。
我国的二级域名分类:
这种按等级管理的命名方法,便于维护名字的唯一性,并且容易设计出一种高效的域名查询机制。
注:域名只是逻辑概念,并不代表计算机所在的物理地点。
域名与IP地址的映射关系,必须保存在域名服务器中,供所有其他应用查询。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换。
域名服务器可划分为以下四种类型:
根域名服务器
每个根域名服务器(因特网上共有13个不同IP地址的根域名服务器)都知道所有顶级域名服务器的域名及其IP地址。
每个根域名服务器,实际上都是有许多分布在世界各地的服务器群集组成的。
当本地域名服务器向根域名服务器发出查询请求时,路由器会将查询请求报文转发到离该DNS客户最近的根域名服务器,故加快了DNS查询的过程。
根域名服务器通常并不直接对域名进行解析,而是返回该域名所属顶级域名的顶级域名服务器的IP地址。
顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最终的结果,也可能是下一级权限域名服务器的IP地址)。
权限域名服务器
这些域名服务器负责管理某个区的域名,每个主机的域名都必须在某个权限域名服务器处注册登记。因此,权限域名服务器知道其管辖的域名与IP地址的映射关系。
另外,权限域名服务器还知道其下级域名服务器的地址。
本地域名服务器
本地域名服务器不属于上述的域名服务器等级结构。
当一个主机发出DNS请求报文时,该报文首先被送往该主机的本地域名服务器,本地域名服务器起代理的作用,会将该报文转发到上述域名服务器的等级结构中。
本地域名服务器的IP地址,需要直接配置在需要域名解析的主机中。
通过递归查询、迭代查询,完成查询过程。
为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
由于域名到IP地址的映射关系并不是永久不变的,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项。
不但在本地域名服务器中需要高速缓存,在用户主机也需要。许多用户主机在启动时从本地域名服务器下载域名和IP地址的全部数据库,维护存放自己最近使用的域名高速缓存,并且只在从缓存中找不到域名时才向域名服务器查询。
另外,主机也需要保证高速缓存中内容的正确性。
将某台计算机中的文件通过网络传送到另一台计算机中,是一项基本的网络应用,即文件传送。
文件传送协议FTP(File Transfer Protocol
)是因特网上最广泛使用的文件传送协议。
一个电子邮件有信封和内容两部分,而内容又分为首部和主体两部分构成。
电子邮件系统的三个主要构件:用户代理、邮件服务器、电子邮件所需协议。
Simple Mail Transfer Protocol,即SMTP的基本工作过程:
SMTP协议只能传送ASCII码文本数据,不能传送可执行文件或其他二进制对象(即不能传送多媒体邮件(图片、音视频数据),并且许多非英语国家的文字也无法传送)。
为解决SMTP传送非ASCII码的问题,提出了多用途因特网邮件扩展MIME(Multipurpose Internet Mail Extensions)。
实际上,MIME不仅仅使用了SMTP,也用于后来的同样面向ASCII字符的HTTP。
邮局协议POP(Post Office Protocol),POP3是其第三个版本。
不允许用户在邮件服务器上管理自己的邮件。
因特网邮件访问协议IMAP(Internet Message Access Protocol),用户在自己的计算机上就可以操作服务器中的邮箱,因此IMAP是一个联机协议。
,POP3和IMAP都采用基于TCP连接的客户/服务器方式。POP3使用熟知端口110,IMAP使用熟知端口143。
基于万维网的电子邮件:
通过浏览器登录(提供用户名和口令)邮件服务器万维网网站就可以撰写、转发、阅读、管理电子邮件。
邮件服务器网站通常都提供非常强大和方便的邮件管理功能,用户可以在邮件服务器网站上管理和处理自己的邮件,而不需要将邮件下载到本地进行管理。
URL
来指明因特网上,任何种类 “资源” 的位置。URL
的一般格式:<协议>://<主机>:<端口>/<路径>
。超文本传输协议(hyperText Transfer Protocol
),定义了浏览器与万维网服务器之间,如何进行万维网文档传输?
采用非持续连接方式。在该方式下,每次浏览器请求一个文件,都需要重新与服务器简历TCP
连接,收到后会立即断开连接。
RTT
开销。若一个网页上有多个引用对象,则请求每个对象都需要花费2RTT
的时间,开销太大。TCP
连接同时请求多个对象,但这大量占用了服务器的资源,特别是在存在大量客户端请求时。HTTP
请求报文和响应报文,且并不局限于一个页面而是只要在同一服务器上就行。HTTP/1.1
还是用流水线工作方式,即浏览器在收到HTTP
响应报文后,可连续发送多个请求报文。服务端接收到一个接一个的请求报文后,发回一个接一个的响应报文,这样节省了大量的RTT
时间,使得TCP
空闲时间很少,提高下载文档的效率。HTTP
是面向文本的,其报文中每个字段都是一些ASCII
码串,并且每个字段的长度都是不确定的。
使用Cookie
在服务器上记录用户信息:
HTTP
被设计为一种无状态的协议,这简化了服务器的设计。但现在复杂的应用,要求服务器能识别用户。Cookie
提供了一种机制使得服务器能“记住”用户,而无需用户主动提供用户标识信息。Cookie
是一种对无状态的HTTP
进行状态化的技术。交换机及其作用?
交换机(交换数据)通常是2个网口以上。
现在家里的路由器其实有了交换机的功能了。交换机可以简单理解成一个设备,三台电脑网线接到这个设备,这三台电脑就可以互相通信了。
知道你电脑的mac地址,可以直接给你发消息吗?
Mac地址只能是两个设备之间传递时使用的,如果要从大老远相互发消息,是离不开 IP 的。
公网服务器的 Mac 地址是在什么时机通过什么方式获取到的?ARP 获取Mac地址只能获取到内网机器的 Mac 地址吧?
在发送数据包时,如果目标主机不是本地局域网,填入的 MAC 地址是路由器,也就是把数据包转发给路由器,路由器一直转发下一个路由器,直到转发到目标主机的路由器,发现 IP 地址是自己局域网内的主机,就会 ARP 请求获取目标主机的 MAC 地址,从而转发到这个服务器主机。
转发的过程中,源IP地址和目标IP地址是不会变的(前提:没有使用 NAT 网络的),源 MAC 地址和目标 MAC 地址是会变化的。
TCP和UDP是否可使用同一个端口?
可以的。
传输层有两个传输协议分别是 TCP 和 UDP,在内核中是两个完全独立的软件模块。
当主机收到数据包后,可以在 IP 包头的【协议号】字段知道该数据包是 TCP/UDP,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据【端口号】确定送给哪个应用程序处理。
如下图:
多个TCP服务进程可以绑定同一个端口吗?
TCP 服务进程需要绑定 “IP : 端口”,之后就一直在监听这个地址和端口上,等待客户端连接。
TCP网络编程如下,服务器执行listen()系统调用就是监听端口的动作。
UDP 网络编程如下,服务端是没有监听这个动作的,只有执行 bind() 系统调用来绑定端口的动作。
两个 TCP 服务进程绑定的 IP 地址不同,端口相同的话,是可以绑定成功的。
两个 TCP 服务进程绑定的 IP 地址和端口都相同,那么执行 bind() 时候就会出错。
0.0.0.0 地址较特殊(代表任意地址),绑定了 0.0.0.0 地址,相当于把主机上的所有 IP 地址都绑定了。
如果 TCP 服务进程 A 绑定 “0.0.0.0 : 8888”,而如果 TCP 服务进程 B 绑定的地址是 “192.168.1.100 (或其他地址): 8888”,那么执行 bind() 时候也会出错。
TCP与UDP的区别?
可靠性(重传机制(解决数据丢失的问题)、滑动窗口(解决无需为每个数据包应答)、流量控制(让发送方根据接收方的(接收)处理能力控制发送的数据量,避免因丢包而导致的重传问题)、拥塞控制、三次握手四次挥手)、传输方式(字节流/完整报文)、TCP中序列号(swnd、cwnd中的序列号、三次握手时随机的序列号)、传输效率(头的大小(tcp头20字节、udp头字节)、可靠传输带来的性能损失)
Linux系统如何收发网络数据包?
网络包的发送和接收流程:
Linux发送网络包的流程:
① 一旦应用层调用了 Socket系统调用 的接口,就会从用户态进入内核态中的 Socket 层,且内核会申请一个内核态的 sk_buff
内存,将用户待发送的数据拷贝到 sk_buff
内存中,并将其加入到发送缓冲区。
② 网络协议栈从Socket发送缓冲区中取出 sk_buff
,并按照TCP/IP协议栈逐层处理。
如果使用 TCP 传输协议发送数据,则会先拷贝一份新的 sk_buff
副本。这是因为 sk_buff
后续在调用网络层,最后到达网卡发送完成后,会将 sk_buff
释放掉。而TCP协议的重传机制,在收到对方的ACK之前,该 sk_buff
不能被删除。综上,内核为了确保TCP丢失重传,在每次调用网卡发送数据时,实际上传递出去的是 sk_buff
的拷贝,等收到ACK后才会真正删除。
③ 对 sk_buff
填充TCP头。
注:
sk_buff
可以表示各个层的数据包,应用层数据包为data
,TCP层数据包为segment
,IP层数据包为packet
,数据链路层为frame
。
为了网络协议栈层级之间,数据传递不发生拷贝,故只用 一个sk_buff
结构体来描述所有的网络包。在内核中向上/向下传输数据时,通过调整sk_buff.data
的值来不断的控制不同首部的添加和剥离。
sk_buff.data
的值,来逐步剥离协议首部。sk_buff
结构体,数据缓存区的头部预留足够的空间,用来填充各层首部,在经过各下层协议时,通过减少sk_buff.data
的值来增加协议首部。你可以从下面这张图看到,当发送报文时,data
指针的移动过程。
④ 网络接口层会通过ARP
协议,获得下一跳的MAC
地址,然后对sk_buff
填充帧头和帧尾,之后将sk_buff
放在网卡的发送队列中。
⑤ 触发软中断,即高速网卡驱动程序这里有新的网络包需要发送,驱动程序从发送队列中读取sk_buff
挂到RingBuffer
中,接着将sk_buff
数据映射到网卡可访问内存DMA
区域,最后触发真实的发送。
⑥ 数据发送完成后,工作并没有结束,因内存并没被清理。发送完成后,网卡设备会触发一个硬中断来释放内存,主要是释放sk_buff
内存和清理RingBuffer
内存。
⑦ 当使用TCP
协议时,收到针对该序列的ACK
,则表明目的端已正确接收数据,此时删除原始的sk_buff
。
发送网络数据时,涉及几次内存拷贝操作?
sk_buff
内存**,将用户待发送的数据拷贝到sk_buff
内存中,并将其加入到发送缓冲区中。TCP
传输协议时,从传输层进入网络层时,每个sk_buff
都会克隆一个副本出来。副本会被送到网络层、传输层、发送队列、RingBuffer
、网卡DMA
内存区,并在发送完后,立即释放掉RingBuffer
和sk_buff
的内存。但原始的sk_buff
还保留在传输层(目的:为了确保TCP的可靠传输(丢失重传)),只有等收到该数据包的ACK
时,才会释放原始的sk_buff
。sk_buff > MTU
时,会在申请额外的sk_buff
并将原来的sk_buff
拷贝为多个小的sk_buff
。访问一个网页的协议封装过程,
网卡的作用:将上述协议组成的包,封装成帧,并在末尾加校验位。
客户端与服务端拆分协议的过程: