网络原理-计算机网络详解-上网内部流程分析

首先,先读 计算机网络-整体认知把握 作为基础入门。

一、网络模型中各层的命名规范

如数据链路层(二层),一般称为帧(Frame),比如以太帧。
而 ATM(Asynchronous Transport Mode)一般称为信元(Cell)。
ATM 是欧洲人发明的,IP 是美国人发明的,两者竞争网络层的老大,最后 IP 胜出,成为当仁不让的网络层霸主。ATM 只好委身于 IP 的「淫威」之下,充当数据链路层协议。

那么网络层(三层)则使用包(Packet)的概念,比如 IP 包。

传输层有 TCP、UDP,TCP 称为报文段或段(Segment),而 UDP 则称为用户数据报或者UDP报文(Datagram)

应用层(七层)则一律使用应用层数据(Data)。

但往往也没有那么严格,经常有人用 TCP 包、UDP 包,也不会引起混淆,但还是希望各位同学能够专业化、规范化使用名称,养成一个良好习惯。


二、本地网创建过程

弄个路由器,弄个光纤猫,超五类网线,拨号上网就行了。

网线接好后,物理层就配好了,以太网速率自协商也完成了。
数据链路层也就是以太网帧。

1、设置内网IP

(1)配置路由器

用一根网线连路由器和pc,登录浏览器访问路由器的设置页面。然后修改网关IP和子网掩码,然后设置PPPOE,自动拨号上网。
比如
网关IP:192.168.1.129
子网掩码:255.255.255.128
那么路由器的网络地址为:192.168.1.128 广播地址为192.168.1.255

参看 网络层之子网划分与超网

(2)配置主机IP

配置主机IP有两种方法:

方法一:登录主机,设置静态IP。

方法二:DHCP,动态获取IP,需要在路由器里面开启DHCP服务。

2、DHCP协议详解

动态主机配置协议,英文 DHCP,是英文 Dynamic Host Configuration Protocol 的缩写,属于应用层协议,使用UDP协议工作。

DHCP运行分为四个基本过程,分别为请求IP租约、提供IP租约、选择IP租约和确认IP租约。客户在获得了一个IP地址以后,就可以发送一个ARP请求来避免由于DHCP服务器地址池重叠而引发的IP冲突。

1.DHCP发现(DISCOVER)—— 请求IP租约

电脑的操作系统安装了 TCP/IP 协议栈,这个协议栈其中包含一个 DHCP 客户端进程,这个客户端进程会广播一个发现服务器的报文,格式为 UDP 封装,目的端口号为 68,源端口号为 67;

大白话:DHCP客户机以广播方式(因为DHCP服务器的IP地址对于客户机来说是未知的)发送DHCPdiscover发现信息来寻找DHCP服务器,即向地址255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的主机都会接收到这种广播信息,但只有DHCP服务器才会做出响应。

客户也可以申请它使用的最后一个IP地址(在下面的例子里为192.168.1.100)。如果该客户所在的网络中此IP仍然可用,服务器就可以准许该申请。否则,就要看该服务器是授权的还是非授权的。授权服务器会拒绝请求,使得客户立刻申请一个新的IP。非授权服务器仅仅忽略掉请求,导致一个客户端请求的超时,于是客户端就会放弃此请求而去申请一个新的IP地址。

2.DHCP提供(OFFER)——提供IP租约

当DHCP服务器收到一个来自客户的IP租约请求时,它会提供一个IP租约。DHCP为客户保留一个IP地址,然后通过网络单播一个DHCPOFFER消息给客户。该消息包含客户的MAC地址、服务器提供的IP地址、子网掩码、租期以及提供IP的DHCP服务器的IP。并以单播方式发给客户端,目的端口号为 67,源端口号为 68 ;

服务器基于在CHADDR字段指定的客户硬件地址来检查配置。这里的服务器,192.168.1.1,将IP地址指定于YIADDR字段。,

3.DHCP请求(REQUEST)——选择IP租约

当客户PC收到一个IP租约提供时,它必须告诉所有其他的DHCP服务器它已经接受了一个租约提供。因此,该客户会发送一个DHCPREQUEST消息,其中包含提供租约的服务器的IP。当其他DHCP服务器收到了该消息后,它们会收回所有可能已提供给客户的租约。然后它们把曾经给客户保留的那个地址重新放回到可用地址池中,这样,它们就可以为其他计算机分配这个地址。任意数量的DHCP服务器都可以响应同一个IP租约请求,但是每一个客户网卡只能接受一个租约提供。

4.DHCP确认(Acknowledge,ACK)——确认IP租约

当DHCP服务器收到来自客户的REQUEST消息后,它就开始了配置过程的最后阶段。这个响应阶段以单播方式发送一个DHCPACK包给客户。这个包包含租期和客户可能请求的其他所有配置信息。
客户端接收到服务器的确认,会尝试将获得的 IP 参数配置到 TCP/IP 协议栈,还会尝试 ARP 广播请求自己的 IP 所对应的 MAC 地址,如果没有收到任何回复,说明这个 IP 地址在广播域里是唯一的,不会引起 IP 地址冲突,可以完成配置工作。

以上 DHCP 能够正常工作,有一个前提条件,那就是客户端与服务器在一个广播域内,一个广播域意味着一个网段,换句话说,一个网段需要一个 DHCP 服务器,这个对于拥有成百上千网段的大型网络来说,则需要成百上千的 DHCP 服务器,这显然不现实。

⬇️⬇️⬇️   其他过程补充如下:⬇️⬇️⬇️

5.重新登录 (DHCPrequest)
    以后DHCP客户机每次重新登录网络时,就不需要再发送DHCPdiscover发现信息了,而是直接发送包含前一次所
分配的IP地址的DHCPrequest请求信息。当DHCP服务器收到这一信息后,它会尝试让DHCP客户机继续使用原来的IP
地址,并回答一个DHCPack确认信息。如果此IP地址已无法再分配给原来的DHCP客户机使用时(比如此IP地址已分
配给其它DHCP客户机使用),则DHCP服务器给DHCP客户机回答一个DHCPnack否认信息。当原来的DHCP客户机收到此
DHCPnack否认信息后,它就必须重新发送DHCPdiscover发现信息来请求新的IP地址。

6.更新租约
    DHCP服务器向DHCP客户机出租的IP地址一般都有一个租借期限,期满后DHCP服务器便会收回出租的IP地址。如
果DHCP客户机要延长其IP租约,则必须更新其IP租约。DHCP客户机启动时和IP租约期限过一半时,DHCP客户机都会
自动向DHCP服务器发送更新其IP租约的信息。

7.获取配置参数(DHCPINFORM)
   如果客户通过别的手段获得了网络地址,它可以使用DHCPINFORM请求获得其它配置参数,服务器接收
到DHCPINFORM包,并建立一个DHCPACK消息,在其中包括一些合适客户的配置参数,只是不包括分配网络
地址,检查现有的绑定,在信息中不填充'yiaddr'字段或租用时间参数。服务器取得DHCPINFORM包内的
'ciaddr'地址,而返回DHCPACK包。

5、DHCP中继问题

以上 DHCP 能够正常工作,有一个前提条件,那就是客户端与服务器在一个广播域内【毕竟发的是255.255.255.255广播帧】,一个广播域意味着一个网段,换句话说,一个网段需要一个 DHCP 服务器,这个对于拥有成百上千网段的大型网络来说,则需要成百上千的 DHCP 服务器,这显然不现实。
有没有现实一点的解决方案呢?比如在一个企业网只需要一台 DHCP 服务器?
问题就来了,客户端与服务器不在一个网段,客户端如何通过广播发现服务器呢?要知道,广播报文无法跨越不同网段!
这个其实不难,只是需要一个角色来协助客户端与服务器发现彼此,这个角色名字叫 DHCP 中继代理。

* DHCP 中继代理(DHCP Relay Agent)

设想是这样的,每个网段都配置一个 DHCP 中继代理,DHCP 中继预先静态配置 DHCP 服务器的 IP 地址,DHCP 中继代理自然可以接收到本网段的客户端 DHCP 广播报文,然后将广播报文修改成单播报文,目的 IP 地址为 DHCP 服务器,源 IP 地址为代理自己的,然后单播发送给服务器,服务器的回复自然也是单播发给代理,代理再将服务器的回复以单播的方式发给客户端。
通俗地说,DHCP 中继代理就是让客户端与服务器相互发现彼此的中介结构。
下面我们举一个例子来说明。
小明打开电脑,运行于后台的 DHCP 客户端,帮助小明拿到了 10.1.1.2/24 这个地址,小美拿到了 10.1.1.3/24 这个地址,小丽却拿到了 10.1.2.2/24 这个地址。请问,小明、小美在一个网段,为何小丽却在另外一个网段,这是如何做到的?
谜底就是:小明、小美在一个广播域,在这个广播域里还有他们的网关,地址是 10.1.1.1/24,已经静态配置好了,网关充当 DHCP 中继代理的角色。除了以上介绍的将接收到的 DHCP 客户端,发现服务器的广播,转换成单播以外,还在 DHCP 报文内部填写了一个字段:「中继代理=10.1.1.1」,这样服务器就可以依据中继代理的地址,找到网段 10.1.1 地址池,然后找出空闲的地址就可以分配给小明、小美了。
同样的原理,小丽的 DHCP 广播被网关(10.1.2.1/24)接收,做了以下的工作:

* 广播修改成单播,源地址为网关的地址 10.1.2.1,目的地址为 DHCP 服务器地址 10.10.10.10
* 填写 DHCP 报文中继代理字段(Gateway),这里为 Gateway = 10.1.2.1
* 重新计算 UDP 校验和

然后发送出去,到达服务器,服务器依据中继代理字段,找到另外一个地址池 10.1.2,接着就可以从空闲地址里分一个 10.1.2.2 给小丽了,然后单播回复网关 10.1.2.1,剩下的步骤可以参考上面的标准流程的四个步骤  –>【请求IP租约、提供IP租约、选择IP租约和确认IP租约】
=====================================================

假设小明、小美、他们的网关、小丽、小丽的网关连在一个交换机上,也没有配置任何虚拟局域网(VLAN)来分隔广播域,以上五者工作在一个广播域,看看 DHCP 能否正常工作?
小明的电脑发一个 DHCP 广播,用于发现广播域里的服务器,广播域里没有 DHCP 服务器,以上五者都会接收小明的广播,小明的网关、小丽的网关自然也会接收到。
于是小明网关、小丽网关都会做中继代理,填上自己的 IP 地址,到达服务器,服务器会分配两个 IP 地址,一个是 10.1.1.x,另外一个是 10.1.2.x,那小明的电脑接受哪一个呢?当然谁先到用谁的!
小明的电脑使用哪个网段地址,完全取决于哪个网关反应快,动作麻利,这种不可预测性的解决方案,不能满足企业网的安全要求。
企业网对于一个员工使用哪一个网段有严格的要求,一个网段意味着不同的权限,所以一个员工要使用真正属于他的那个网段。

综上,企业网络管理,就会采用VLAN 用来隔离广播域,对自动获取IP进行 子网分段 和权限控制 。
=====================================================

6、DHCP与RARP的区别

RARP在功能上有点类似于DHCP协议,确切的说DHCP是BOOTP协议的升级,而BOOTP在某种意义上又是RARP协议的升级。BOOTP和RARP的区别在于RARP是在数据链路层实现的,而BOOTP实在应用层实现的,当然作为BOOTP的升级版DHCP也是在应用层实现的。
这种实现层面的差别也从RARP和BOOTP/DHCP的报文封装格式的差别上体现出来了,RARP直接封装在以太网帧中,协议类型置为0x0800以标识这个报文是ARP/RARP报文,BOOTP/DHCP报文是直接封装在UDP报文中,作为UDP的数据段出现的。
从功能上说,RARP只能实现简单的从MAC地址到IP地址的查询工作,RARP server上的MAC地址和IP地址是必须事先静态配置好的。但DHCP却可以实现除静态分配外的动态IP地址分配以及IP地址租期管理等等相对复杂的功能。

=========================================================

1)RARP可以满足主机IP地址配置的部分要求,但是不能完全满足
包括但不限于以下配置:
网络掩码,网关地址,静态路由,DNS服务器,以及私有的,公有的option功能。

2)RARP是二层协议,无法穿透子网,DHCP可以穿透子网。
好吧,那你会说有ARP代理,也可以辅助穿透子网,但是还是不好用。
因为:
ARP/RARP只能对地址进行识别,无法进行地址的统一规划和分配。
如果在一个子网内,需要对地址进行统一规划,分配和管理,以及租约,续租的管理。
必须要有一个服务器来集中管理。
因此有了bootp,有了DHCP。

我就知道还会有人说,为何不像DR,BDR路由器选举那样在用户计算机中产生一个集中管理的服务器,那是因为ARP/RARP是一个非常轻量级的协议,它设计的本意就不是这个。

另外,最重要的,用户计算机会当机,选举出来的服务器不稳定。

2.5)为何不修改ARP/RARP支持DHCP的特性?
DHCP的协议的工作本质,是动态主机配置协议,不仅仅包含IP地址配置。
TCP/IP网络的优点就是“分层”,协议各司其职。
ARP/RARP负责IP-MAC地址间的互相解析,DHCP负责管理IP层的配置。
因为,修改ARP/RARP支持DHCP,违反网络设计分层的理念。
应该去增强ARP/RARP,而不是去合并DHCP。
所以有了后来IPv6的ND。

3)既然如此为何IPv6会回归到ND(邻居发现协议),DHCPv6协同分配?
因为搞协议的人,逐渐发现,网络中有很多轻量级客户端,不需要进行统一管理,因此发明了ND,也就是增强版的ARP/RARP,它充分满足了没有DHCP服务器的情况下,在IPv6网络分配IP地址,路由前缀自动生成,快速上网的需求。


三、网络通信

大白话核心总结:

当生成完IP包,准备网络通信时,就需要判断目标主机和本机是否同网段。

如果本机和目标主机属于同一网段,

就查询本机的arp缓存表,如果存在目标主机mac地址,就直接读取,并生成两层的mac帧。如果本机的arp缓存表,没有目标主机的mac地址,那么就向本网段发送arp广播【arp请求广播只存在于本网段】,然后目标主机会发回arp单播应答给本机。这样目标主机就知道了,目标主机的mac地址了,并且将目标主机mac地址,放入本机arp缓存表。然后,本机三层ip包,封装成二层mac帧,发送给目标主机了。

如果本机和目标主机 是不同网段。

首先查找本机路由表,匹配和目标主机最接近的网段号。【依据本机路由表只记录本机网段的路由,所以匹配的结果是 发给默认网关】当决定IP数据包要发给默认网关时,此时检查本机arp缓存表,查询是否有网关的mac地址。如果有封装成mac帧,直接发给路由。如果没有记录网关mac地址,就发送arp广播请求,来获取网关mac地址。然后再将ip数据包组装成mac帧,发送给网关。

网关收到mac帧后,检查ip包和mac帧,发现mac地址与ip地址不匹配,不是真正发给自己的 ip包,于是查询路由表,找一个最长匹配的网络段的路由,重新组装mac帧发往下一个路由器(后面就是不断重复前面网关收到mac帧的操作发我下一个路由或目标主机)或者目标主机。【重新组装的mac帧,目标IP和源ip都不变,目标mac为下一跳的mac地址,源mac为当前网关】最终,经过几跳后,目标主机收到了mac帧。

1、访问相同网段

举例:ping 同一网段的主机。ping的协议介绍看这里

小明访问小美的电脑:比如 ping  10.1.1.3

(1)先判断 小美电脑 10.1.1.3  是否和 小明的电脑 10.1.1.2在同一个网段。

首先用小明的子网掩码  255.255.255.0 去 和 小明的IP 相与:计算出小明主机网络的网络号,即该网段的网络地址和广播地址【10.1.1.0   ,10.1.1.255】网络地址和广播地址直接的主机都属于同一网段。

然后对比目标地址:10.1.1.3  发现属于同网段。

(2)当生成三层IP包后,需要知道目标主机的mac 地址,来生成二层 mac帧。

首先查找本机的 arp缓存表,如果有,就直接读取,然后封装成mac帧,直接发给目标主机。

关于arp缓存表和路由表,查看这里

如果本机的arp缓存表,没有查到。就发送 arp广播请求【arp广播只存在于本网段】。

本机电脑用哪个网络接口发送arp广播请求呢?我们先了解一下本机路由表。

按照前面提到的子网划分博文,以上四条路由它们代表的网段号分别是:
127
10.1.1.2
10.1.1
0
用小美的网络号 10.1.1 与以上四条一一匹配,匹配到第三条,对应的接口为 Eth0。
于是,从接口 Eth0 发送 ARP 广播,ARP 广播在广播域里蔓延,小美的电脑也在同一个广播域可以接收到此 ARP 广播,广播请求 10.1.1.3 的硬件 MAC 地址,于是小美的电脑通过点对点单播 ARP 回复 10.1.1.2,自己的 MAC 是 MACxm,小明的电脑接收到此回复,将 10.1.1.3 / MACxm 保存在 ARP 缓存里,时间为 20—30 分钟不等,以备下次使用。

然后,本机三层ip包,封装成二层mac帧,发送给目标主机了。依照以上类似的步骤,Ping 的回包就到达本机的电脑,然后 Ping 程序软件显示,Ping 包被反弹回来,以及最大、最小、平均的来回延迟时间 RTT(Round Trip Time)。

2、访问不同网段

如果本机和目标主机 是不同网段。

首先查找本机路由表,匹配和目标主机最接近的网段号。【依据本机路由表只记录本机网段的路由,所以匹配的结果是 发给默认网关】当决定IP数据包要发给默认网关时,此时检查本机arp缓存表,查询是否有网关的mac地址。如果有封装成mac帧,直接发给路由。如果没有记录网关mac地址,就发送arp广播请求,来获取网关mac地址。然后再将ip数据包组装成mac帧,发送给网关。

网关收到mac帧后,检查ip包和mac帧,发现mac地址与ip地址不匹配,不是真正发给自己的 ip包,于是查询路由表,找一个最长匹配的网络段的路由,重新组装mac帧发往下一个路由器(后面就是不断重复前面网关收到mac帧的操作发我下一个路由或目标主机)或者目标主机。【重新组装的mac帧,目标IP和源ip都不变,目标mac为下一跳的mac地址,源mac为当前网关】最终,经过几跳后,目标主机收到了mac帧。

3、访问互联网

记录上网时,网络信息流处理过程

第一步:域名解析

互联网上网络层通信都是 IP数据包,所以小明的电脑与 百度服务器的通信也是 IP 包。既然是 IP 包,则需要 百度 服务器的 IP 地址,小明只告诉浏览器,自己想访问的服务器的域名是 HTTP://www.baidu.com,浏览器爽快地对小明说:没有关系,我会帮你解析出服务器的 IP 地址。

浏览器通知DNS程序(进程),解析www.baidu.com 的IP。

DNS域名解析过程如下:
1)DNS 进程先检查自己的程序缓存(Cache),如果有「www.baidu.com」所对应的 IP,则直接告诉浏览器。如果缓存没有找到,进入下一步;
2)检查本地 Host 文件,看看有没有,有则告诉浏览器。如果 Host 没有找到,进入下一步;
3)检查本地的 DNS 服务器配置,得到 DNS Server = 10.10.10.10,发个消息给它,让 DNS 服务器帮助查找。
此消息为 UDP 格式,目的 IP=10.10.10.10,小明电脑发现和自己不在一个网段,于是使用前面提到的不同网段的通信,将 IP 包发给 DNS Server = 10.10.10.10;
4)DNS Server (10.10.10.10)在自己的缓存里也没有发现,于是向互联网的上级DNS Server (8.8.8.8)发送协查请求;
DNS Server (8.8.8.8)发现了匹配项:HTTP://www.baidu.com 61.135.169.125,于是将协查结果返回给小明公司 DNS 服务器(10.10.10.10),然后再返回到小明电脑(10.1.1.2)DNS 进程。
DNS 进程气喘吁吁对浏览器说:大哥,这是您要的东西(HTTP://www.baidu.com 61.135.169.125)。

第二步:浏览器 HTTP 格式打包
浏览器将小明访问服务器 HTTP://www.baidu.com 的请求打包成 HTTP 格式,然后将打包好的 HTTP 告诉 TCP 进程(程序),同时告诉 TCP 进程的还有 HTTP://www.baidu.com 的 IP(61.135.169.125)。
TCP 进程属于低调、稳健的老司机,心想,如果将浏览器发来的 IP 地址 + HTTP 直接发给 IP 进程,最后会产生一个 IP 包,但最终这个 IP 包是死是活,自己却无法知道。也许 IP 包遭遇了线路硬件故障被丢弃,或网络路径拥堵被丢弃,或者服务器压根就没有开机,最终这个 IP 包消失得无踪无影。老司机犯愁地自言自语:那可怎么办才好呢?不远处 IP 进程听到了:臣妾也不知道啊!
最终老司机想出了一个办法,先不发 HTTP,先要确保自己的 IP 包(没有任何用户数据)可以到达服务器,并且服务器的 IP 包也可以返回,这样做的好处是:
一方面,可以保证双向的路径(路由)是畅通的,没有防火墙或访问列表的阻挡;
另一方面,如果 IP 包可以返回,说明服务器是正常工作的。这样老司机的所有担忧就都一一化解了。
这个方法是如何工作的呢?

第三步:HTTP 触发 TCP 进程三次握手连接
小明 TCP 司机:老大,有空吗?想和您唠唠,听到请回答!
服务器 TCP 老司机:小明,听得到,你能听到我吗?
小明 TCP 司机:听得到!
既然双方都可以听到对方(发送 IP 包到对方,并从对方接收 IP 包),那么就可以将小明的 HTTP,使用这个三次握手建立的 TCP 连接发送出去。但是,莫急,TCP 三次握手本身也会使用 IP 进程(程序)来完成发送,由于小明电脑与服务器不在一个网段,所以是三次不同网段的通信,上文详细阐述过整个过程,不再赘述。
在 IP 进程的眼里看,三次握手就是三个 IP 包(暂不考虑超时重传)的交互,还没有传输浏览器的 HTTP 之前,已经花费了来回三个 IP 包的代价。
此时,TCP 老司机是如何传输真正的 HTTP 的呢?

第四步:TCP 传输 HTTP
这个不难,只要使用 TCP 头将 HTTP 打包起来,包的格式为 TCP + HTTP,发给 IP 进程就好了。那么,在 IP 进程眼里,只是一个 IP 包而已,IP 包的格式为 IP + TCP + HTTP。那怎么知道对方是否接收到这个 IP 包呢?
TCP 确认收货机制
对方发一个确认,喊一嗓子:IP 包已收到,那么小明 TCP 进程就放心了,喃喃自语道:收到就好……
这里还有一个问题,小明 TCP 进程如何知道是哪个 IP 包被对方确认收货?
大家都有网购经验,卖家发货时,会在外包装上打上一个序列号,当买家确认收货时(确认产品序列号),这样卖家就知道某件产品已经安全无误地到达买家手中。
TCP 将每个字节标记机制
同样的原理可以用在 IP 网络通信中。技术来源于生活,而高于生活。为了保证可靠传输,用序列号标记一下 IP 包,标记在什么地方呢?
TCP 头有一个 Sequence Number,它就是序列号,就是为了实现这个目的的,比如小明的 TCP 进程要传输 1000 字节数据,初始序列号从 1 开始,那么 Sequence Number 设置为 1,然后 TCP 把这 1000 个字节打包,然后层层地封装、传输,并最终到达服务器 TCP 进程。
TCP 确认收货方法
服务器如何确认呢?
TCP 有一个字段是专门干这个的,确认收货号 Acknowledge Number,那么这里这个 Acknowledge Number 应该是多少呢?是 1001,为什么是 1001,难道这个和一千零一夜有关?
No!
1001 是告诉对方,从初始序列号 1 开始的 1000 个字节已经成功接收,准备好接收序列号从 1001 开始的数据了,这个应该很好理解吧?
小明 TCP 进程接收到此确认收货,就安心等待服务器将 HTTP://www.baidu.com 的页面发送过来了。
这个过程一个数据、一个确认收货,一共两个 IP 包。

第五步:服务器将自己的网页回传
服务器将自己的主页封装成 HTTP 格式,为了方便表达,假定主页只需要一个 TCP 就可以传输,此过程和第四步相似,即服务器 TCP 进程发给小明电脑一个 IP 包(包含网页),小明电脑回复一个收货确认(没有任何数据,只有 IP + TCP),那么一共两个 IP 包。
简而言之,TCP 的可靠传输机制:己方数据发送,对方确认,就这么简单。
第六步:释放 TCP 连接
小明浏览器将接收到的网页输出到屏幕上,任务就基本完成了。为什么说基本完成,而不说完全完成?因为还需要将之前建立的 TCP 连接断开,有同学会疑惑,为何要释放 TCP 连接?
因为数据已经传输完毕,TCP 连接依然活得好好的,但 TCP 连接会占用资源,比如会占用 TCP 端口资源、内存资源,既然不用了,就释放出来给有需要的应用程序使用。

* 通俗解释 TCP 关闭连接

TCP 连接可以看成两个水管,一个进水管,一个出水管。
从小明 TCP 进程来看,自己发数据用的是出水管,而接收服务器的数据使用进水管,释放连接意味着将两个水管都关闭。
如果小明没有数据要发给服务器,那可以放心地关闭出水管,但不能关闭进水管,因为进水管也许还有水,或者对方还需要继续运水过来,小明贸然关闭进水管不妥,可能会造成数据丢失。
所以进水管还是让对方来关闭比较恰当,因为对方会真正知道到底还有没有水要运输!
关闭 TCP 连接的步骤:
1)小明 TCP 进程:老大,我没有水要运了,准备关闭我的出水管了,收到请确认!
2)服务器 TCP 进程:小明,你的出水管里的水已经接收完毕,可以放心关闭,确认完毕!一旦小明接收到确认,出水管就完成关闭,不能再用出水管运水了。
此时,假设服务器也没有水要运给小明了,所以决定关闭服务器的出水管。(小明的进水管)
3)服务器 TCP 进程:小明,我也没有水要运了,准备关闭我的出水管了,收到请确认!
4)小明 TCP 进程:老大,你的出水管里的水已经接收完毕,可以放心关闭,确认完毕!
一旦服务器接收到确认,出水管(小明的进水管)就完成关闭,不能再用出水管运水了,服务器 TCP 进程释放资源。
小明 TCP 进程发出去的确认,自己无从知道是否对方已经接收到,除非对方超时重传关闭出水管的消息,小明启动一个定时器等待,如果超时以内没有接收到任何重传的消息,说明对方接收到自己的确认,那就彻底关闭 TCP 连接,释放所有资源;而如果接收到对方超时重传,自己再确认,然后再等待,直到最终确认对方接收到自己的确认。
这里不考虑超时重传,为了关闭 TCP 连接,一共使用了四个 IP 包。那么整个通信过程一共使用多少个 IP 包呢?
小明举起了手:车教练,一共是十一个!
车教练循循善诱:十一个是怎么来的?
小明:建立连接是三个,双向通信是四个,释放连接是四个。
车教练:回答完全正确,小明,考试合格,可以开车上路了……


参考:
https://blog.csdn.net/u013485792/article/details/50731538
http://www.qingpingshan.com/m/view.php?aid=215832

网络原理-网络拓扑之NAT

一、NAT含义


大白话:NAT就是将内网地址 翻译成外网地址。可以是一对一(静态转换),多对多(动态转换),多对一(端口多路复用)
NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

二、NAT分类


NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。

1、静态转换Static Nat

静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

2、动态转换Dynamic Nat

动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。

3、端口多路复用(Port address Translation)

 端口多路复用是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

也被称为NAPT【(Network Address Port Translation),即网络端口地址转换】、“多对一”的NAT、地址超载(address overloading)。

三、ALG(Application Level Gateway)


即应用程序级网关技术:
在静态转换和动态转换中,内网中的一个ip都会被转换成外网的一个ip;所以数据流要改ip层和mac地址层。上面的网络层不需要修改。
在端口转换中,内网的一个应用请求,会被转换到外网的另一个端口作为请求。这样外网的一个ip地址,可以利用不同的端口完成来自不同的内网ip的请求。此时需要修改mac层,ip层和传输层。

但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。例如:对于FTP协议的PORT/PASV命令、DNS协议的 “A” 和 “PTR” queries命令和部分ICMP消息类型等都需要相应的ALG来支持。
如果协议数据报文中不包含地址信息,则很容易利用传统的NAT技术来完成透明的地址转换功能,通常我们使用的如下应用就可以直接利用传统的NAT技术:HTTP、TELNET、FINGER、NTP、NFS、ARCHIE、RLOGIN、RSH、RCP等。

四、NAT超时介绍


因为 IP v4 的 IP 数量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯。
大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断。
长连接心跳间隔必须要小于NAT超时时间(aging-time),如果超过aging-time不做心跳,TCP长连接链路就会中断,Server就无法发送Push给手机,只能等到客户端下次心跳失败后,重建连接才能取到消息。


参考:
端口映射 和 nat 区别不是 太大
http://blog.sina.com.cn/s/blog_4988d99a0102wt97.html
NAT超时介绍
https://blog.csdn.net/hbjixieyuan/article/details/55048881
nat 教程 https://wenku.baidu.com/view/34b016673169a4517623a33e.html

网络原理-网络拓扑之两台电脑直连的问题

两台PC直连,设置不同网段的ip,能ping通吗?

首先:两台pc直连,设置相同网段IP 是可以ping通的。

如果不同网段:
pc1———-1.1.1.1/24
pc2———-2.2.2.2/24

两台电脑直连且不再同一网段默认是ping不通的,首先要理解ping的原理。

PC1在ping之前先检查目的IP与本机IP是否属于同一网段。

【大白话就是查询路由表(pc也有路由表),发现当前路由表中没有去往目的网段的路由,因为pc1只有1.1.1.0/24,没有2.2.2.0/24的路由】

如果属于,就在自己的ARP表里查询是否有目的IP的MAC地址,如果有,封装好以后把ping包发出去(我管你收不收得到,我发了在说),如果没有,就发ARP查询。查询到目的MAC以后再封装发送。如果不属于同一网段,就只能找网关帮忙了,啥?网关也没有?不好意思,直接把包丢弃了- -我压根懒得发。。。如果有网关,先查ARP表有没有网关MAC,如果有就封装好发走,如果没有就ARP查询,楼主的情况,因为PC2与PC1不在同一网段,PC2在收到PC1的ARP请求后,发现目的IP不但不是给我的,而且与我也根本不在同一网段(网关与本机IP需要指定为同一网段),我丢得比谁都快。。。,所以PC1连网关的MAC都得不到,ping包都还没准备呢就胎死腹中了。最后ping的结果request timed out。

