概述
这是对计算机体系结构的一次 overview。
计算机网络课程大学时有系统地学过,但没有太上心,工作发现用的挺多的,比如定位一些网络异常的问题,做网络层面的优化,都需要对计算机网络体系的一些常见协议有所了解。
但是计算机网络体系庞大复杂,各层有自己的职责,是做不到窥一斑而知全豹的,要对整体结构有一个完整的印象和了解。为此,所以重新翻了翻书,对整个计算机网络体系结构温习了一下,温故知新。这里根据自己的理解,对整个体系结构做个简单的介绍。
要看更全面的,更详细的,还是需要去翻翻书,比如谢希仁的《计算机网络》,《TCP/IP 协议详解》,《HTTP 权威指南》等计算机网络圣经。
我们来做一个快速的解读。先上个图:
教科书一般都会把七层体系结构摆上,但划分的层次过多,这里只拿两种模型。
- 一种是理想模型,分为五层体系。
- 另一种是实际应用的 TCP/IP 体系,为四层。
乘客:应用层
应用层协议的内容,就是我们程序直接面对的,要使用的数据,也是整个网络传输要传递的内容。
如何去理解这些内容和数据呢?协议其实就是一种规范,有各种各样的数据结构需要通信双方遵守,然后双方都有相同的计算机程序来进行编码和解码。我们把这些应用层协议的内容比作整个体系结构的乘客,他们心中只有目的地,买了票上了车,中间的路怎么走,用什么交通工具走就交给底层的协议了。应用层协议,只需要达到目的地的时候,能够把自己介绍清楚即可。
有这么些乘客是常见的:
DNS 协议,Domain Name System,用来把域名转化为 IP。有时会发出这样的疑问,为什么有这么一个协议存在?我知道目标主机的 IP,直接填不就好了?这个当然没问题,但是全世界这么多网址,IP 数量庞大,要真的使用数字记忆的话,那是很困难的。如果又发生了更换了服务器,那 IP 也要跟着换,客户端没有即使更换又会造成大量问题。还有有的时候用 CDN 加速,如果直接填 IP,就直接绕开了 CDN 去源服务器取数据了。所以,DNS 这个协议帮我们完成了这个记忆,有了个域名,想知道对应的 IP,DNS 从本地查。如果本地没有记录,又会去本地的域名服务器查...直到根域名服务器,是一个分布式的过程。如果服务器迁移,IP 地址修改,域名服务商是会帮忙刷新 DNS 服务器的缓存的,一般 2 小时可以完全覆盖。
HTTP 协议,我们平时接触得最多。而且协议的版本也在不断的升级,从原始的 http 1.0,到 http 1.1,再到未来的基于 spdy 完成的 http 2.0。这些版本的升级,最大的改变还是传输的效率的提升。在格式各样的计算机网络中,有一个圣地那就是万维网 WWW。在这个网络中行走的乘客就是 HTTP 协议,带着文本,图像、视频等数据,往来于不同的站点。所以也可以把它们看成携带着大量货物的商队,来往于各个城市站点。
指挥调度:运输层
运输层是体系结构的调度者,管理着数据的传输的一些策略。
什么时候可以传?要传多少?要不要接收?什么时候结束?
运输层有两个调度者,两种不同的风格,分别为 TCP 和 UDP。
TCP 很严格,一个包都不能有失,完美主义的处女座,因为纪律严明且要求严格的 TCP 工作效率并不高,每次发完一阵子都要确认一下是否顺序正确,不正确的话再发个包。UDP 就比较不拘小节,丢包了乱序了都不管,所以在网络环境好的情况下,UDP 可以做到快速而且正确率高。他们俩就像美女与野兽中的胖瘦管家。双方都有自己的优缺点,至于什么情况下发光发热,扬长避短,得看具体的业务场景。比如 DNS 乘客选择不拘小节的 UDP 作为调度者,中途数据出差错就再解析一次。而 HTTP 乘客,因为可靠性要求高,数据不容有失,选择了 TCP。
TCP 调度者的工作内容主要三大块,分别为可靠传输、流量控制和拥塞避免。简单理解,可靠传输就是希望传输过程中有丢包或者错误包的现象,让发送端重传;流量控制就是建了个缓冲池,让接收方和发送方用合适的速率传输,不会因为传输太快导致数据丢失。比如我们有一个仓库大小就那么大,东西都还没用完,又不停地往里面存东西,那么直接结果是仓库爆了后后面送过来的货物还要重新送,还不如直接告诉发送端,仓库满了,等等吧。这就是后面会提到的 TCP 首部的窗口大小;拥塞避免就是在网络环境差的情况下,有好的机制减低发包节奏,缓解网络环境。比如在某个城市开车,出行的人突然增加,那么等个时间再出来。
UDP 调度者因为不需要严格的建立连接,又不需要各种确认机制保证包不乱,所以整个协议非常轻量。如果想要保证数据的完整且接收的顺序无误,那么得应用层协议自己来。
向导:网络层
网络层的是体系结构的向导,负责找到要到达接收方的路径。
经过了传输层,包大小确定了,传输时间也决定了。然后,手里只有 IP 和 端口号,就像现在厦门,并且知道了目标地点是北京,可是该怎么走呢?需不需要中转?中转的地方又在哪里?
这时候要看 IP 协议族了。这个大家族都吃这碗饭,提供指路服务。
运输层的包,比如 TCP 或者 UDP,向导会填入目的信息。所以,在这个过程中它做的就是找到下一站,然后到达之后再寻找下一站直到终点。
网络层向导有会去问路,如何能够找到最短路径,或者能最快到达的路径呢?比如从中国到美国,是从太平洋走,还是先去欧洲再走大西洋呢?那条路能够更快到达目的地。于是问路就有了两种不同的策略,有用 RIP 协议去问路,又或者是 OSPF 协议去问路。
但是到达数据到达数据链路层的包只认物理地址怎么办?所以这里还有个 ARP 协议,用来找到 IP 对应地址的硬件地址,方式还是用广播。像我们平时使用 Wireshark 抓包看到的,经常会有一些向导往整个局域网里问,“who has xxxxx? Tell xxxxx”。目标会给向导答复,到时候把硬件地址记录下来即可。
交通工具:数据链路层
数据链路层里的协议就是要使用的交通工具了。
不同网络的差异性主要就体现在这一层。对于数据,并不需要我们路上经过了什么,怎么走。但交通工具要明白。不同的网络,交通情况是不一样,所以有不同的策略来走。
比如去往 ISP 使用 PPP 协议。
在普通局域网内部使用 CSMA/CD 协议。
数据链路层的协议,无论选择什么样的行走策略,无论是在天上飞的,地上跑的,海里游的,都会面临三个基本问题:封装成帧、透明传输和差错检测。解决了这三个问题,那么这个交通工具就可以上路了。
道路:物理层
什么时候出发,去什么地方,用什么方式走都已经确定好了,转化为二进制信号后,由物理层真实地发送到目标地址去。那这条路物理层传输的带宽怎样,就像我们的道路是四车道还是六车道,是大道还是羊肠小路。传输的速率怎样,就像这条路的路况如何,是坑坑洼洼的还是一马平川。
物理层的特性决定的路况。不同地方的贫富差距不一样,或者环境的限制,修的路也不一样。有的用双绞线,有的用同轴电缆,再不错的就用光纤了。所以,在相同的时间里,在不同的物理层设备环境中,可能你还在厦门岛内堵车,我已经搭动车飞驰 200 公里到另一座城市。
小结
当我们要发送一个数据,经过这五层协议,为了完成每一层协议的功能,比如可靠传输、确定路由等,这些协议都会添加一些必要的首部来完成功能。这里我们使用 TCP 协议作为传输层协议,所以到达物理层前要发送出去的包在每层协议添加首部后会有这样的结构: