计算机揭秘之:网络分类和性能分析

简介

程序员每天都在写代码,关注的都是更高层次的封装,今天咱们换个思路,让程序那些事来带你看一看隐藏在表象之下的网络和他们的性能分析。程序员

本文主要涉及5个模块,分别是网络七层协议,延迟与带宽,IP,TCP,UDP。缓存

OSI网络七层协议

在讲网络以前,必定要提到OSI网络七层协议。服务器

OSI是Open System Interconnect的缩写,意为开放式系统互联。网络

上图是你们很是很是熟悉的OSI七层网络模型,和对应的TCP/IP模型。并发

应用层的功能是文件传输,电子邮件和文件服务等。使用的协议主要是HTTP,SMTP和FTP。ide

表示层的功能是数据格式化,代码转换和数据加密。性能

会话层的功能是解除或者创建与其余节点的联系。学习

传输层的功能是提供端对端的接口,使用的协议主要是TCP和UDP。大数据

网络层的功能是为数据包选择路由,使用的协议是IP。网站

数据链路层的功能是传输有地址的帧,和检查数据错误。

物理层的功能是以二进制数据在物理媒介上传输数据。

延迟与带宽

最近电信业务员总是给我打电话,说是要把家里的电信宽带从100M升级到500M,天天只须要一块钱。一块钱虽然少,但也是血汗钱。那么办仍是不办呢?升级到500M对性能和延时提高有多大帮助呢?

2020年能够称为中国5G的元年。先无论华为,中信在5G基站和协议制定方面的能力。直观的感受5G手机开始多了,手机营业厅也在卖力的让你升级到5G套餐,那么办仍是不办?

在回答这两个问题以前,咱们学习两个名词:

延迟: 分组从信息源发送到目的地所需的时间。

带宽: 逻辑或物理通讯路径最大的吞吐量。

若是你访问一个网站,好比www.flydean.com,咱们看一下数据是怎么从服务器到达你的电脑的。

首先数据从服务器经过以太网(以太网是一种计算机局域网技术)传输到ISP。

ISP是啥呢?ISP就是互联网服务提供商(Internet Service Provider),经过ISP你才可以把服务器接入互联网。

互联网就是经过主干网的互联网服务提供商(ISP)之间的相互链接构成的。

因此ISP就是一个......大代理。

好了,数据传到为我家提供服务的ISP了,而后经过光纤或者电缆线传到了我家的WiFi,而后经过WiFi的无线信号,被个人电脑接收。

延时的构成

讨论分析了数据的传输线路,接下来咱们看一下,延时会跟哪些缘由有关呢?

首先确定是信号传输的距离,距离越长,传输速率越慢,须要的时间就越长。

接下来就是消息的长度,咱们把消息中的全部比特转移到链路中须要时间,消息长度越长,须要的时间越多。

数据上了链路以后,处理分组首部、检查位错误及肯定分组目标也须要时间。

最后,咱们对于分组数据进行排队处理也须要时间。

如今主网络的传输介质基本上都是光纤了,光在光纤中传播,并非直线进行的,而且也有折射率的影响,因此速度比光在真空中传播要慢一点。

好比说信号围绕赤道转一圈,只须要大概200ms。已经很快了。

200ms确实很快了,可是对于某些实时性要求特别高的应用场景,咱们可使用CDN技术(Content Delivery Network,内容分发网络),把内容部署在全球网络中,而后从最近的地方去取数据。从而大大减小传输延时。

200ms够快了,可是为何咱们仍然会感受到网速慢呢?

你们都听过木桶原理吧,木桶可以装的水,决定于最短的那块木板。一样的对于网络延时来讲,提高速度不在于你在主干网上采用了多么先进的技术,由于提高的再多或者再差也是毫米级的。

真正决定网速的在于最后一千米,也就是你电缆线的传输速率,你的wifi的传输速率,还有你电脑的处理速率等。

 能接入更高带宽当然好,特别是传输大块数据时更是如此,好比在线听音乐、看视频,或者下载大文件。但是,平常上网浏览须要的是从数十台主机获取较小的资源,这时候往返时间就成了瓶颈。