下面的互指对方IP为网关是可行的,但仅限于真机能实现,CPT和GNS3都无法模拟。

不同网段主机也是可以让它们ping通的
pc1———-1.1.1.1/24
pc2———-2.2.2.2/24
解决办法是互指对方地址为网关

gw 2.2.2.2 gw 1.1.1.1
默认网关就是一条默认路由,有路由就能发包,一发包就需要源mac和目的mac的封装。这种方法只能在pc上做,这时候会发ARP,查询对端地址的mac,最后就通了,我拿真实pc做过。

 

 

参考:

http://tieba.baidu.com/p/1424368917?pid=31989408832&cid=0#31989408832

https://blog.csdn.net/dog250/article/details/68951615

 

网络原理-路由器AP、中继、桥接、Client等模式比较

现在的路由大多数已经开始支持多种网络连接模式,常见的有有AP(接入点)模式、Router(无线路由)模式、Repeater(中继)模式、Bridge(桥接)模式、 Client(客户端)模式;

 

AP(接入点)模式


大白话:就是一个带有无线功能的二层交换机【也有人说是带有无线功能的hub】但是我感觉,路由器的功能很强大,hub都淘汰了,AP应该属于待无线的二层交换机。

接入端用网线连接LAN口,输出端可以是LAN口,也可以是无线;WAN端口空闲。

所以,AP和上一层的网络 属于同一个网段内,路由器不需要开启DHCP,但需自行设置路由器IP。【可以不设置,路由器向该网段主路由器即DHCP服务器发送请求,然后自行设置,但为了便于管理AP路由器,自行设置该路由器IP,方便访问和管理】

所以路由器AP模式下,接入端的网线必须能上网才能使用。

 

 

Router(无线路由)模式


在Router(无线路由)模式下,路由器就相当于一台普通的无线宽带路由器;平时我们使用的都是这种模式。需要连接ADSL Modem(猫)或者光猫等设备来进行配置。

一般家里用的宽带拨号上网就是这个模式,路由器WAN端口连接猫,LAN端口和无线网络连接需要上网的设备。

这个模式下,路由器提供DHCP服务器功能【给本地局域网设备分配IP】,PPPOE拨号功能【提供拨号上网认证功能】

 

Bridge(桥接)模式


 

 

Bridge(桥接)模式,路由器会通过无线的方式与一台可以上网的无线路由器建立连接,用来放大可以上网的无线路由器上的无线信号;

注意:放大后的无线信号的名称和原来的无线路由器的无线信号名称不一样。

大白话:桥接模式下,路由器就像一台有无线功能的二层交换机,网络号和上层路由器一样属于同一个网络。【如上图中 123路由器 和 上层 abc 路由器 属于同一个网络段】   

AP模式和桥接模式本质上是一样的,主要区别就是接入端不同,一个用网线接入该路由器的LAN口,一个用无线接入该路由器。

桥接模式下的路由器不需要DHCP,【可以设置IP,方便自己登陆管理路由器】。不设置的话路由器会自动向上级路由器请求分配IP,因为IP地址你不知道,所以无法用浏览器   访问绑定了   路由器管理界面   的正确IP地址  。

 

Repeater(中继)模式


 

Repeater(中继)模式下,路由器会通过无线的方式与一台可以上网的无线路由器建立连接,用来放大可以上网的无线路由器上的无线信号

注意:放大后的无线信号的名称和原来的无线路由器的无线信号名称一致。

大白话:用无线接人中继模式下的路由器,输出端包括LAN端口和无线网。中继模式的路由器和上层的路由器属于两个不同的网段,中继模式的路由器有自己的DHCP和子网。

中继模式和路由模式差不多,区别就是没有PPPOE拨号,接入方式为无线,不是WAN端口。

 

Client(客户端)模式


客户端模式下的路由器相当于一块无线网卡,用来接收其它无线路由器上的无线信号;电脑只能够通过网线连接到 客户端模式下的路由器上使用。

大白话:就像笔记本电脑上的无线网卡那样工作,仅连接其它的无线网络,而不发射自己的无线网络信号。对于无线路由器来说,这种模式相当于启用了一个无线的WAN口,且下面的电脑只能通过有线方式接到此设备。
该模式下无线路由器仍然提供DHCP及NAT功能,内部四个LAN口组成的单独IP地址段局域网,通过无线路由器上自己的网关,连上外部主网络。

 

客户端桥接(Client Bridge)模式


和“客户端”模式一样,相当于启用了一个无线的WAN口,且下面的电脑只能通过有线方式接到此设备。不过,内部的LAN口组成的局域网和连接上的无线网段处于相同的IP地址段。内部的DHCP请求也会被转发到主无线网络上。

 

 

参考:
https://www.jianshu.com/p/b4091fb430ab
https://www.cnblogs.com/pengdonglin137/p/3485974.html
http://service.tp-link.com.cn/detail_article_458.html
 

网络原理-计算机网络详解-网络分类子网划分及超网

网络分类,子网划分,网络号与超网

网络分类:传统的 ABCDE网络分类,规定的是在同一个网络中,有几个主机号。其实每一个主机号都有公网IP,相当于不同网络中的主机可以用ip直接访问。本质上来讲,所有的主机都处于同一个网络中,只是人为的划分了ABCDE网络。

大白话:网络掩码只代表网络号的位长,需要主机ip相与才能确定网络号。

无论子网还是超网,都有一个网络地址和广播地址。

家里路由器 子网掩码 255.255.255.128  路由器ip 192.168.1.129  。网络位比基本网络位24多一位。 可以用 192.168.1.129/25 表示路由器IP。192.168.1.128/25 表示 网络地址。192.168.1.255/25 是广播地址。网络段号也叫网络段:就是从网络地址-广播地址(因为可以计算,就简单用网络地址表示网络段 即用192.168.1.128/25表示)

大白话:其实一个ip就代表一台主机的意思,至于 掩码 就是用来确定这台主机属于那个子网的。比如x.x.x.x./32 就是说 该主机 自己单独一个网。这样一来,掩码的实际用途就是对内网主机私有ip的网络划分。尽管内网的主机ip有好多个,但是采用NAT技术可以使用少量的公网IP,来对外网进行访问。

至于因特网,它上面的每一台主机地位都相等,每一谁是谁的内网一说。所以因特网上面的主机ip都应该是x.x.x.x/32 

当然内网可以采用 多条宽带叠加上网:

1、买多WAN口的路由器,内网分配给手机或电脑就一个ip。相当于内网可以有对个公网IP出入口。
2、电脑同时连接无线和有线,电脑同时具有无线IP和有线IP且两个不相同。还要设置跃点数相同。

平时上网的时候,只会用一个ip,下载的时候多进程 ,会用两个IP 下载。

1、网络分类与保留地址

在主机或路由器中存放的IP地址(IPv4)都是32位的二进制代码。它包含了网络号(net-id)和主机号(host-id)两个独立的信息段。网络号用了标识主机或路由器所连接到的网络,主机号用来标识该主机或路由器。

为了提高可读性,每8位二进制数用一个十进制数(0~255)表示,并以小数点分隔。这种标记IP地址的方法称为“点分十进制记法”,IP地址的网络号在左边,主机号在右边。

根据固定的网络号和主机号位数的不同,IP地址分成了五类:A类、B类、C类、D类和E类。其中最常用的是A类、B类和C类。

1. A类地址
⑴ A类地址第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0。
⑵ A类地址范围:1.0.0.1到126.255.255.254。
⑶ A类地址中的私有地址和保留地址:
①10.0.0.0到10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。
② 127.0.0.0到127.255.255.255是保留地址,用做循环测试用的。

最大网络数127个(1~126是可用的,127作为本地软件环回测试本主机之用)
每一个A类网络中最大主机数是1 677 214(即224-2)个。减去2个的原因是去掉一个主机号全0的地址(网络地址)和主机号全1的地址(广播地址)

2. B类地址
⑴ B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。另外第1个字节的前两位固定为10。
⑵ B类地址范围:128.0.0.1到191.255.255.254。
⑶ B类地址的私有地址和保留地址
① 172.16.0.0到172.31.255.255是私有地址
  ②169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.0到169.254.255.255中临得获得一个IP地址。【在mac 电脑中,用 netstat -r 查看路由表时,发现有 169.254 网段,现在明白了 】最大网络数16384个,每一个B类网络中最大的主机数是65534(216-2)个

3. C类地址
⑴C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。
⑵ C类地址范围:192.0.0.1到223.255.255.254。
⑶ C类地址中的私有地址:192.168.0.0到192.168.255.255是私有地址。
最大网络数2 097 152, 每一个C类网络中最大的主机数254(28-2)个

4.D 类地址的网络号为1110,用于多播(一对多通讯)。E 类地址的网络号为1111,保留以后使用。

广播地址分为两种:直接广播地址和有限广播地址 有限广播地址也称为本地广播地址,TCP/IP协议规定32比特全为1的IP地址(255.255.255.255)用于本网广播。 在主机不知道本机所处的网络时(如主机的启动过程中),只能采用有限广播方式,用于从网络IP地址服务器处获得一个IP地址。

该地址用于主机配置过程中IP数据报的目的地址。此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。【需要进一步去了解上网信息流全过程】

当广播地址包含一个有效的网络号和主机号,技术上就称为直接广播地址。


2、子网划分

采用借位的方法,从主机最高位开始借位变为新的子网络,剩余部分仍然为主机位,使本来应当属于主机号的部分改变为网络号,这样就实现了划分子网的目的。借位使得IP地址的结构分为3部分:网络位、子网位和主机位。

网络位            +    主机位      ——>网络位+子网位     +    主机位

假设某公司有一个C类地址202.110.1.0,现将主机字段的前3位作为子网号,后5位作为主机号,这样该公司最多可划分8(23)个子网,每个子网有30(25-2)个主机地址可以分配。

子网数=2x个(X=借位数)

                 主机数=2y-2个(Y=主机位)

3、网络掩码

子网掩码(subnet mask)又叫网络掩码地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分。
子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
网络掩码最长可以和IP地址一样长,32bit位或四个字节长。
比如DNS服务器8.8.8.8/32掩码就是32位,其网段号为10.10.10.10,主机号没有,那么这个网段就这一台主机,所以有没有主机号就无足轻重。
网络掩码最短是多少?
0位,比如路由表 中的 缺省路由 0.0.0.0/0 ,这条路由代表所有IP网段。
所以对应的网段号长短介于0-32位之间。路由器,按照最长匹配原则,主机会优先32位长的路由,来匹配IP包中的目的IP 地址。
大白话讲网络掩码:
网络掩码就是:  全是1的N位长,N位长就是用来表示 掩码的位数。后面用零补充到
32位。
根据网络掩码的位长,匹配 取出对应ip的位数,后面全补零,就是网络号了。其实就是将掩码与ip相与,获得网络号的意思。该网络号-左边最长的标准网络号(8位,16位,24位)剩余的部分=子网络号。
即:网络号=标准网络号+子网络号(有时后子网络号不存在)
一般掩码数8位,16位,24位,32位:这种是刚好 占据了1个,2个,3个,4个字节。
占了4个字节的网络掩码 没有主机号,只代表 一个主机 占了一个 IP 节点。
有主机号的ip节点,就代表一个ip出口,里面有内网,内网主机共享了一个对外ip节点。
其他那种,不是整个字节的:
就称为子网掩码好了,例如:
定义子网掩码的步骤为:
A、确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c类IP地址,网络标识为“210.73.a”,主机标识为“b”。
B、根据我们所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们需要12个子网,将来可能需要16个。用第四个字节的前四位确定子网掩码。前四位都置为“1”,即第四个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
C、把对应初始网络的各个位都置为“1”,即前三个字节都置为“1”,则子网掩码的间断二进制形式为:“11111111.11111111.11111111.11110000” 。
D、把这个数转化为间断十进制形式为:“255.255.255.240” 。
核心解释就是:子网掩码 计算时 x.x.x.x/y
y要掩盖住前面的(8,16,24其中的一个,看看和哪个比较接近就掩住,未掩住的剩下的几位,就是 子网号。子网号 每一位可以取0或1,就可以分割成 2^(未遮掩未数)个子网啦   )

四、超网

超网(supernetting),也称无类别域间路由选择(CIDR)。子网就是 将256个主机细划分成多个子网。超网就是将 多个 256个主机的子网,合并成一个大网。

1、首先 判断 是什么类型的网络(根据给定的IP地址),A类,B类,C类。这样做可以确定基本的网络位。

2、接下来判断 是子网还是 超网,根据掩码计算出的 网络位 和 基本网络位,进行比较。如果 网络位大于 基本位,那就是子网。超出的位数X,代表 2^x的子网数目。如果 网络位 小于基本位,那就代表是超网。超网只代表 一个大网络。缺少的位数+基本主机位 = 整个主机位 可以占用的位数 。

1.1.0.0/24  一个子网 可以容纳 256个主机

1.1.1.0/24  一个子网可以容纳256 个主机

将两个网络合并,可以用超网表示:

1.1.0.0/23 【这里应该是24-23,第三个字节是被合并的子网数,只有一位,可以表示0或1,刚好就是00000001.00000001.00000000.X 和00000001.00000001.00000001.X,第三个字节的最后一位表示合并子网数,上面的X就代表每个被合并的子网的主机有256个】

超网的合并需要 连续的子网。

========================================================

 在配置ACL时碰到这样一个地址范围:59.39.80.0-59.39.127.0,如何划分超网才使ACL条目最少呢?
 59.39.80.0转化为2进制为:
00111011.00100111.01010000.00000000
↑取全0之前位数为网络地址位,即59.39.80.0/20[59.39.80.0-59.39.95.255]得到一个超网
然后余下的地址以59.39.96.0开始,
59.39.96.0转化为2进制为:
00111011.00100111.01100000.00000000
↑取全0之前位数为网络地址位,即59.39.96.0/19[59.39.96.0-59.39.127.255],全部覆盖此地址池.
一共得到两条ACL,分别为:59.39.80.0/20、59.39.96.0/19

 

参考:
https://jingyan.baidu.com/article/ae97a646d936ddbbfd461d02.html
https://www.cnblogs.com/RzCong/p/5458962.html

网络原理-计算机网络详解-网络层概述

网络主要 分为:

1、IP网络(TCP/IP 网络协议)

2、NetWare网络( IPX/SPX网络协议)   目前已经停止维护了,废弃了。

3、X.25网络,网络层采用分组级协议(PacketlevelProtocol,PLP)

根据现实环境,本文只介绍IP网络的协议


一、上网信息流程分析

看这里的博文

二、IP协议

网络之间互连的协议(IP)是Internet Protocol的外语缩写, 中文缩写为“网协”.
网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

大白话:我们常说的IP就是 IP地址。tcp/ip 网络模型 中的网络层用的就是IP数据包。

版本号(Version):长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),IPv6的值(0110)

首部长度(Header Length)占 4 位,因此最大值为 15。值为 1 表示的是 1 个 32 位字的长度,也就是 4 字节。因为首部固定长度为 20 字节,因此该值最小为 5。如果可选字段的长度不是 4 字节的整数倍,就用尾部的填充部分来填充。也就是说可选字段长度可以是4字节,8字节等。

区分类型(Type of Service):长度8比特。这个子段可以拆分成两个部分:Precedence和TOS。TOS目前不太使用。而Precedence则用于QOS应用。(TOS字段的详细描述RFC 1340 1349)

