作者: 张小云的博客
出处:https://www.cnblogs.com/zhangweicheng/p/13388701.html
我们网上冲浪也冲了这么多年,也该上岸好好看看这些浪的形状了。
1. 从一个网址了解浪来浪去#
我们知道计算机之间的通过其实都是通过IP+端口的形式,但是我们平时访问的时候根本就没涉及到这两个东西,还是能访问到资源,为啥呢?这得问问我们神奇的DNS。
- 首先,举个例子,我们输入www.bilibili.com,这个时候需要通过DNS将其转化为IP地址才能继续访问,其流程大概是这样的:
从当前的浏览器中查询是否存在当前域名,如果有则返回其对应的IP地址,否则的话向本机操作系统中查询。操作系统如果有,则返回,浏览器将其缓存起来之后返回;如果操作系统查询不到的话,那么则向路由器缓存上查询。同上,有返回并且缓存到操作系统,操作系统返回并缓存到浏览器;无则向本地服务器请求。本地服务器就是运营商,比如说电信或者移动。操作过程同上,还没有的话就要向根服务器请求了。根服务器就是终点站了,操作跟上面一样,如果还没有的话,服务器就要请你检查你的域名了。
okay,上面绕了一圈之后我们现在拿到了B站的IP:假设为139.159.246.60,接下来就可以访问了。
是不是还少点了什么?哦,是了,少了端口,那端口咋办呢?不用办,每个协议都有默认的端口,如果你不输入端口号的话就会使用默认的,例如http协议默认80,而https默认443,所以实际上输入www.bilibili.com实际上请求的是139.159.246.60:80,也就是机器IP地址为139.159.246.60上的80端口的程序,所以B站服务器的服务要占用监听80端口,当然那边肯定还做了负载均衡,这就不扯了。
- 现在知道具体地址地址还需要做什么呢,还需要建立连接,要保证等下进行数据传输的时候是okay的,所以这边会跟服务器建立TCP连接,完成之后进入下一步。
- 连接okay了,浏览器这边就组装好请求头准备发送请求,请求头包含了一些重要的信息如请求的方式、代理、请求格式,接收格式等,组装完成后发送。
- 服务器收到请求解析之后包装所需信息返回。
- 客户端(一般是浏览器或者App)这边接收到之后进行渲染,然后就是我们平时看到的图形界面了。
- 最后根据是否保持连接来决定是否关闭。
这样一次对B站的访问就完成了。但是这都是表面,我们甚至都不知道浪里的是水还是盐,计算机究竟是如何通过网络来通信的,接下来让我们走进《网络》。
Top
2. 网络协议#
上面说到一个请求的完整路径,但那只是站在应用层的角度来看的,而在网络中应用层只是属于某个模型的一部分。
平时所说的网络模型有三种:OSI七层、TCP/IP五层、TCP/IP四层。这三种模型都是概念模型,注意是概念模型,也就是说实现的方式并不是固定的,三兄弟来亮个相吧。
这几层背起来还不用一分钟,但那没用,就跟名字一样,需要的是灵魂,而不是枯燥的文字,所以需要理解。
七层模型#
七层懂了,四、五层还难吗。
我们知道数据在计算机底层最终都会变成0和1,那么可能有人问了,现在计算机那么牛逼,底层给整个2或者3出来总可以吧,老是纠结0和1干嘛?说实话,实在是办不到。
计算机通过电缆的电信号来实现通信,而电信号只有高低两种,所以也就分别对应计算机数字的1和0,这也是物理层的作用,将数字转化为电信号发给其他计算机。
物理层:将接收到的数据从1和0转化成高低信号发送给其他计算机。
但发是发出来了,其他计算机怎么知道你阿巴阿巴在说什么呢,不懂也没意义啊。所以需要定义一些规则,例如发送32位,前8位是文件信息,后24位才是数据,这样就知道了,这种规则就叫做协议。但是协议人人都可以定,一千个哈姆雷特就有一千种协议,这么多个哈姆雷特有点渗人,所以需要一个标准来进行统一,这才出现了以太网协议。
以太网协议的内容大致为:
每组信号构成一个数据包,即"帧"。每个数据包都包含两个部分。head:固定18个字节,包含发送者、接收者和数据类型。数据体data:真正的数据。
有了统一的标准,现在知道发送的是什么了,但是怎么知道要发给谁呢?那就是通过mac地址,每台计算机都有着世界上独一无二的mac地址,通过这个地址能够标识唯一的一台计算机,将这当做地址再适合不过了。okay,现在发送内容有了,发给谁也知道了,那咋发呢?能不能通过一条准确的通道能够直达接收者呢?
计算机之间的通信方式是通过原始的广播来实现的。
什么意思呢?意思就是说,我要发送一条消息,这条消息的头部包含了是谁发的,发给谁的,那么我将这条消息发给同一个局域网下的所有计算机,他们收到了就看下是不是发给自己的,如果是则进行响应,否则就不管。
可能有人会质疑,"老哥,照你这么说,那全世界的计算机要通信的话不就得都在一个局域网内,这样的话,不就可以联机打CS了?" 我没说过这句话,周树人也没说过。确实,如果只按照上面的方式,全世界的计算机需要进行通信的话必须要求在同一个局域网内,但这是不可能的,即便可能也是一种灾难。所以需要更好的方法,这时候网络层的IP协议就登场了,IP协议的主要作用有两个:
给每台计算机分配IP地址和路由。判断两台计算机是否在同一局域网内:计算的方式大致为两个IP地址跟子网掩码做于(&)运算,如果结果相同就在同一子网内,否则则不在。(子网掩码有兴趣可以自己搜一下)
嗯?你说的这个IP,它跟通信所需要的mac有关系吗?计算机之间是通过mac地址识别的,现在只有IP地址是对不上号的,所以我们需要一个转换器,这个转换器叫做ARP协议(OSI七层中属于链路层),ARP协议的作用就是将IP地址转化为mac地址。有了这个协议,加上之前的那些,全世界的计算机都可以进行通信啦。鼓掌!鼓掌!鼓掌!
但是!不好意思,我还是得说但是,这样的话计算机之间貌似只能一对一,我们平时一台计算机肯定不止只运行一个程序,像下面这样都得有几个了。
肯定还有东西将其拆得更细,从而给程序定位,这时候传输层的端口协议TCP和UDP就上线了,TCP和UDP提供了端口的概念,这样我们通过ip转mac确定一台计算机,再通过端口确定具体的一个程序,从而实现端对端的通信,一台计算机运行多个程序,程序可以跟另一台计算机的程序进行通信,瞬间形成N×N。到了这一层网络协议的基本就结束了,往上还有三层可以理解为辅助和加强作用。
会话层:管理TCP连接、流量控制等。
表示层:格式、字符、加密等翻译工作和转化。
应用层:展示给用户的东西,例如HTTP协议就是一个页面,FTP用于传输等。
Top
3. 小结#
本文的叙述方式比较口语化,但如果能简单理解那就足够了。首先一开始讲输入一个网址发生的事情,接而引出下方的网络协议,在网络协议中从底层物理层的电信号到最上层应用层的http协议,大致的讲述模式为:当前的问题—>为了解决当前的问题需要怎么做 的这种模式,相信理解起来并不困难。