IP协议

IP,即 Internet Protocol(因特网协议),负责联网主机之间的路由选择和寻址。

各类物理网络在链路层所传输的基本单元为帧(MAC帧),其帧格式随物理网络而异,各物理网络的物理地址(MAC地址)也随物理网络而异。Ip协议的做用就是向传输层(TCP层)提供统一的IP包,即将各类不一样类型的MAC帧转换为统一的IP包,并将MAC帧的物理地址变换为全网统一的逻辑地址(IP地址)。

IP数据包

数据包(data packet)是什么?

数据包也是分组交换的一种形式,就是把所传送的数据分段打成包,再传送出去.

每一个数据包都有报头和报文这两个部分,报头中有目的地址等必要内容,使每一个数据包不通过一样的路径都能准确地到达目的地。在目的地从新组合还原成原来发送的数据.

咱们看下IP数据包的构成。

注意上面的Total Length部分占用了2个字节,因此IP数据包的最大长度就是2^16-1=65535字节。

分片和重组

链路层具备最大传输单元MTU这个特性,它限制了数据帧的最大长度,不一样的网络类型都有一个上限值.若是IP层有数据包要传,并且数据包的长度超过了MTU,那么IP层就要对数据包进行分片操做,使每一片的长度都小于或等于MTU。

分片后的IP数据包,只有到达目的地才能从新组装。从新组装由目的地的IP层来完成,其目的是使分片和从新组装过程对传输层(TCP和UDP)是透明的。

MSS与MTU

MSS最大传输大小的缩写,是TCP协议里面的一个概念。

MSS就是TCP数据包每次可以传输的最大数据分段。为了达到最佳的传输效能TCP协议在创建链接的时候一般要协商双方的MSS值,这个值TCP协议在实现的时候每每用MTU值代替(须要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes), 通信双方会根据双方提供的MSS值得最小值肯定为此次链接的最大MSS值。

而通常以太网MTU都为1500, 因此在以太网中, 每每TCP MSS为1460。

TCP

 TCP,即 Transmission Control Protocol(传输控制协议),负责在不可靠的传输信道之上提供可靠的抽象层,  向应用层隐藏了大多数网络通讯的复杂细节,好比丢包重发、按序发送、拥塞控制及避免、数据完整,等等。

TCP三次握手

通常来讲,使用TCP协议,若是client和server要达成一致创建链接的话,须要三次交互。

  • SYN

客户端选择一个随机序列号x,并发送一个SYN 分组,其中可能还包括其余TCP标志和选项。

  • SYN ACK

服务器给x 加1,并选择本身的一个随机序列号y,追加本身的标志和选项,而后返回响应。

  • ACK

客户端给x 和y 加1 并发送握手期间的最后一个ACK 分组。

拥塞崩溃

若是几个IP分组同时到达路由器,并指望经同一个输出端口转发.

显然,不是全部分组能够同时接受处理,必须有一个服务顺序,中间节点上的缓存为等候服务的分组提供必定保护。

然而,若是此情况具备必定的持续性,当缓存空间被耗尽时,路由器只有丢弃分组。

在这种持续过载的状态下,网络性能会急剧降低.

流量控制

流量控制是一种预防发送端过多向接收端发送数据的机制。不然,接收端可能由于忙碌、负载重或缓冲区既定而没法处理。

为实现流量控制,TCP链接的每一方都要通告本身的接收窗口receive window(rwnd),其中包含可以保存数据的缓冲区空间大小信息。

最初的TCP规范分配给通告窗口大小的字段是16位的,这至关于设定了发送端和接收端窗口的最大值(65535字节)。结果,在这个限制内常常没法得到最优性能。

为解决这个问题,RFC1323提供了TCP窗口缩放(TCP Window Scaling)选项,能够把接收窗口大小由65535字节提升到1G字节。