IP包总长(Total Length):长度16比特。IP包最大长度65535字节。包括首部长度和数据部分长度。【以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的. 这个1500字节被称为链路层的MTU(最大传输单元).
但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区。并不包括链路层的首部和尾部的18个字节。所以事实上,这个1500字节就是网络层IP数据报的长度限制】

生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于故障而导致IP包在网络中不停被转发。

协议(Protocol):长度8比特。标识了上层所使用的协议。指出携带的数据应该上交给哪个协议进行处理,例如 ICMP、TCP、UDP 等。

首部校验和(Header Checksum):长度16位,由于IP包头是变长的,所以提供一个头部校验来保证IP包头中信息的正确性。因为数据报每经过一个路由器,都要重新计算检验和,因此检验和不包含数据部分可以减少计算的工作量。

起源和目标地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。

可选项(Options):该字段由起源设备根据需要改写。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。新的IP版本IPv6就将IP数据报的首部长度做成固定的。【经过抓包分析,如果ip包装载的是 udp 和 tcp ,那么ip头部不会添加可选项】

目前,这些可选项定义如下:
(1)安全和处理限制(用于军事领域)
(2)记录路径(Record route)(当IP包离开每个路由器的时候记录路由器的出站接口的IP地址)
(3)时间戳(Time Stamp)(让每个路由器都记下IP数据报经过每一个路由器的IP地址和当地时间)
(4)宽松的源站路由(Loose Source Route)(为数据报指定一系列必须经过的IP地址)
(5)严格的源站路由(Strict Source Route)(与宽松的源站路由类似,但是要求只能经过指定的这些地址,不能经过其他的地址) 这些选项很少被使用,并非所有主机和路由器都支持这些选项。

标识符(Identifier):长度16比特。在数据报长度过长从而发生分片的情况下,相同数据报的不同分片具有相同的标识符。该字段和Flags和Fragment Offest字段联合使用,对大的上层数据报进行分段(fragment)操作。

标记(Flags):长度3比特。该字段第一位不使用。第二位是DF位,DF位设为1时表明路由器不能对该上层数据报分段。如果一个上层数据报无法在不分段的情况下进行转发,则路由器会丢弃该上层数据报并返回一个错误信息。第三位是MF位,当路由器对一个上层数据报分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。

片偏移(Fragment Offset):长度13比特,片偏移的单位为 8 字节。该字段对包含分段的上层数据的IP包赋予序号。由于IP包在网络上传送的时候不一定能按顺序到达,这个字段保证了目标路由器在接受到IP包之后能够还原分段的上层数据报。到某个包含分段的上层数据报的IP包在传送是丢失,则整个一系列包含分段的上层数据的IP包都会被要求重传。

三、与 IP 协议配套使用的还有三个协议:

  • 地址解析协议 ARP(Address Resolution Protocol)
  • 网际控制报文协议 ICMP(Internet Control Message Protocol)
  • 网际组管理协议 IGMP(Internet Group Management Protocol)

网络原理-计算机网络详解-网络层之ICMP和ping

ICMP协议 (Internet控制报文协议)

1、ICMP协议概述

通常被认为是IP层的组成部分,一般被IP层或更高层(TCP、UDP)使用。
ICMP报文是在IP数据报内部被传输的。如图:

 

ICMP报文的格式如下:

报文的前4个字节都一样: 8bit类型,8bit代码,16bit检验和。

16bit检验和,算法和计算IP首部检验和一样,ICMP检验和要覆盖整个报文,包括首部和数据。
ICMP报文有不同的报文类型,不同类型由这个8bit的类型和8bit的代码共同决定。一个类型下可能有多个代码。
比如: 类型0表示回显应答(ping应答);类型1表示目的不可达,其中代码0表示网络不可达,代码1表示主机不可达,代码2表示协议不可达,代码3表示端口不可达等等…

报文也分为查询类型还是差错类型。因为有时要对差错报文进行特殊处理,比如对ICMP差错报文进行响应时就不会再生成一个ICMP差错报文…
当发生的是差错报文时,报文始终包含导致产生ICMP差错报文的原IP首部和数据部分的前8个字节(比如传输层的UDP或者TCP,这包含了端口号)。这里的原IP首部中的协议字段和前8个字节的端口号,可以判断出是哪个协议和哪个用户进程。
除了上述的ICMP差错报文不会再产生ICMP差错报文,一般目的地址是广播的数据报不会再产生ICMP差错报文了,这样防止广播风暴…

ICMP地址掩码请求与应答
ICMP时间戳请求与应答
ICMP端口不可达差错:
如果说报文发送到目的主机的未监听的端口,那么目的主机就会返回一个端口不可达的ICMP差错报文。traceroute就利用了这一点。

 

可以看出ICMP报文的数据部分,包含了原IP的首部和IP数据部分的前8个字节(这里就是UDP首部)。

2、ICMP之ping

ping程序是由Mike Muuss编写,目的是为了测试一个主机是否能到达。相当于潜艇的声呐一样,给对方发送测试信息,等待对方是否响应返回。

该程序的原理就是向目的主机发送一个请求回显类型(ICMP众多类型的一个,类型是8,代码是0)的ICMP报文,并等待返回ICMP回显应答(ICMP众多类型的一个,类型是0,代码是0)。
一般来说,如果ping不通主机,就表示不能访问那台机器。不过随着Internet安全意识提高,比如现在的路由器和防火墙已经可以提供访问控制列表了,ping不通也不一定是访问不了主机了…

ping程序ICMP回显请求和回显应答的报文格式如下:

Unix系统在实现ping程序时,标识符字段置成发送进程的ID号,这样一台机器启用多个ping的时候,当本机接到应答报文时,就能识别出是哪个ping实例发出的。
ping返回每个序列号,ttl,time…序列号是每发送一个新的回显请求就加1,起始是0。ttl就是过了几个路由(ping局域网内的机器发现ttl就不会减少)。time就是计算的往返时间,发送的时候在数据部分记录下发送时间,收到的时间减去这个发送时间。
ping的时候,往往会发现第一个回来的报文比别的要用的往返时间长,这个多出去的时候就可能是arp寻找mac地址…

ping程序也提供了查看IP记录路由选项的.在IP首部中,还记得有个选项的字段吧~这些个ip记录就放在这个字段里。每经过一个路由,就把这个路由出口的ip(注意这里规范是出口地址),回显应答报文回到源端时仍然会记录下每个路由的出口地址。
IP首部最长是60个字节,减去固定的20字节长度,剩下40个字节。记录路由IP的这个类型项、长度项、记录ip位置的指针各占1个字节,这样存放各个路由ip就只剩下37个字节,一个ip4个字节,因此最多只能记录9个路由…
IP首部的选项还可以记录IP时间戳。这个类似于IP记录路由选项。

3、ICMP之Traceroute

traceroute程序–可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由情况。

ping程序中也提供了查看IP记录路由选项,为啥还要再搞一个traceroute咧?主要原因还是因为IP首部选项能存储的ip数量太少了,最多9个。如果只考虑去和回的一个方向,那么最多只能存储4-5个路由,这在现在的互联网规模来看显然是不太满足的。
traceroute几个核心知识:利用TTL通过路由减1,直到变为1或者0时(路由不会传送TTL为0的包),路由就会发送超时类型的ICMP报文通知源端主机。利用UDP发送一般不常见的端口号给目的主机,当真正到达目的主机时,目的主机会发送一个端口不可达错误的ICMP报文(在未到达时,是路由返回的超时类型的ICMP报文,需要辨识开)。源端主机根据这个确认是否到达。TTL开始是1,逐渐递增。

一个细节:对于每个TTL值,都会发送三个包。每接到一个报文,就计算并打印出来往返时间。如果5秒钟内一个包没收到,就打印一个*号,并发送下一份数据报。

ICMP超时报文格式如下:

 

IP源站选路选项:
通常IP路由是动态的,每个路由都要判断下一站转发给谁。源站选路:就是由发送者指定路由。采用类似Traceroute程序的工具来发现实际的路由。
一般分为严格和宽松的两种。严格的源站,是由发送端确切指明每个路由,如果发现指定的路由不在这个连接的路由上,那么就会发送“源站路由失败”的ICMP报文。
宽松的:发送端指明一个路由的IP地址清单,每两个IP路由之间可以通过其他路由器。
这里指定的路由和IP记录路由选项是一样的,都是利用IP首部的选项字段,格式也很类似。

 

 


参考自:

http://www.cnblogs.com/firstForEver/p/5345900.html

网络原理-计算机网络详解-数据链路层之以太网

网络层 包括两种结构:

数据报与虚电路
https://blog.csdn.net/lovecc_orange/article/details/79237256

一、以太网帧结构

常见的以太网帧结构有:IEEE 802.3 和 DIX Ethernet V2

下面是 DIX Ethernet V2

802.3 又细分为 不同的 以太网 帧。

但主要就是 将上图的类型改为 长度 了,其他就是 将数据部分 做了一点拆分,其他变化不大。

802.3 以太网帧结构【来自维基百科】
前导码 帧开始符 MAC 目标地址 MAC 源地址 802.1Q 标签 (可选) 以太类型 负载 冗余校验 帧间距
10101010 7个octet 10101011 1个octet 6 octets 6 octets (4 octets) 2 octets 46–1500 octets 4 octets 12 octets
64–1522 octets
72–1530 octets
84–1542 octets

Ethernet II
以太 II 帧 (也称作DIX以太网,是以这个设计的主要成员,DEC,Intel和Xerox的名字命名的。[1]),把紧接在目标和源MAC地址后面的这个两字节定义为以太网帧数据类型字段。

例如,一个0x0800的以太类型说明这个帧包含的是IPv4数据报。同样的,一个0x0806的以太类型说明这个帧是一个ARP帧,0x8100说明这是一个IEEE 802.1Q帧,而0x86DD说明这是一个IPv6帧。

当这个工业界的标准通过正式的IEEE标准化过程后,在802.3标准中以太类型字段变成了一个(数据)长度字段。(最初的以太包通过包括他们的帧来确定它们的长度,而不是以一个明确的数值。)但是包的接收层仍需知道如何解析包,因此标准要求将IEEE802.2头跟在长度字段后面,定义包的类型。多年之后,802.3x-1997标准,一个802.3标准的后继版本,正式允许两种类型的数据包同时存在。实际上,两种数据包都被广泛使用,而最初的以太数据包在以太局域网中被广泛应用,因为他的简便和低开销。

为了允许一些使用以太II版本的数据报和一些使用802.3封装的最初版本的数据包能够在同一个以太网段使用,以太类型值必须大于等于1536(0x0600)。这个值比802.3数据包的最大长度1500byte (0x05DC)要更大。因此如果这个字段的值大于等于1536,则这个帧是以太II帧,而那个字段是类型字段。否则(小于1500而大于46字节),他是一个IEEE 802.3帧,而那个字段是长度字段。1500~1536(不包含)的数值未定义。因为网络环境 MTU选择是1500【即以太网帧最大负载是1500字节】,所以我们上网用的以太网帧 应该是 802.3帧。

=======================================================

标准的以太网帧,我们经常说的以太网帧长度是从图中 目标MAC地址开始,FCS结束。网卡对网络层数据的操作是加以太网帧头、以太网帧尾FCS,很显然上层需要提供目的MAC地址,否则接口无从完成以太网帧的封装。这需要IP层需要事先完成和ARP的交互,解析出目的IP对应的目的MAC,这显然不能由网卡来完成。

网卡对物理层接收到的二进制流成帧处理,校验FCS,去掉以太网帧头,把载荷Payload (中文指以太网帧内的数据)放在接收缓存,等待网络层取走。

标准的以太网帧最大可以发送长度1518字节,指的就是这个。去掉以太网头14个字节,再去掉尾部的校验和FCS 4个字节,留给上层协议也就是(1518-14-4)=1500个字节,这个就是MTU的由来。上层协议加黑的原因是要引起大家的注意,这个上层协议如果是IP,那么就是IP MTU,如果是MPLS,就是MPLS MTU,如果是IPv6,那就是IPv6 MTU。

类型: 以太网协议

网卡用来分辨封装的是什么协议,然后再通知不同的协议模块来取走数据。

Payload: 载荷(就是指以太网帧中的数据)

这个允许负荷的最大长度对应的就是负荷的最大传输单元,即MTU,标准的以太网帧,允许的最大负荷长度为1500字节,所以如果上层协议为IPv4,那就是IPv4 MTU=1500,所以经常看到主机的MTU为1500字节。

FCS: 校验码

为了防止在传输过程中发生错误,数据发送方的网卡会计算一个校验码,覆盖整个以太网帧,并放在以太网帧尾部,发送出去,接收网卡需要对其进行校验,来决定是否接收。而如果不校验,一个错误的帧可能要到TCP、UDP才能被发现出来,这样的话会浪费很多CPU资源。CPU会说:屁大点的事都搞不定,还要劳烦朕,可以去自宫了。而如果网卡来进行校验,错了就默默地丢弃,不惊动高层,高层肯定偷偷乐开了花。

IP层能发现IP包的损坏吗?

IP头的校验码只覆盖IP头,保证关键信息如目的IP在传输过程没有差错,可以到达目的地,至于里面封装内容则由目的地主机负责校验,可以减少路由器的处理时间,提高转发效率。

二、以太网特点

CSMA/CD可归结为四句话
发前先侦听,空闲即发送, 边发边检测,冲突时退避。

CSMA/CD解决的是,介质占用问题。
而全双工倾向解决的是,两端同时发送数据的碰撞问题。
具体内容可以查看介质访问控制 文章

为了通信的简便 以太网采取了两种重要的措施

  • 采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。
  • 以太网对发送的数据帧不进行编号,也不要求对方发回确认。
    • 这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的。

以太网提供的服务

  • 以太网提供的服务是不可靠的交付,即尽最大努力的交付。
  • 当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错的纠正由高层来决定。
  • 如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是一个重传的帧,而是当作一个新的数据帧来发送。

三、以太网的差错控制和流量控制

3.1差错控制

以太网的数据链路层的FCS检查是针对整个帧进行检查的。

IP帧的校验码只覆盖IP头,【16位首部校验和,可以查看ip报头】保证关键信息如目的IP在传输过程没有差错,可以到达目的地,至于里面封装内容则由目的地主机负责校验,可以减少路由器的处理时间,提高转发效率。所以IP层不能发现IP包的损坏。

所以以太网的差错重传,只能靠传输层的tcp/udp 进行控制了。因为数据链路层 和 ip层 差错重传都 不管。

3.2流量控制

以太网不需要确认帧(碰撞检测:CSMA/CD) 无线网有确认帧(碰撞检测:CSMA/CA)。
有确认帧的,可以使用窗口滑动协议进行流量控制。

当通过交换机一个端口的流量过大,超过了它的处理能力时,就会发生端口阻塞。
网络拥塞一般是由于线速不匹配(如100M向10M端口发送数据)和突发的集中传输而产生的,它可能导致这几种情况:延时增加、丢包、重传增加,网络资源不能有效利用。
流量控制的作用是防止在出现阻塞的情况下丢帧。

在半双工方式下,流量控制是通过反压(backpressure)技术实现,模拟产生碰撞,使得信息源降低发送速度。
有两种方法可以达到这一目的:交换机可以强行制造一次与服务器的冲突,使得服务器退避;或者,交换机通过插入一次“载波检测”使得服务器的端口保持繁忙,这样就能使服务器感觉到交换机要发送数据一样。利用这两种方法,服务器都会在一段时间内暂停发送,从而允许交换机去处理积聚在它的缓冲区中的数据。

