简介
程序员天天都在写代码,关注的都是更高层次的封装,明天咱们换个思路,让程序那些事来带你看一看暗藏在表象之下的网络和他们的性能剖析。
本文次要波及 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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!