那么如今问题来了,rwnd只是一个接收端的初始窗口大小,若是有多个sender都在向receiver发送数据包的话,怎么才能保证receiver端的接收性能呢?

为了解决这个问题,TCP引入了慢启动的概念。

当sender和receiver已经创建好了TCP三次握手以后。就能够开始发送数据包了。

这里引入了一个拥堵窗口Congestion window(cwnd)的概念。

cwnd是server端目前能够接受的最大的窗口大小。

创建链接以后第一次发送的cwnd是一个初始值,这个初始值最开始是1个network segment,在1999年 RFC 2581将其更新为4个network segments。在2013年, RFC 6928 将这个值扩大到了10个network segments。

咱们以10个network segments为例,看下cwnd的膨胀过程:

通常来讲cwnd是倍数增长的,收到ack以后,cwnd会从10,20,40这样往上增长。一直到server端拒绝ack为止。

那么回到咱们以前讲到的一个结论,带宽其实不是那么重要。

为何呢?考虑在HTTP1.1中,client须要等待server的返回才可以进行下一次请求。若是你的请求的文件比较小,那么cwnd尚未涨到足够大的时候,请求就已经结束了。这个时候最主要的时间花费是请求的来回时间,而不在于带宽大小。

固然,若是在HTTP2中,由于创建的是长链接,慢启动可能就不存在了(不肯定,你们有不一样的意见能够提出)。

UDP

UDP( User Datagram Protocol,用户数据报协议。

UDP 的主要功能和亮点并不在于它引入了什么特性,而在于它忽略的那些特性:不保证消息交付,不保证交付顺序,不跟踪链接状态,不须要拥塞控制。

咱们先来看一下UDP的数据包:

NAT

你们都知道IPV4地址是有限的,很快IPV4地址就快用完了,那怎么解决这个问题呢?

固然,一个永久解决的办法是IPV6,不过IPV6推出这么多年了,好像尚未真正的普及。

不使用IPV6的话还有什么解决办法呢?

这个办法就是NAT(Network Address Translators)。

NAT的原理是将局域网的IP和端口和NAT设备的IP和端口作个映射。

NAT内部维护着一张转换表。这样就能够经过一个NAT的IP地址和不一样的端口来链接众多的局域网服务器。

那么NAT有什么问题呢?

NAT的问题在于,内部客户端不知道本身外网IP地址,只知道内网IP地址。

若是是在UDP协议中,由于UDP是无状态的,因此须要NAT来重写每一个UDP分组中的源端口、地址,以及IP分组中的源IP地址。

若是客户端是在应用程序内部将本身的IP地址告诉服务器,并想跟服务器创建链接,那么确定是创建不了的。由于找不到客户端的公网IP。

即便找到了公网IP,任何到达NAT设备外网IP的分组还必须有一个目标端口,并且NAT转换表中也要有一个条目能够将其转换为内部主机的IP地址和端口号。不然就可能出现下图的链接失败的问题。

怎么解决呢?

第一种方式是使用STUN服务器。

STUN服务器是IP地址已知的服务器,客户端要通讯以前,先去STUN服务器上面查询一下本身的外网IP和端口,而后再使用这个外网IP和端口进行通讯。

但有时UDP包会被防火墙或者其余的应用程序所阻挡。这个时候就可使用中继器技术Traversal Using Relays around NAT (TURN) 。

双方都将数据发送到中继器server,由中继器server来负责转发数据。注意,这里已经不是P2P了。

最后,咱们有一个集大成者的协议叫作ICE(Interactive Connectivity Establishment ):

它实际上就是直连,STUN和TURN的综合体,能直连的时候就直连,不能直连就用STUN,不能用STUN就用TURN。

总结

本文介绍了IP,TCP和UDP等协议和须要注意的一些事项,但愿你们可以喜欢。

本文连接: http://www.flydean.com/network-and-performance/

最通俗的解读,最深入的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注个人公众号:「程序那些事」,懂技术,更懂你!

相关文章
相关标签/搜索