在全双工方式下,IEEE802.3 x标准定义了在全双工环境中实现流量控制的方法。交换机产生一个”PAUSE”MAC控制帧,”PAUSE”MAC控制帧使用一个保留的组播地址:01-80-C2-00-00-01,将它发送给正在发送的站,发送站接收到该帧后,就会暂停或停止发送。PAUSE帧利用了一个保留的组播地址,它不会被网桥和交换机所转发,这样,PAUSE帧不会产生附加信息量。
在全双工环境中,服务器和交换机之间的连接是一个无碰撞的发送和接收通道。由于没有碰撞检测,且不允许交换机通过产生一次冲突而使得服务器停止发送

以太网pause帧 格式  【资料不全,大致整理如下】

目标mac 6字节 源mac  6字节 length/type 2字节 mac control opcode 2字节 mac control parameters 保留域 FCS

4字节

四、以太网CSMA/CD中的重传功能

1、以太网是没有差错控制中的重传功能的,以太网帧只有FCS(覆盖整个以太网帧,并放在以太网帧尾部)【大白话,计算帧头到帧尾前的数据,输出FCS放于帧尾处】

2、但是以太网每发完一帧,一定要把已经发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个帧重传一次。

===================================================

五、PPPOE

PPPOE 就是  PPP over Ethernet

PPPoE报文的格式就是在以太网帧中携带PPP报文,如图所示

PPPoE报文的格式就是在以太网帧中携带PPP报文,如图所示。

各个字段解释如下:

Destination_address域:一个以太网单播目的地址或者以太网广播地址(0xffffffff)。对于Discovery数据包来说,该域的值是单播或者广播地址,PPPoE Client寻找PPPoE Server的过程使用广播地址,确认PPPoE Server后使用单播地址。对于Session阶段来说,该域必须是Discovery阶段已确定的通信对方的单播地址。Source_address域:源设备的以太网MAC地址。

Ether_type:设置为0x8863(Discovery阶段或拆链阶段)或者0x8864(Session阶段)。

Ver域:4bits,PPPoE版本号,值为0x1。 Type域:4bits,PPPoE类型,值为0x1。  Code域:8bits,PPPoE报文类型。Code域为0x00,表示会话数据。Code域为0x09,表示PADI报文;Code域为0x07,表示PADO或PADT报文;Code域为0x19,表示PADR报文;Code域为0x65,表示PADS报文。报文的具体情况请参见附录部分。Session_ID域:16bits,对于一个给定的PPP会话,该值是一个固定值,并且与以太网Source_address和Destination_address一起实际地定义了一个PPP会话。值0xffff为将来的使用保留,不允许使用。   Length域:16bits,定义PPPoE的Payload域长度。不包括以太网头部和PPPoE头部的长度。数据域,有时也称之为净载荷域,在PPPOE的不同阶段该域内的数据内容会有很大的不同。在PPPOE的发现阶段时,该域内会填充一些Tag(标记);而在PPPOE的会话阶段,该域则携带的是标准的点对点协议包


六、以太网答疑

为什么以太网有最短/最长帧长度的要求?

总线型以太网半双工,碰撞检测所致长度要求。后来的星型以太网,全双工模式,长度可能就不受限制了。在全双工模式下,不会有冲突域、专用的交换机端口可用于全双工节点、主机的网卡和交换机端口必须能够运行在全双工模式下。

全双工以太网适用于:
1交换机到pc主机的连接。
2交换机到交换机的连接
3pc到pc的连接(使用交叉电缆
4交换机到路由器的连接(使用交叉电缆)
5路由器到路由器的连接(使用交叉电缆)
6路由器到主机pc的连接(使用交叉电缆)

全双工模式下,为了允许一些使用以太II版本的数据报和一些使用802.3封装的最初版本的数据包能够在同一个以太网段使用,以太类型值必须大于等于1536(0x0600)。这个值比802.3数据包的最大长度1500byte (0x05DC)要更大。

因此如果这个字段的值大于等于1536,则这个帧是以太II帧,而那个字段是类型字段。否则(小于1500而大于46字节),他是一个IEEE 802.3帧,而那个字段是长度字段。1500~1536(不包含)的数值未定义。因为网络环境 MTU选择是1500【即以太网帧最大负载是1500字节】,所以我们上网用的以太网帧 应该是 802.3帧。

以太网帧长度上下限
标准以太网帧长度下限为:64 字节
标准以太网帧长度上限为:1518 字节

最早的以太网工作方式:载波多路复用/冲突检测CSMA/CD,因为网络是共享的,即任何一个节点发送数据之前,先要侦听线路上是否有数据在传输,如果有,需要等待,如果线路可用,才可以发送。

假设A发出第一个bit位,到达B,而B也正在传输第一个bit位,于是产生冲突,冲突信号得让A在完成最后一个bit位之前到达A,这个一来一回的时间间隙slot time是57.6μs.

在10Mbps的网络中,在57.6μs的时间内,能够传输576个bit,所以要求以太网帧最小长度为576个bits,从而让最极端的碰撞都能够被检测到。这个576bit换算一下就是72个字节,去掉8个字节的前导符和帧开始符,以太网帧的最小长度为64字节。

如果说以太网帧的最小长度64byte是由CSMA/CD限制所致,那最大长度1500byte又是处于什么考虑的呢?

IP头total length为两个byte,理论上IP packet可以有65535 byte,加上Ethernet Frame头和尾,可以有65535 +14 + 4 = 65553 byte。如果在10Mbps以太网上,将会占用共享链路长达50ms,这将严重影响其它主机的通信,特别是对延迟敏感的应用是无法接受的。

由于线路质量差而引起的丢包,发生在大包的概率也比小包概率大得多,所以大包在丢包率较高的线路上不是一个好的选择。

但是如果选择一个比较小的长度,传输效率又不高,拿TCP应用来说,如果选择以太网长度为218byte,TCP payload = 218 – Ethernet Header -IP Header – TCP Header=218-18 – 20-20= 160 byte

那有效传输效率=160/218= 73%

而如果以太网长度为1518,那有效传输效率=1460/1518=96%

通过比较,选择较大的帧长度,有效传输效率更高,而更大的帧长度同时也会造成上述的问题,于是最终选择一个折衷的长度:1518 byte ! 对应的IP packet 就是 1500 byte,这就是最大传输单元MTU的由来。

MRU的由来(最大接收单元)

最早的以太网是通过Hub或集线器来工作的,在任意时刻只能有一台主机发送,这种共享方式发送效率很低,而现代高速交换机则让每个连接交换机的主机工作在独占模式,带宽独享,可以同时收发,而且现在早已不是早期的10Mbps的带宽,而是1000M、10000M,即使发送大包也不会影响别的主机,影响的只是交换机的接收和发送队列,既然发送大包效率要比小包效率搞,而且特定的应用也有发大包的需求,比如NFS文件系统,那为什么不把接口MTU提高一些,再高一些呢?这是一个好主意,于是网卡、交换机、路由器网络接口可以实现更大的MTU,可以达到>9000字节的大小,我们称这种远大于标准以太帧尺寸的帧为巨型帧Jumbo Frame 。

于是网络接口提供可以修改MTU的配置命令,比如缺省为1500,可以修改为1508以支持QinQ,或者1512以支持802.1q Mpls label,这样既可以支持终端用户标准1500 字节IP packet,又可以避免分片。

有一点需要说明,二层交换机的接口,我们可以看成一块普通的网卡,网卡工作在数据链路层,所以分片不是它的职责,如果一个帧需要从交换机一个接口发送出去,而帧的长度>接口MTU,怎么办?丢弃!会发什么消息告诉源主机吧?不会的,默默地丢,当什么否没有发生,这种情况最难以排查,如果traceroute可以看到端对端使通的,而发送数据就是会失败。所以切记,一台交换机要保证接口MTU的一致性。如果在一个VLAN上、或整个交换机都采用同样的MTU,就不会发生上述情况。而如果入接口是9000字节,而出接口是1500,就会发生上述问题。

如果一条物理链路的两端MTU不一致,则会发生什么情况,比如一侧是1500,一侧是9000,1500一侧发出来的数据肯定没有问题,但是如果从9000侧发给1500呢?数据也背默默地丢了。为什么呢?我们来谈另外一个很少提及的词汇:MRU,最大接收单元。

最大接收单元MRU

我们一直谈的最大传输单元MTU是关于出方向的流量处理,而MRU恰恰相反,是关于入方向的流量处理。

一般情况下MTU = MRU,比如9000侧的数据到达1500,由于9000>MRU ,所以直接默默丢弃。

所以在配置链路时,要确保两侧的设备MTU要匹配,无论各家厂商对MTU理解如何、实现如何,一定要保证两端匹配,即各自允许在以太网线上发送、接收的数据流,即以太网帧的最大长度一样

为什么无线局域网上发送数据帧后要对方必须发回确认帧,而以太网就不需要对方发回确认

CSMA/CD媒体访问控制方法的工作原理,可以概括如下:
先听后说,边听边说;
一旦冲突,立即停说;
等待时机,然后再说;

CSMA/CD协议解决了如何在有线以太网上检测和避免当两个或两个以上的网络设备需要同时进行数据传输时网络上的冲突。其工作原理可以总结为先听后说,边听边说;一旦冲突,立即停说;等待时机,然后再说。但其并不适合无线局域网,在无线局域网中,无线电波传输距离受限,不是所有的节点都能够都能监听到信号;而且,无线网卡工作在半双工模式下,设备无法一边接收数据信号,一边传送数据信号。另一方面,无线带宽本就不高,一旦发生碰撞,重新发送数据,会降低吞吐量。

为此,在802.11中对CSMA/CD进行了一些修改,采用了新的协议CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance),即,载波监听多路访问/冲突避免机制,利用ACK信号来避免冲突的发生,也就是说,只有当STA收到网络上返回的ACK信号后才确认送出的数据已经正确到达目的地址。
CSMA/CA协议
为了尽量避免碰撞,802.11标准规定,所有的STA在完成帧的发送后,必须在等待一段很短的时间才能发送下一帧,这段时间叫做帧间间隔IFS。帧间间隔的长短取决于该站要发送的帧的类型。高优先级的帧需要等待的时间较短,因此可以优先获得发送权,但低优先级帧就必须等待较长的时间。若低优先级帧还没来得及发送而其他高优先级帧已发送到媒体,则媒体变为忙态因而低优先级帧就只能再推迟发送了。这样就减少了发生碰撞的机会。至于各种帧间间隔的具体长度,这取决于使用的物理层特性。
SIFS,即短(Short)帧间间隔。SIFT是最短的帧间间隔,用来分隔开属于一次对话的各帧。在这段时间内,一个STA应当能够从发送方式切换到接收方式。使用SIFS的帧类型有:ACK帧、CTS帧、由过长的MAC帧分片后的数据帧,以及所有回答AP探询的帧和在PCF方式中接入点AP发送出的任何帧。
PIFS,即点协调功能帧间间隔(比SIFS长),是为了在开始使用PCF方式时(在PCF方式下使用,没有争用)优先获得接入到媒体中。PIFS的长度是SIPS加一个时隙时间(slot time)的长度。时隙的长度是这样确定的:在一个基本服务集BSS内,当某个站在一个时隙开始时接入到信道时,那么在下一个时隙开始时,其它站就都能检测出信道以转变为忙态。
DIFS,即分布协调功能帧间间隔(最长IFS),在DCF方式中用来发送数据帧和管理帧。DIFS的长度比PIFS再多一个时隙长度。
为了尽量减少碰撞的机会,802.11标准采用了一种叫做虚拟载波监听地的机制,这就是让源站把它要占用的信道时间(包括目的站发回确认帧所需时间)写入到所发送的数据帧中,(即在首部中的“持续时间”字段中写入需要占用信道时间,以微秒为单位,一直到目的站把帧确认完为止),以便使其他所有的站在这一段时间都不要发送数据。“虚拟载波监听”的意思是其他各站并没有监听信道,而是由于这些站都知道了源站正在用信道才不发送数据。这种好像是其他站都监听了信道。 当站点检测到正在通信中传送的帧“持续时间”字段时,就调整自己的网络分配向量NAV。NAV指出了信道处于忙状态的持续时间。信道处于忙状态就表示:或者是由于物理层的载波监听检测到信道忙,或者是由于MAC层的虚拟载波监听机制指出了信道忙。
CSMA/CA工作原理
(1)首先检测信道是否有STA在使用,如果检测出信道空闲,则等待DIFS时间后,才送出数据。
 (2)目的STA如果正确收到此帧,则经过SIFS时间间隔后,向源STA发送确认帧ACK。
 (3)源STA收到ACK帧,确定数据正确传输,在经历DIFS时间间隔后,会出现一段空闲时间,叫做争用窗口,表明会出现各STA争用信道的情况。
如果检测信道时发现信道正在使用,STA使用CSMA/CA协议的退避算法。冻结退避计时器。只要信道空闲,退避计时器就进行倒计时。当退避计时器减少到零时,STA就发送帧并等待确认。如果没有收到ACK帧,必须重传次帧。

参考:

https://zhuanlan.zhihu.com/p/21318925

https://blog.csdn.net/u011531613/article/details/59038866

https://blog.csdn.net/violet_echo_0908/article/details/51897628

 

 

网络原理-串行/并行通信、异步/同步传输

同步/异步这两个词不同领域的概念完全不同啊……
从数字电路的角度来说,以太网是典型的同步时序逻辑,它的时钟信号通过曼彻斯特编码(以前)或者4B/5B编码(现在)编码到了信号当中,接收方需要从信号当中使用锁相环解出这个时钟信号,这样发送方和接收方就有了一个同步的时钟信号。依靠这个同步的时钟信号接收方能够正确读取发送方发送的数据。实际上几乎所有的高速数字传输协议都是同步时序逻辑。

但是从软硬件接口的角度来看,这个过程又是异步的。计算机不会直接通过CPU指令操作当前正在发送的数据,而是通过一系列缓存,将数据送交到网卡,或者从网卡读取数据。计算机不关心网卡实际上在什么时候将数据发出,它只要将数据提交给网卡就可以继续进行其他任务了,实际上提交给网卡这样的工作通常也会使用DMA之类的方法。数据到来时也是一样的,网卡不会在接收到网络数据包第一个字节的时候就通知CPU处理,而是将接收到的数据先缓存起来,随时等待CPU或者DMA在合适的时候读取。这种有缓冲区的结构是典型的异步通信机制。
从socket接口上来看,又分为同步和异步两种,也可以叫做BLOCK/NONBLOCK。同步接口在不能发送数据或者接收数据时会阻塞,直到完成;异步接口则会通知你socket暂时不可用,让你使用epoll等机制等待。其实虽然非阻塞一般都叫做异步IO,真正的异步IO应该是使用信号通知机制的才算,但现在不太区分这个。实际上即使是所谓同步接口,在内核中仍然有缓冲区存在,只是用户态到内核态的这一层通信使用了同步的逻辑。

所以说,你这个问题首先取决于你对同步/异步的定义,以及在哪一层上看问题。

作者:灵剑
链接:https://www.zhihu.com/question/49448290/answer/116025530

=========================================================

