简介

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

本文次要波及5个模块,别离是网络七层协定,提早与带宽,IP,TCP,UDP。

OSI网络七层协定

在讲网络之前,肯定要提到OSI网络七层协定。

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

上图是大家十分十分相熟的OSI七层网络模型,和对应的TCP/IP模型。

应用层的性能是文件传输,电子邮件和文件服务等。应用的协定次要是HTTP,SMTP和FTP。

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

会话层的性能是解除或者建设与其余节点的分割。

传输层的性能是提供端对端的接口,应用的协定次要是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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!