带你探索网络里的那些秘密
背景
网络,网络...
虽然只是一个简单的名词,但是她的背后却掩藏着太多太多的故事以及知识。
穷其编程的一生,或许也只能探索出那冰山一角,嗨...
小时虽知,学海无涯,却毫不知意。玩乃天性,却空流时光。憾...
so,矫情之余,我们来探索一下网络究竟是怎么传输的。
概述
探索网络的范围,都在上图有所展示(另存为看大图)。
正文
一. 生成HTTP请求消息
打开一个网站,都是从浏览器中输入网址开始,我们的探索也是从这里开始。
https: 是协议,告诉浏览器我们要访问的目标,而https: 代表的就是访问Web服务器,当然也有其他的协议。比如ftp:访问的就是FTP服务器等。
sexyphoenix.github.io 是Web服务器域名,可以告诉我们在哪里可以找到Web服务器。
about/ 是Web服务器里面的文件路径名,这里的about是目录名,全路径可能是about/index.md,而index.md应该被github掩藏了。
浏览器首先要做的就是对URL进行解析,知道我们要访问的是sexyphoenix.github.io这个Web服务器上文件路径为about目录下的默认文件。
知道了要访问的目标,接下来浏览器就要生成HTTP的请求信息,介绍到这,就要聊一聊HTTP协议了。
HTTP协议规定了客户端和服务器通信的内容和步骤,简单来说,就是两个部分“对什么”做“怎样的操作”。
“对什么”上面已经解析过了,“怎样的操作”就是HTTP主要的方法:POST、GET、DELETE、PUT等。HTTP格式看下图。
二、查询Web服务器的IP地址
生成HTTP信息之后,接下来,我们就要发送信息给Web服务器了。但此时我们突然发现我们只有Web服务器的域名,并不知道服务器究竟在哪里。
那么我们应该如何像现实中送快递一样,快速的定位到哪一幢哪一室,讲到这里,想必大家都有所意会了,IP。
IP地址
IP地址实际就是4个字节,32比特的数字,每8个比特为1组,具体看下图十进制表示。
我们发送的信息,就是通过子网的集成器找到最近的路由器,再通过路由器(基于IP设计)找到最优抵达Web服务器的路由器,这样不断的查找网络中的路由器节点,最终抵达Web服务器。
注意,我们的Web服务器的IP是最终的目的地,它是贯穿路由器---N---路由器---Web服务器整个环节的,是判断整个网络走向的依据,存在控制信息中。
路由器都有自己的IP,路由器到路由器就是根据Web服务器的IP(走向),通过本身的IP来移动。
到这里,我们也就了解清楚了通过IP,发送的信息最终可以抵达Web服务器。
那么,我们现在的问题就是如何通过Web服务器的域名找到它的IP? 讲到这里,想必大家又都有所意会了,DNS。
域名解析
简单的来说,DNS服务器维持了一系列关系表,也就是域名和IP对于的关系表。浏览器向最近的DNS服务器询问“sexyphoenix.github.io”的IP地址是多少,DNS服务器会回答Web服务器IP为xxx。这一步也叫域名解析
讲到这里,我们就要深究一下,浏览器究竟是怎样向DNS服务器发送查询的?
首先,我们要清楚一点,浏览器等应用程序本身是不能发送信息的,而是委托给操作系统来发送的。
而操作系统有一个超级出名的库,Socket库,它是调用网络功能的程序组件集合。
Socket库里面有一个函数。
IP信息 = gethostbyname("sexyphoenix.github.io") # 看,应用程序查询IP很简单,调用一个函数即可
发送数据有两种协议,UDP和TCP,域名查询用的是UDP。数据短速度快。
介绍了域名解析,下面来了解一下DNS服务器的工作。
DNS服务器
在上面已经提到过了,DNS服务器维护了一个关系表,上图的类型A表示域名对应IP地址,MX表示域名对应的邮箱服务器,不同的类型,返回的信息有所不同。
DNS服务器的工作就是根据域名和类型,查找相关的记录,并向应用程序返回响应信息。
DNS服务器查找
全球共有13台根域名服务器,根域名用“.”表示,其次才是下面的一级域名“com.”、“net.”等,我们平时访问的域名“sexyphoenix.github.io.”后面有一个点,平时被省略。
我们用一张图来看下查找顺序,更清楚些。
先找最近的DNS服务器(一般是本机设置的),没有再从根域找,然后不断的向下找,直到找到我们Web服务器IP所在的DNS服务器。
三、TCP/IP传输数据
通过DN