问
所谓的同步异步最大得区别应该在于:同步中传输方和接受方使用同步时钟(即波特率是一样的,时序是一样的),而异步通讯允许双方使用各自不同的时钟。
我有点疑惑:如果一个数据能够被正确接受,那末它自身的波特率必须要和机器的时钟相吻合才可以,数据本身是有波特率的,比方说数据单字节a,一共长8秒钟,那末第一位占用1秒,第2位占用1秒,剩下的各位都是一位占一秒,共8秒;如果机器想要正确接收数据a,那末它的接受时钟就必须符合要求。我可以假设这样的情况:机器时钟也是每1秒判断一次,则正好正确接受数据a,如果机器每2秒判断一次,则接受数据a就会出现错误,如果机器每0。5秒判断一次,那末我们可以通过软件设置,规定0。5秒后再延迟0。5秒才进行下一此判断,这样我们也可以正确接受数据。(也就是说,接受数据的机器时钟不能比数据波特率长才能正确接受数据)。
说道这里,我们再看同步异步的定义:同步需要同步时钟,异步允许使用不同的时钟。同步可以理解,但是异步允许使用不同的时钟,假设,异步通讯中输出端s,接受端j,s输出数据a(a为单字节,共长8秒),而j的时钟为2秒,那样的话接受不就出现错误了马?(如果j的时钟为0。5秒,虽然和a的波特率不一样,但是我们可以通过软件设置保证接受正确)。
这样看来,异步中所说的允许使用各自独立的和不同步的时钟不就错误吗?请指教 谢谢

答 为什么很多地方讲解同步异步时都会说他们的“最大区别“? 因为两者有很多的相似点。我认为任何通信从广义上讲都是“同步“的。不管同步异步,要 保证通信的正确,就必须等待对方的确认,也就是说,我发送方必须与你接受方“同步“,反之亦然。或者说“协同”更好一点。同步通信要求双方的时钟同相,即同频率同时序。而异步通信可以不理会这点。但是同样要求接受方的时钟误差的积累程度不会造成误码。象楼主的情况,就是偏差太大了。 另外,在异步通讯时,基本单位是字符,传输时字符间异步,字符内各位同步,双方不需要严格同步,即使有百分之几的差异也可以保证数据的可靠传输;同步通讯时,字符与字符间和字符内部的位与位之间都需要严格同步,所以发送双方要使用同一时钟源。 其实,同步和异步的最大区别就是:字符与字符间的传送一个是异步,一个是同步;而在字符内的位与位之间,两者都是同步的。

=========================================================

简单说

同步传输模式就是,数据没有被对方确认收到则调用传输的函数就不返回。
接收时,如果对方没有发送数据,则你的线程就一直等待,直到有数据了才返回,可以继续执行其他指令。

异步传输模式就是,你调用一个函数发送数据,马上返回,你可以继续处理其他事,接收时,对方的有数据来,你会接收到一个消息,或者你的相关接收函数会被调用。

========================================================

查阅了很多资料,终于理清了头绪。首先讲串行通信和并行通信,这个比较简单。接着再讲讲,异步传输和同步传输。(里面涉及了帧同步和群同步问题)

以太网在物理层的同步传输,我查了一下,这边传输,另一边不需要回确认收到的应答信息,以太网在数据链路层也是,发送过来后,校验FCS,帧是否会出错,出错就丢弃。也不会请求重发,会将数据传递到上层。在udp和tcp中都有超时重传功能。

因为以太网采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。以太网对发送的数据帧不进行编号,也不要求对方发回确认。这样做的理由是局域网信道的质量很好,因信道质量产生差错的概率是很小的。(这和当时定义的 同步传输—一定要等对方发回确认信息后,才能传输下一段数据,有点不一样,切记。同样,ppp也没有重传机制。)

一、串行通信和并行通信

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。

USB是英文 Universal Serial Bus 的缩写,翻译成中文的含义是“通用串行总线”。

上网属于串行通信。
串行信号指的是同一时刻点,两设备之间指存在一个数据脉冲进行收发。而每根电缆里面,同一时刻只有一个数据脉冲,可以传输较远距离。这样,并行线至少要求有一大排线,传输距离非常有限,电话线只有两根,所以是串行信号通信。(从pc的网卡出去到服务器的网卡前,至于计算机内部看了下百科–>数据总线是并行的,所以内部应该是并行传网络数据的,备注:需要去看看《微机原理》)

家用的网线是串行传输数字信号,里面用差分信号技术来传输电压变化信息。

在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。比如,老式打印机同电脑之间。

并行接口与CPU的连接
数据总线:是CPU与并行接口进行数据交换的通道。

⑵读出写入信号线:控制数据流向,确定操作是读还是写。
⑶复位线,准备好状态线:并行接口数据准备就绪。
中断请求线:并行接口向CPU进行中断请求。
⑸地址译码电路:进行选择不同的接口电路,选择接口电路内部不同的寄存器
并行接口
控制寄存器:接收CPU发来的控制命令。
⑵数据输入缓冲器、数据输出缓冲器:进行数据的输入、输出。
状态寄存器:提供接口电路工作状态供CPU查询。

二、同步传输与异步传输

1、同步传输(Synchronous Transmission)
  • 它的比特分组要大的多,它不是独立地发送每个字符,每个字符都有自己的起始位和停止位,而是组合起来一起发送。我们将这些组合称为数据帧,简称为帧。
  • 帧的第一部分包含一组同步字符。
  • 帧的最后一部分是一个帧结束标记。
  • 同步传输通常要比异步传输快速,但其大小有限制。

2、异步传输

  • 异步传输将比特分成小组进行传送,小组可以是8位的1个字符或更长。
  • 接收方并不知道数据会在什么时候到达。
  • 异步传输的实现比较容易,由于每个信息都加上了‘同步’信息,因此计时的漂移不会产生大的积累,但却产生了较多的开销。

三、同步传输与异步传输的区别

1、异步传输是面向字符的传输,而同步传输是面向比特的传输。
2、异步传输的单位是字符而同步传输的单位是帧。
3、异步传输通过字符起止的开始和停止码,抓住再同步的机会,而同步传输则是以数据中抽取同步信息。
4、异步传输对时序的要求较低,同步传输往往通过特定的时钟线路协调时序。
5、异步传输相对于同步传输效率较低。

参考自:https://wenku.baidu.com/view/1985669fdd88d0d233d46a7c.html

======================================================

大白话讲:异步传输和同步传输

简单来说:

同步传输就是,数据没有被对方确认收到则调用传输的函数就不返回。接收时,如果对方没有发送数据,则你的线程就一直等待,直到有数据了才返回,可以继续执行其他指令。同步传输,就是发完一帧后,等待对方回应后,才能发下一帧。  

异步传输就是,你调用一个函数发送数据,马上返回,你可以继续处理其他事,  接收时,对方的有数据来,你会接收到一个消息,或者你的相关接收函数会被调用。

在网络通信过程中,通信双方要交换数据,需要高度的协同工作。为了正确的解释信号,接收方必须确切地知道信号应当何时接收和处理,因此定时是至关重要的。在计算机网络中,定时的因素称为位同步。同步是要接收方按照发送方发送的每个位的起止时刻和速率来接收数据,否则会产生误差。通常可以采用同步或异步的传输方式对位进行同步处理。

参考:https://blog.csdn.net/rs_network/article/details/50689539
首先同步和异步是指的物理层的属性,同时该同步和异步也会MAC层的封装造成影响(实际上MAC层协议也是针对物理层属性进行设计的),比如在HDLC封装的情况下,物理层一定是同步链路。

同步传输


同步传输的基本单元是帧,如果从这个层面上而言,当前网络大部分都是基于同步网络的。相对于异步传输,同步传输的效率会高很多,尤其是数据块的长度越长的时候,其效率越高。比如巨帧就是为了效率而扩展数据块的。从直观上来看,这里所述的同步帧的格式,也是当前主流的一些二层帧格式的框架,比如802.3的帧,或者802.11的帧。一个同步帧由同步字符,数据块,校验字符,与结束字符组成,第一个同步字符,从802.3来看就是Preamble部分,用来找SFD的,也就是帧同步。802.11里面也存在类似的部分,比如802.11b的PLCP preamble,或者802.11 a/g中间的preamble中的STF字段(其中T0~T7),这一块是用来做帧同步的。数据块就是用来放数据的,一般就是对应的MPDU。然后校验字符,一般就是FCS部分。最后一个部分目前理解不深,结束字符。当前接收帧的过程不确定是数个数的方法还是找结尾的方法,因为一般的帧头部都是按照TLV结构,即有了length之后,直接数多少个Bit看数据帧有没有接收完即可,不一定要采用固定结尾的方法。尤其在802.11中,该数据帧的length部分既出现在MAC以及上层中,也在PLCP部分也有。在802.11接收过程中,首先接收物理层头部,即可以获取其中的length,然后再等接收完完整上层数据帧后,在进行解析。以上所述即不确定最后一个EOB部分有没有在当前协议中广泛采用,即使不使用,也是可以接收完整个帧的。

同步传输的比特分组要大得多。它不是独立地发送每个字符,每个字符都有自己的开始位和停止位,而是把它们组合起来一起发送。我们将这些组合称为数据帧,或简称为帧。

数据帧的第一部分包含一组同步字符,它是一个独特的比特组合,类似于前面提到的起始位,用于通知接收方一个帧已经到达,但它同时还能确保接收方的采样速度和比特的到达速度保持一致,使收发双方进入同步。

帧的最后一部分是一个帧结束标记。与同步字符一样,它也是一个独特的比特串,类似于前面提到的停止位,用于表示在下一帧开始之前没有别的即将到达的数据了。

同步传输通常要比异步传输快速得多。接收方不必对每个字符进行开始和停止的操作。一旦检测到帧同步字符,它就在接下来的数据到达时接收它们。另外,同步传输的开销也比较少。例如,一个典型的帧可能有500字节(即4000比特)的数据,其中可能只包含100比特的开销。这时,增加的比特位使传输的比特总数增加2.5%,这与异步传输中25 %的增值要小得多。随着数据帧中实际数据比特位的增加,开销比特所占的百分比将相应地减少。但是,数据比特位越长,缓存数据所需要的缓冲区也越大,这就限制了一个帧的大小。另外,帧越大,它占据传输媒体的连续时间也越长。在极端的情况下,这将导致其他用户等得太久。

同步传输方式中发送方和接收方的时钟是统一的、字符与字符间的传输是同步无间隔的。
异步传输方式并不要求发送方和接收方的时钟完全一样,字符与字符间的传输是异步的。

=======================================================

深入分析同步模式举例

下面是以太网数据链路层的两种帧结构:

因为IEEE为了便于对数据链路层的优化管理,将数据链路层分成了LLC层和MAC层。如上图所示。后来还是其他的以太网帧格式流行,LLC层就没人用了。
上图我们可以看出,
以太网 数据链路层有 帧头(目的地址,原地址,帧类型【arp,ip,rarp等】)
以太网 数据链路层有 帧尾(FCS【帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错】)
下图 清晰展示 以太网 各层结构:
前同步码:第一个字段是7个字节的前同步码,1和0交替,作用是用来使接收端的适配器在接收MAC帧时能够迅速调整时钟频率,使它和发送端的频率相同。
帧开始定界符:第二个字段是1个字节的帧开始定界符,前六位1和0交替,最后的两个连续1表示告诉接收端适配器:“帧信息要来了,你准备接收把。
MAC 目的地址:第三个字段是6字节(MAC地址占48位,如:FF,FF,FF,FF,FF),发送方的网卡(MAC)地址,用处是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同则会进一步处理,不同则直接丢弃。
源MAC地址:发送端的MAC地址同样占6个字节。
类型:该字段在网络协议栈分解中及其重要,考虑当PDU(协议数据单元)来到某一层时,它需要将PDU交付给上层,而上层协议众多,所以在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0x0800时,表示将有效载荷交付给IP协议,为0x0806交付给ARP,0X8035交付给RARP。
数据:数据也叫有效载荷,除过当前层协议需要使用的字段外,即需要交付给上层的数据,以太网帧数据长度规定最小为46字节,最大为1500字节,如果有不到46字节时,会用填充字节填充到最小长度。最大值也叫最大传输单元(MTU),我们可以再 Linux输入 ifconfig 可以看到有一项MTU:1500。
帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错。

以太网是用同步模式传输的,将以太网的物理层 和下面 对比一下就能明白:

数据库和区块校验字符是,数据链路层层的。区块结束字符(EOB),在以太网中不存在。
=======================================================

异步传输

异步传输的基本单元是“编码字符”。一个一个编码字符按照顺序进行发送,这些编码字符传输的过程中,不需要一个个挨着进行传输,换言之,我们可以把该“编码字符”理解成一个小数据帧。这个方法适合一些同步性能不好,或者信道质量不好的情况。按书上所述,这里是不需要同步的,实际上这里理解应该是不需要帧同步,或者成为符号同步的,貌似在异步情况下,这两个同步的概念应该类似。在一些信道环境差的情况下,异步传输可能效果会好一些,比如说在802.11中一个帧只有在完整发送完之后,等待看有没有ACK从而判断数据帧有没有错误,如果采用异步传输的方式,由于每一个“编码字符”都是独立的,从而很快就能发现错误,从而避免问题。在一些无线研究中,也有参考类似的机制。不过异步传输的缺点是,传输效率低,每一个字符都要额外的起始位和停止位,如果把这两个去除的话,那么性能有很高的提高。异步传输的一个典型应用应该就是ATM,不过目前对ATM特质理解还不深,有待学习。

异步传输将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。一个常见的例子是计算机键盘与主机的通信。按下一个字母键、数字键或特殊字符键,就发送一个8比特位的ASCII代码。键盘可以在任何时刻发送代码,这取决于用户的输入速度,内部的硬件必须能够在任何时刻接收一个键入的字符。

异步传输存在一个潜在的问题,即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前,第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话,而你没来得及反应过来,漏掉了最前面的几个词。因此,每次异步传输的信息都以一个起始位开头,它通知接收方数据已经到达了,这就给了接收方响应、接收和缓存数据比特的时间;在传输结束时,一个停止位表示该次传输信息的终止。按照惯例,空闲(没有传送数据)的线路实际携带着一个代表二进制1的信号,异步传输的开始位使信号变成0,其他的比特位使信号随传输的数据信息而变化。最后,停止位使信号重新变回1,该信号一直保持到下一个开始位到达。例如在键盘上数字“1”,按照8比特位的扩展ASCII编码,将发送“00110001”,同时需要在8比特位的前面加一个起始位,后面一个停止位。

异步传输的实现比较容易,由于每个信息都加上了“同步”信息,因此计时的漂移不会产生大的积累,但却产生了较多的开销。在上面的例子,每8个比特要多传送两个比特,总的传输负载就增加25%。对于数据传输量很小的低速设备来说问题不大,但对于那些数据传输量很大的高速设备来说,25%的负载增值就相当严重了。因此,异步传输常用于低速设备。

=======================================================

深入分析异步模式举例

因为PPP模式支持异步传输和同步传输,所以以PPP异步传输举例最方便了。

PPP帧结构,查阅官方RFC资料

   A summary of the standard PPP frame structure is shown below.  This
   figure does not include start/stop bits (for asynchronous links), nor
   any bits or octets inserted for transparency.  The fields are
   transmitted from left to right.

           +----------+----------+----------+----------+------------
           |   Flag   | Address  | Control  | Protocol | Information
           | 01111110 | 11111111 | 00000011 | 16 bits  |      *
           +----------+----------+----------+----------+------------
                   ---+----------+----------+-----------------
                      |   FCS    |   Flag   | Inter-frame Fill
                      | 16 bits  | 01111110 | or next Address
                   ---+----------+----------+-----------------

   Inter-frame Time Fill

   For asynchronous links, inter-frame time fill SHOULD be accomplished
   in the same manner as inter-octet time fill, by transmitting
   continuous "1" bits (mark-hold state).

   For synchronous links, the Flag Sequence SHOULD be transmitted during
   inter-frame time fill.  There is no provision for inter-octet time
   fill.

   Implementation Note:

      Mark idle (continuous ones) SHOULD NOT be used for idle
      synchronous inter-frame time fill.  However, certain types of
      circuit-switched links require the use of mark idle, particularly
      those that calculate accounting based on bit activity.  When mark
      idle is used on a synchronous link, the implementation MUST ensure
      at least 15 consecutive "1" bits between Flags, and that the Flag
      Sequence is generated at the beginning and end of a frame.

PPP帧结构如下:数据链路层。

 

1.1 PPP帧的首部

  • 首部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的开始。
  • 首部中的地址字段A规定为0xFF(即11111111)。
  • 首部中的控制字段C规定为0x03(即00000011)。
  • 首部中的2字节的协议字段:
    (1)当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。
    (2)当协议字段为0xC021时,PPP帧的信息字段就是PPP链路控制协议LCP的数据。
    (3)当协议字段为0x8021时,PPP帧的信息字段就是网络层的控制数据。

1.2 PPP帧的信息字段部分

  • 信息字段的长度是可变的,不超过1500字节。

1.3 PPP帧的尾部

  • 尾部中的第一个字段(2个字节)是使用CRC的帧检验序列FCS。
  • 尾部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的结束。

注:标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果连续出现两个标志字段,就表示这是一个空帧,应当丢弃。

PPP异步传输时:

1、数据链路层:使用透明传输,预先处理。

  • 当PPP使用异步传输时,它把转移符定义为0x7D,并使用字节填充。
  • RFC1662规定了如下填充方法:
    (1)把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。
    (2)若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,0x5D)。
    (3)若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列的(0x7D,0x31)。
  • 由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在接收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。

2、物理层:在数据链路层的首尾两端各添加 一位(1bit),分别代表起始位和停止位。【  资料缺乏,但协议上已经说了,异步传输肯定 会添加  start/stop bits (for asynchronous links)  】

PPP同步传输时

1、数据链路层:使用透明传输,预先处理:

  • 当PPP使用同步传输时,使用零比特填充。
  • 零比特填充的具体方法:
    (1)在发送端先扫描整个信息字段(通常使用硬件实现,但也可以用软件实现,但是会慢一些)。
    (2)只要发现有5个连续的1,则立即填入一个0。
    (3)接收端在收到一个帧时,先找到标志字段F以确定帧的边界,接着再用硬件对其中的比特流进行扫描,每当发现5个连续1时,就把5个连续1后的一个0删除,以还原成原来的信息比特流。
  • 因此通过这种零比特填充后的数据,就可以保证在信息字段中不会出现连续6个1。

2、物理层:在数据链路层,头部添加:前同步码。至于尾部,暂时不清楚,反正基本上是和以太网 的同步传输 情况是一样的

=======================================================

当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立一条物理连接(底层up)。PC 机向路由器发送一系列的 LCP 分组(封装成多个 PPP 帧)。
这些分组及其响应选择一些 PPP 参数,和进行网络层配置(此前如有PAP或CHAP验证先要通过验证),NCP 给新接入的 PC机分配一个临时的 IP 地址,使 PC 机成为因特网上的一个主机。
通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。
说明,拨号上网一直在用,直达拔了网线,没了IP。

=======================================================

四、透明传输

就是在传输的数据里面,避免出现,该层的定界符,以免误判 数据块 提早结束了。

五、帧同步与群同步

帧同步与群同步 两者是等价的,其实就是指异步传输。

在群同步的通信系统中,传输的信息被分成若干”群”。所谓的”群”,一般是以字符为单位,在每个字符的前面冠以起始位、结束处加上终止位,从而组成一个字符序列o数据传输过程中,字符可顺序出现在比特流中,字符与字符间的间隔时间是任意的,即字符间采用异步定时,但字符中的各个比特用固定的时钟频率传输。在数据通信中,习惯于把群同步称为”异步传输”。字符间的异步定时和字符中比特之间的同步定时,是群同步即异步传输的特征。这种传输方式中,每个字符以起始位和停止位加以分隔,故也称”起一止”式传输。
群同步又称帧同步,其作用是在时分复用系统中使接收端能在所接收到的数字信号序列中找出一帧的开头和结尾,从而能正确的分路。实现帧同步的方法也有两类:第一类方法是在发送的数字信号序列中插入帧同步脉冲或帧同步码作为帧的起始标志,这就是外同步法;另一类方法是利用数字信号序列本身的特性来恢复帧同步信号,即自同步法。
同步传输规程中的每个字符可由下列四部分组成:
(1)1位起始位,以逻辑“0”表示;
(2)5~8位数据位,即要传输的字符内容;
(3)1位奇/偶检验位,用于检错,该部分可以不选;
(4)1~2位停止位,以逻辑”1″表示,用以作字符间的间隔。

 

群同步实现方法:

(1)连贯插入法
连贯插入法是在每帧的开头插入一个帧同步码字,如PCM30/32路帧同步码。
帧同步码应具有以下特点:
1) 在满足帧同步性能的条件下,为提高有效信息的传输效率,帧同步码的长度应尽可能短。
2)捕捉时间要短。
3)尽可能避免信息数据中出现和它相同的码字,以减少假同步。
帧同步的种类:
1)全0码
2)全1码
3)0与1交替码
4)PCM30/32路帧同步码0011011
5)巴克(Barker)码
(2)分散插入法

连贯插入同步码是一个码组,要使同步可靠,同步码组就要有一定的长度,从而降低了传输效率。而分散插入则是每帧只插入一位作为帧同步码。例如北美和日本采用的24路PCM,每帧有8×24=192信息码元,每逢奇帧其后插入一位帧同步码,1010…交替插入。由于每帧只插入一位,它和信息码元混淆的概率为1/2,这样似乎无法识别帧同步码。不过分散插入方式在捕获同步时,并不是只检测1帧2帧,而是要连续检测10帧以上,每帧都符合“1”、“0”交替的规律才确认同步。误同步概率是很小的。
分散插入法传输效率高,但同步捕获时间长。

网络原理-计算机网络详解-数据链路层概述

一、数据链路层含义

数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。

封装成帧,将数据链路层的帧,直接交给物理层就行。物理层会自动添加首尾(物理层头部一定会加的,尾部不确定),并编码。

二、数据链路层协议分类

1.面向字符的链路层协议

ISO的IS1745,基本型传输控制规程及其扩充部分(BM和XBM)
IBM的二进制同步通信规程(BSC)
DEC的数字数据通信报文协议(DDCMP)
PPP(同步传输模式面向位,异步传输模式面向字符)
等等

2.面向比特的链路层协议

 HDLC的产生背景

在计算机通信的早期人们就已发现,对于经常产生误码的实际链路,只要加上合适的控制规程,就可以使通信变为比较可靠的。那时 ARPANET 和 IBM 公司分别使用了各自的控制规程,它们分别是:IMP-IMP 协议和 BSC 规程(也可称为 BISYNC,即 BInary SYNchronous Communication 的缩写)。这些规程都是数据链路层的协议。

上述的两种协议都是面向字符的。所谓面向字符就是说在链路上所传送的数据必须是由规定字符集(例如 ASCII 码)中的字符所组成。不仅如此,在链路上传送的控制信息也必须由同一个字符集中的若干指定的控制字符构成。这种面向字符的链路控制规程在计算机网络的发展过程中曾起了重要的作用。

但随着计算机通信的发展,这种面向字符的链路控制规程就逐渐暴露出其弱点。就以著名的 BSC 规程来说,其主要限制是

(l)通信线路的利用率低,因为它采用的是停止等待协议,收发双方交替地工作。

(2)所有通信的设备必须使用同样字符代码,而不同版本的 BSC 规程要求使用不同的代码。

(3)只对数据部分进行差错控制,若控制部分出错就无法控制,因而可靠性较差。

(4)不易扩展。每增加一种功能就需要设定一个新的控制字符。

此外,它还存在其他一些缺点。由此可见,需要设计出一种新的链路控制规程来代替旧的面向字符的链路规程。

1974年,IBM 公司推出了著名的体系结构 SNA。在 SNA 的数据链路层规程采用了面向比特的规程  SDLC( Synchronous Data Link Control)。后来   IBM 将此规程提交美国国家标准协会 ANSI 和国际标准化组织 ISO,建议能成为国家和国际标准。ANSI 把 SDLC 修改为 ADCCP(Advanced Data Communication Control Procedure)作为美国国家标准,而 ISO 把 SDLC 修改后称为 HDLC(High-level Data Link Control),译为高级数据链路控制,作为国际标准 ISO 3309。我国的相应国家标准是 GB 7496。 CCITT 则将 HDLC 再修改后称为链路接入规程 LAP(Link AccessProcedure),并作为 X.25 建议书的一部分(即有关数据链路层协议的部分)。不久,HDLC 的新版本又把 LAP 修改为 LAPB,“B” 表示平衡型(Balanced),所以 LAPB 叫做链路接入规程(平衡型)。这样X.25的数据链路层就叫做LAPB了。

上述这几个面向比特的链路规程均大同小异。ADCCP 与 HDLC 没有多少区别。SDLC 虽然最早提出,但它实际上是 HDLC 的一个子集。

LLC是为了使数据链路层更好地适应各种局域网标准,由802委员会做出决定将数据链路层拆分为2个子层,即LLC Logical Link control逻辑链路控制子层和MAC Mdedium Access Control媒体接入控制子层。将于接入到传输媒体有关的内容都放在MAC子层,而LLC子层则与传输媒体无关。

而到了上个世纪90年代后,以太网中的DIX Ethernet V2已经成为了事实上的业界标准,并且也不属于802委员会所规定的几种以太网标准之一。所以等于说标准落后于实际生产了,这个时候LLC已经失去了作用。

从那往后,大多数的网卡上都不装LLC协议,而只有MAC协议了。

所以我们现在一般在座比较的时候,直接来比较HDLC和MAC两个层控制协议以及他们所控制的的数据结构就可以了。LCC基本上已经消失了。

三、数据链路层功能

1、帧同步

大白话就是,从数据链路层中,准确识别并提取 数据链路层 的帧信息。(和之前提到的,群同步、异步传输等于帧同步 ,不是特别对,反正大致意思明白就行,人家的百科 群同步 等于 帧同步 等于 异步传输,本来就写得不妥)
用到的方法有:
(1)字节计数法:这是一种以一个特殊字符表示一帧的起始并以一个专门字段来标明帧内字节数的帧同步方法。接收方可以通过对该特殊字符的识别从比特流中区分出帧的起始并从专门字段中获知该帧中随后跟随的数据字节数,从而可确定出帧的终止位置。
(2)使用字符填充的首尾定界符法:该法用一些特定的字符来定界一帧的起始与终止,为了不使数据信息位中出现的与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据字符前填充一个转义控制字符(DLE)以示区别,从而达到数据的透明性。但这种方法使用起来比较麻烦,而且所用的特定字符过份依赖于所采用的字符编码集,兼容性比较差。
(3)使用比特填充的首尾标志法:该法以一组特定的比特模式(如01111110)来标志一帧的起始与终止。本章稍后要详细介绍的HDLC规程即采用该法。为了不使信息位中出现的与特定比特模式相似的比特串被误判为帧的首尾标志,可以采用比特填充的方法。比如,采用特定模式01111110,则对信息位中的任何连续出现的五个“1”,发送方自动在其后插入一个“0”,而接收则做该过程的逆操作,即每接收到连续五个“1”,则自动删去其后所跟的“0”,以此恢复原始信息,实现数据传输的透明性。比特填充很容易由硬件来实现,性能优于字符填充方法。
(4)违法编码法:该法在物理层采用特定的比特编码方法时采用。例如,一种被称作曼彻斯特编码的方法,是将数据比特“1”编码成“高-低”电平对,而将数据比特“0”编码成“低-高”电平对。而“高-高”电平对和“低-低”电平对在数据比特中是违法的。可以借用这些违法编码序列来定界帧的起始与终止。局域网IEEE 802标准中就采用了这种方法。违法编码法不需要任何填充技术,便能实现数据的透明性,但它只适用于采用冗余编码的特殊编码环境。由于字节计数法中COUNT字段的脆弱性以及字符填充法实现上的复杂性和不兼容性,较普遍使用的帧同步法是比特填充和违法编码法。
=========================================================
以太网 V2  没有帧长度   , 如何识别 物理层 如何识别?
The Ethernet II frame format does not contain a length field, and I’d like to understand how the end of a frame can be detected without it.
来自:https://stackoverflow.com/questions/3416990/how-to-determine-the-length-of-an-ethernet-ii-frame

The length field inside the frame is not needed for layer1.Layer1 uses other means to detect the end of a frame which vary depending on the type of physical layer.

  • with 10Base-T a frame is followed by a TP_IDL waveform. The lack of further Manchester coded data bits can be detected.
  • with 100Base-T a frame is ended with an End of Stream Delimiter bit pattern that may not occur in payload data (because of its 4B/5B encoding).

A rough description you can find e.g. here:http://ww1.microchip.com/downloads/en/AppNotes/01120a.pdf “Ethernet Theory of Operation”

网友答案:
LLC只出现在802.3以太网的格式中,802.3的MAC层没有字段指明上层协议字段,但是指明了数据包长度,所以上层协议需要LLC指明。
在ETHERNET_II帧中,把802.3的长度字段改为了type。由Type字段区分上层协议,这时候就没有必要实现LLC子层,仅包含一个MAC子层。
只是现在厂商都用ETHERNET_II。实际效果和802.3+LLC是一样的。
如何区分两种帧 
  根据源地址段后的前两个字节的类型不同。 
  如果值大于1500(0x05DC),说明是以太网类型字段,EthernetII帧格式。值小于等于1500,说明是长度字段,IEEE802.3帧格式。因为类型字段值最小的是0x0600。而长度最大为1500。 
那么问题来了,802.3是有长度标志的,LLC表示上层协议,Ethernet_II没有长度标志,至少现在都不用了,那么判定一个数据包是不是发送完了呢。
解答:
因为以太网帧使用4B/5B编码,出现5bit固定类型的二进制,表示此数据包结束,正常传输中是不会出现这5bit的特定序列,如果有也是经过反码或者补码什么的替换掉了,学过计算机组成原理的同学就知道了。所以不需要协议里面有长度字段。当然具体还有很多细节,喜欢深究的同学可以自行脑补。【100M以太网的情况下看来是】
=========================================================

2、差错控制

为了防止在传输过程中发生错误,数据发送方的网卡会计算一个校验码,覆盖整个以太网帧,并放在以太网帧尾部,发送出去,接收网卡需要对其进行校验,来决定是否接收。而如果不校验,一个错误的帧可能要到TCP、UDP才能被发现出来,这样的话会浪费很多CPU资源。CPU会说:屁大点的事都搞不定,还要劳烦朕,可以去自宫了。而如果网卡来进行校验,错了就默默地丢弃,不惊动高层,高层肯定偷偷乐开了花。

大白话就是:数据链路层帧的FCS,就是用来检查帧有没有传错的,一般FCS里面用的是CRC检错法。因为以太网帧和PPP帧都没有重传机制,所以的重传控制只能由tcp/udp 的传输控制里面去了。而下面的方法,都是基于确认帧的。

FCS检查完后,正确的接收,错误的丢弃。这叫做无差错接收。
后面的差错帧重传,这样才算可靠传输【数据帧   的  无差错,无丢失】。

数据链路层的FCS检查是针对整个帧进行检查的。

IP帧的校验码只覆盖IP头,【16位首部校验和,可以查看ip报头】保证关键信息如目的IP在传输过程没有差错,可以到达目的地,至于里面封装内容则由目的地主机负责校验,可以减少路由器的处理时间,提高转发效率。所以IP层不能发现IP包的损坏。

所以以太网的差错重传,只能靠传输层的tcp/udp 进行控制了。因为数据链路层 和 ip层 差错重传都 不管。

关于以太网的CSMA/CD ,这个是解决 共享传输介质下 如何独占 收发信息。以太网在全双工下,也会出现 传输的帧出 差错,但是因为概率小,所以就没有用确认帧。

1. 差错的产生原因

当数据信号从发送端出发到物理线路时,由于物理线路存在噪声,因此数据信号经过物理线路到达接收端时,接收信号必然是数据信号和噪声信号的叠加,这就是差错的产生原因。

2. 差错的控制方法

2.1 误码率的定义

误码率(Pe):指二进制比特在数据传输系统中被传错的概率
N为传输的二进制比特总数,Ne为传错的比特数

Pe = Ne / N

2.2 差错控制

差错控制:检测和纠正 比特流传输错误的方法,目的是为了减少物理线路的传输错误

差错控制的两种策略:
纠错码:每个传输的分组带上足够的冗余信息,接收端能发现并自动纠正传输差错
检测码:分组仅包含足以使接收端发现差错的冗余信息,接收端能发现出错,但不能确定哪一比特是错的,并且自己不能纠正传输差错

纠错码实现困难,而检错码方法虽然可以通过重传机制达到纠错目的,但是实现简单,所以广泛采用检错码策略

2.3 检错码:循环冗余编码(CRC)

检错码又分为两种,奇偶校检码和循环冗余编码,而循环冗余编码是广泛使用的检错码方法,它检错能力强,实现容易。

循环冗余编码(CRC)的工作原理:

  1. 首先收发双方约定一个**生成多项式**G(x)
  2. 发送端把数据看成一个多项式f(x)
  3. 把f(x) 乘以生成多项式的最高次幂,f(x) * xk,目的是为了左移k位,用来放余数
  4. f(x) * xk/G(x),求得余数
  5. 将f(x) * xk+R(x)作为整体,发送到接收端
  6. 接收端用接收到的数据f′(x)采用相同的算法,去除约定好的G(x),得到余数R′(x)。如果R′(x)等于 R(x),表示发送没有出错;否则,说明传输出错,例如:1100111001 / 11001 = 0。

举例:发送数据110011
1. 约定G(x)=x4+x3+1,则对应G(x)的二进制代码为: 11001(N = 5,k = 4)
2. 发送数据比特序列为110011,其对应的多项式为f(x)=x5+x4+x1+1
3. G(x)的最高次幂为4,f(x) * x4 = 1100110000
4. f(x) * xk/G(x),余数为:R(x) = 1001
5. 将f(x) * xk+R(x)作为整体,发送到接收端:1100111001
6. 接收端解码:1100111001 / 11001 = 0,说明传输成功

========================================================

用以使发送方确定接收方是否正确收到了由它发送的数据信息的方法称为反馈差错控制。通常采用反馈检测和自动重发请求(ARQ)两种基本方法实现。

反馈检测法

反馈检测法也称回送校验或“回声”法,主要用于面向字符的异步传输中,如终端与远程计算机间的通信,这是一种无须使用任何特殊代码的错误检测法。双方进行数据传输时,接收方将接收到的数据(可以是一个字符,也可以是一帧)重新发回发送方,由发送方检查是否与原始数据完全相符。若不相符,则发送方发送一个控制字符(如DEL)通知接收方删去出错的数据,并重新发送该数据;若相符,则发送下一个数据。反馈检测法原理简单、实现容易,也有较高的可靠性,但是,每个数据均被传输两次,信道利用率很低。一般,在面向字符的异步传输中,信道效率并不是主要的,所以这种差错控制方法仍被广泛使用。

自动重发法

(ARQ法):实用的差错控制方法,应该既要传输可靠性高,又要信道利用率高。为此让发送方将要发送的数据帧附加一定的冗余检错码一并发送,接收方则根据检错码对数据帧进行错误检测,若发现错误,就返回请求重发的答,发送方收到请求重发的应答后,便重新传送该数据帧。这种差错控制方法就称为自动请求法(Automatic Repeat reQuest),简称ARQ法。ARQ法仅返回很少的控制信息,便可有效地确认所发数据帧是否被正确接收。ARQ法有若干种实现方案,如空闲重发请求(Idle RQ)和连续重请求(Continuous RQ)是其中最基本的两种方案。

空闲重发请求

(Idle RQ):空闲重发请求方案也称停等(stop-and -wait)法,该方案规定发送方每发送一帧后就要停下等待接收方的确认返回,仅当接收方确认正确接收后再继续发送下一帧。空闲重发请求方案的实现过程如下: 发送方每次仅将当前信息帧作为待确认帧保留在缓冲存储器中。当发送方开始发送信息帧时,随即启动计时器。 当接收方检测到一个含有差错的信息帧时,便舍弃该帧。当接收方收到无差错的信息帧后,即向发送方返回一个确认帧。 若发送方在规定时间内未能收到确认帧(即计时器超时),则应重发存于缓冲器中待确认信息帧。若发送方在规定时间内收到确认帧,即将计时器清零,继而开始下一帧的发送。从以上过程可以看出,空闲RQ方案的收、发双方仅须设置一个帧的缓冲存储空间,便可有效地实现数据重发并保证收接收方接收数据不会重份。空闲RQ方案最主要的优点就是所需的缓冲存储空间最小,因此在链路端使用简单终端的环境中被广泛采用。

连续重发请求

(Continuous RQ):连续重发请求方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可发送下一帧。这就需要一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的信息帧。每当发送站收到对某信息帧的确认帧后,便从重发表中将该信息帧删除。所以,连续RQ方案的链路传输效率大大提高,但相应地需要更大的缓冲存储空间。连续RQ方案的实现过程如下:发送方连续发送信息帧而不必等待确认帧的返回。发送方在重发表中保存所发送的每个帧的拷贝。重发表按先进先出(FIFO)队列规则操作。接收方对每一个正确收到的信息帧返回一个确认帧。每一个确认帧包含一个唯一的序号,随相应的确认帧返回。接收方保存一个接收次序表,它包含最后正确收到的信息帧的序号。当发送方收到相应信息帧的确认帧后,从重发表中删除该信息帧。当发送方检测出失序的确认帧(即第n号信息帧和第n+2号信息帧的确认帧已返回,而n+1号的确认帧未返回)后,便重发未被确认的信息帧。实际操作过程中,两节点间采用双工方式将确认帧插在双方的发送信息帧中来传送的。上面的连续RQ过程是假定在不发生传输差错的情况下描述的。如果差错出现,如何进一步处理可以有两种策略,即Go-back-N和选择重发。 Go-back-N是当接收方检测出失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧,或者当发送方发送了n帧后,若发现该n帧的前一帧在计时器超时后仍未返回其确认信息,则该帧被判定为出错或丢失。对接收方来说,因为这一帧出错,就不能以正确的序号向它的高层递交数据,对其后发送来的n帧也可能都不能接收而丢弃,因此,发送方发现这种情况,就不得不重新发送该出错帧及其后的n帧,这就是Go-back-N(退回N)法名称的由来。Co-back-N法操作过程如图3-2所示。图中假定发送完8号帧后,发现2号帧的确认返回在计时器超时后还未收到,则发送方只能退回从2号帧开始重发。Go-back-N可能将已正确传送到目的方的帧再传一遍,这显然是一种浪费。另一种更好的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧,一旦收到重新传来的帧后,就可与原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发(Selective repeat),其工作过程如图3-3所示。图中2号帧的否认返回信息NAK2要求发送方选择重发2号帧。显然,选择重发减少了浪费但要求接收方有足够大的缓冲区容量。
=========================================================

3、流量控制

流量控制涉及链路上字符或帧的传输速率的控制,以使接收方在接收前有足够的缓冲存储空间来接受每一个字符或帧。例如,在面向字符的终端--计算机链路中,若远程计算机为许多台终端服务,它就有可能因不能在高峰时按预定速率传输全部字符而暂时过载。同样,在面向帧的自动重发请求系统中,当待确认帧数量增加时,有可能超出缓冲器存储容量,也造成过载。
=======================================================

以太网的流量控制:

以太网不需要确认帧(碰撞检测:CSMA/CD) 无线网有确认帧(碰撞检测:CSMA/CA)。
有确认帧的,可以使用窗口滑动协议进行流量控制。

当通过交换机一个端口的流量过大,超过了它的处理能力时,就会发生端口阻塞。
网络拥塞一般是由于线速不匹配(如100M向10M端口发送数据)和突发的集中传输而产生的,它可能导致这几种情况:延时增加、丢包、重传增加,网络资源不能有效利用。
流量控制的作用是防止在出现阻塞的情况下丢帧。

在半双工方式下,流量控制是通过反压(backpressure)技术实现,模拟产生碰撞,使得信息源降低发送速度。
有两种方法可以达到这一目的:交换机可以强行制造一次与服务器的冲突,使得服务器退避;或者,交换机通过插入一次“载波检测”使得服务器的端口保持繁忙,这样就能使服务器感觉到交换机要发送数据一样。利用这两种方法,服务器都会在一段时间内暂停发送,从而允许交换机去处理积聚在它的缓冲区中的数据。

在全双工方式下,IEEE802.3 x标准定义了在全双工环境中实现流量控制的方法。交换机产生一个”PAUSE”MAC控制帧,”PAUSE”MAC控制帧使用一个保留的组播地址:01-80-C2-00-00-01,将它发送给正在发送的站,发送站接收到该帧后,就会暂停或停止发送。PAUSE帧利用了一个保留的组播地址,它不会被网桥和交换机所转发,这样,PAUSE帧不会产生附加信息量。
在全双工环境中,服务器和交换机之间的连接是一个无碰撞的发送和接收通道。由于没有碰撞检测,且不允许交换机通过产生一次冲突而使得服务器停止发送

在实际的网络中,尤其是一般局域网,产生网络拥塞的情况极少,所以有的厂家的交换机并不支持流量控制。高性能的交换机应支持半双工方式下的反向压力和全双工的IEEE802.3x流控。有的交换机的流量控制将阻塞整个LAN的输入,降低整个LAN的性能;高性能的交换机采用的策略是仅仅阻塞向交换机拥塞端口输入帧的端口,保证其他端口用户的正常工作。
##################################################
pause帧格式:
至于以太网的CSMA/CD ,应该是 数据帧发送,检测数据帧小于64字节,说明发生了链路碰撞。数据帧的发送和接收应该是用协议发送的,接收数据帧到本地,用设计好的CSMA/CD函数判断数据帧是不是小于64字节,然后决策是不是 数据碰撞了。

https://en.wikipedia.org/wiki/Ethernet_flow_control
https://www.tuicool.com/articles/Bzu2uuf

========================================================

4、链路控制

链路管理功能主要用于面向连接的服务。当链路两端的节点要进行通信前,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持该连接。如果出现差错,需要重新初始化,重新自动建立连接。传输完毕后则要释放连接。数据连路层连接的建立维持和释放就称作链路管理。在多个站点共享同一物理信道的情况下(例如在LAN中)如何在要求通信的站点间分配和管理信道也属于数据链路层管理的范畴。
=========================================================
在以太网中,LLC只出现在802.3以太网的格式中,802.3的MAC层没有字段指明上层协议字段,但是指明了数据包长度,所以上层协议需要LLC指明。在ETHERNET_II帧中,把802.3的长度字段改为了type。由Type字段区分上层协议,这时候就没有必要实现LLC子层,仅包含一个MAC子层。

以太网的上层协议可以有好几种,(1)无连接,这种传输效果难以保证。(2)面向连接,该方式提供了四种服务:连接的建立、确认和数据到达响应、差错恢复(请求重发接收的错误数据)以及滑动窗口(用来提高数据传输速率)。(3)无连接应答响应服务。

网络层的IP协议,就是面向无连接的。 

经过探讨,因为以太网是面向无连接的,而PPP是面向连接的,所以以太网不需要向PPP那样,建立连接,断开连接,这些数据链路层控制命令操作。
=========================================================

5、透明传输

因为数据链路层的帧是有帧定界的,如果该帧上面传递的数据,意外包含了帧定界的,采取以下措施:
当信息字段中出现和标志字段一样的比特组合时,如(0x7E),就必须采取一些措施使这种形式上和标志字段一言的比特组合不出现在信息字段中。
如:
当PPP使用异步传输时,它把转移符定义为0x7D,并使用字节填充。
当PPP使用同步传输时,使用零比特填充。


四、滑动窗口协议-基于确认帧的流量控制协议

目前只知道滑动窗口协议可以实现流量控制,但是这是建立在帧的确认基础上的.
滑动窗口协议:可以一次控制发送几帧,用于流量控制。也可以进行帧出错重传,用于差错控制方面。
以太网不需要接收端发送确认帧是怎样实现流量控制的呢? 
半双工方式下是backpressure方式发送信号干扰其他站的发送
全双工下使用802.3x定义的pause帧来通知对端。

前面提到了用检错码来检测帧传输中是否发生了错误,如果发生了错误,就需要通过滑动窗口协议来解决。

滑动窗口协议分为两种类型: 

1. 单帧停止等待协议

发送端每次发送1帧之后,需要等待接收端返回确认帧,如果接受到ACK,表示传输成功,发送下一帧;如果接收到NAK,表示传输错误,重新发送此帧

2. 多帧连续发送协议

多帧连续发送有两种类型,后退N帧(GBN)拉回重发方式和选择重发(SR)方式

1. 后退N帧(GBN)拉回重发方式

只要有一个帧发送失败,则当前发送的全部帧都重新发送,这样导致的问题就是会发送许多重复帧,流量控制不好

2. 选择重发(SR)方式

选择重发和拉回重发的区别在于,当前发送的帧中出现某个帧传输错误后,在下一次发送时只是重新发送该错误的帧

3. 滑动窗口机制

在GBN和SR中,发送端可以连续发送多个数据帧,从流量控制的角度出发,发送端连续发送数据帧的数量必然会收到限制:
1. 接收端的缓冲区可以用于接受新的帧的容量
2. 接收端处理数据帧的速度
3. 接收端需要等待重传的帧的数量

引入滑动窗口的目的:对可以连续发出的最多帧数(已发出但未确认的帧)作限制 

发送窗口(Ws):表示在收到对方确认的信息之前,以连续发出的最多数据帧数
接受窗口(Wr):可以连续接收的最多数据帧数(只有序号在窗口内的帧才可以接收,否则丢弃)

滑动窗口机制实例

 


参考:

ppp协议:

https://blog.csdn.net/lnboxue/article/details/79486069

https://blog.csdn.net/cainv89/article/details/50612718

https://blog.csdn.net/windeal3203/article/details/51066331

https://blog.csdn.net/csucxcc/article/details/1684416

================================================

以太网帧格式

https://blog.csdn.net/a1414345/article/details/72781130

http://blog.sina.com.cn/s/blog_87bbe37e01013zim.html

https://blog.csdn.net/jeffleo/article/details/53932693

 

https://zhuanlan.zhihu.com/p/21318925

https://www.jianshu.com/p/ffb4423be724

 

http://blog.sina.com.cn/s/blog_5f38b78d0100c62d.html   专题