网络那些事儿(1)
1,前言
今天我们开始讲一讲网络方面的知识,网络这方面的内容比较多,各种协议和硬件设备让人眼花缭乱,什么TCP/IP协议、ICMP协议、HTTP(HTTPS)协议、FTP(FTPS)协议等等,还有路由器、交换机、集线器等等,都让人觉得无从下手。想要完全掌握网络方面的知识几乎是不可能的,但是对于开发人员来说掌握必要的网络知识是很有必要的,对于非技术人员了解一下与自己息息相关的网络背后的原理对自也会有很多好处,毕竟这是个互联网世界。
我大学时候的课程中开设有计算机网络这门课程,当时对计算机和网络都还没有一个相对清晰的认识,包括对编程的认识也只是简单地写一些C语言代码,周围同学也没有在编程方面比较厉害或者对编程比较感兴趣的人(这里说一下我本科学的是信息工程专业,学校是一个很一般的二本院校,通信技术和计算机基础课程都有学习),当时也就随便听听这个课,保证最后不挂科就觉得ok了。现在知道了还是要打好基础,不然后面真的很难受,后续这些年因为学习和工作需要补充了一些网络方面的知识,但是我现在也还是觉得自己对网络的认识还差很多,所以这是一个跟大家共同学习和交流的文章,我说的不一定是没有错误的,请大家明白这一点,同时也给自己一些压力,再次重新学习一下网络的知识。
2,URL解析
下面我们还是继续讨论网络方面的事情吧,网络确实是一个比较复杂的东西,而网络之所以这么复杂还能够被广泛传播和应用,恰恰体现了它的重要性,现在我们几乎所有人都和网络有着不可分离的关系,我们的智能手机能够连接网络,我们的平板设备也能连接网络,即使是我们之前的2G手机,只要它有通话功能,都是需要连接网络的。
网络这么重要而且复杂,我们要怎么找到一个切入点进行学习呢,这里我要推荐一本非常好的书,书名叫「网络是怎么连接的」,是一个叫户根勤的一个日本人写的,我后续要讲的网络方面的内容很大程度上参考了这本书。这本书应该算是一个网络方面的科普类书籍吧,里面没有很详细得介绍网络的具体知识,比如TCP/IP的详细原理、路由表的具体维护原理,更深入的原理的理解,可以参考「TCP/IP详解」这套丛书,有三卷,相当详细,而且很厚,可以作为参考书。
我们先不管网络的发展,直接从浏览器输入一个网址开始,看看网络是怎么做出的一系列操作,然后给我们想要的反馈结果。
这里有一个图很好地展示了网络中常用的协议和设备类型。
基本上我们每天从浏览器访问的网站的后台过程都能够用这个图进行概括。从本地web浏览器开始,我们将网站的地址输入浏览器,当然这里输入的是域名(URL格式的字符串如https://zhidao.baidu.com/question/204659012.html,ftp://test/file,file等),而不是该网站的公网IP,因为IP实在太难记录且容易混淆,域名则更符合人类记忆和理解习惯,而且在网络传输效率方面,IP相对于域名也有很大的优势,一般IP长度为32比特,也就是4字节,但是域名一般都有几十个字节,最长可以达到255字节,二者数据传输量相差几倍甚至几十倍,在网络传输中如果使用域名会导致路由器负担增加,影响网络传输效率,所以我们一般是直接输入域名进行网络访问。
浏览器先解析这个URL,根据具体的协议类型对不同类型的URL进行相应的解析,浏览器内使用最多的是http协议,这里就以http协议作为研究对象。URL先解析出web服务器名和数据(文件)的路径名,(有时候会有省略文件名的情况,这种情况下就需要根据URL结尾它是不是带有‘/’来判断这个数据(文件)是路径名还是文件名,如果是路径名,则访问该路径下默认的网页,一般叫index.html;如果是文件名,则直接访问该文件资源)。
3,生成HTTP请求
解析完URL中的网络地址后,接下来就需要根据解析出来的信息来对WEB服务端发起网络请求,这里网络请求的发起就牵扯到HTTP消息请求和响应。HTTP主要方法有GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、CONNECT。除了这些方法还有其他的一些方法,但是很少遇到,其中在上面这些方法中最常用的是GET和POST。在上一步中,我们解析到了WEB服务器地址,此时我们就可以通过GET或者POST方法向WEB服务器发送请求消息,WEB服务器接收到请求消息后根据请求消息内的要求完成一些指定的工作,然后返回给我们一个响应消息,响应消息中包含有一个状态码,用来表示WEB服务端相应的操作结果是成功还是发生了错误。比如当我们访问一个找不到的文件时,服务端会给我们返回一个404 Not Found的错误信息,其实这就是状态码。状态码后面就是头字段和网页数据信息,客户端收到响应消息后,浏览器从中读取出所需信息并显示在屏幕上,HTTP的工作就完成了。在这里面,GET和POST方法都是发送请求的方法,但是二者最明显的差别是GET是明文的方式发送请求,数据是跟随在URL中,以用户可见的方式来请求数据的,而POST是需要在表单中加入数据,连同URL一同发送给服务端,表单是用户不可见的信息,然后服务端进行响应,这里的数据可能是用户名/密码等验证信息,所以接受POST方式请求的服务端在安全性方面比GET方式要好很多。其实GET和POST的区别不止于此,具体信息可以参考这个链接
接下来就要生成HTTP请求消息了,请求消息有具体的格式,每一行的每个字段都有特定的含义,大致是这样的:
4,接收HTTP响应
客户端向服务端发送HTTP请求后,服务端接收到请求消息,然后做出响应,将响应消息发回客户端,客户端接收到的特定格式的内容,这样方便解析,响应消息内容大致是这样的:
响应消息中包含有HTTP状态码,分别有不同的含义,大致是这样的:
返回响应消息后,浏览器就会将其中的数据提取出来显示在屏幕上,如果网页中只有文字,那到此就处理完毕了。但是实际情况下是大多数网页是不仅仅只有文字信息的,还会有图片信息,如果相应消息中还包含有图片等资源,浏览器会再次访问服务器,按照指定的文件名向服务器请求并显示在指定浏览器标签的指定位置。这其中判断所需文件、获取这些文件并显示在屏幕这一系列工作都是浏览器的任务,WEB服务端对此毫不知情,服务端只负责接受客户端的请求,然后发送相应信息给客户端。
5,通过DNS解析域名
上面介绍客户端向WEB服务端发送请求时,省略了一个重要的过程,就是查询WEB服务端公网IP的过程。这里面用到了一个机制,叫DNS(域名服务系统),它能够将服务器名称和IP地址进行关联,客户端通过Socket库查询WEB服务器的IP地址,这个Socket库能够查询最近的DNS服务器“XXX的IP地址是什么?”。这里Socket库可以理解为让应用程序调用操作系统网络功能的接口库。DNS服务器接收到查询信息后会首先从自己保存的记录中查一下有没有该请求的适配项,如果有直接返回,如果该DNS服务器没有相关信息,则向上级DNS服务器转交该请求,以此类推,如果始终没有找到,则最终会到达根DNS服务器,根域DNS服务器根据请求中的域名信息判断域名所处的范围,然后交给下级的DNS服务器,下级服务器再根据相关信息进行查找和下发,直到找到该域名的IP。
6,发送HTTP请求
找到服务端的IP后,接下来就是向该服务端发送HTTP请求消息,现在就讲一下这些消息的发送是怎么完成的。还记得我们刚刚提到的Socket库吗,这里消息的发送就是通过Socket库实现的。任何数据和信息在网络上都是通过电信号来传递的,我们的HTTP请求消息也不例外,这里我们先不解释怎么把消息转化为电信号传递出去,我们暂时可以理解为Socket帮我们实现了这部分功能。我们现在要做的就是根据之前请求到的服务端IP跟WEB服务端建立Socket连接,然后通过Socket将我们的请求消息发送过去,就是这么简单。
收据的收发分若干阶段,概括起来大致如下4个:
创建套接字
将管道连接到服务端的套接字上
收发数据
断开管道并删除套接字
具体的操作我就不讲了,网络上有很多关于socket编程的讲解和例子,我的重点不是讲解具体的实现,而是理解网络上整体的数据传输流程,这其中牵扯到太多东西。
7,总结
这样我们就从浏览器的URL开始,首先解析域名,通过DNS域名服务器得到WEB服务端的IP地址,然后生成HTTP请求消息,WEB服务端接收到客户端请求后作出响应操作,然后给客户端返回一个HTTP响应消息,客户端接收到该响应消息后在浏览器将消息内容显示到浏览器中,这样我们就完成了一个网络的请求和响应的过程。这其中省略了很多过程,里面的数据传递非常复杂,还牵扯有各种网络协议,后面我们慢慢了解。下一次我们讲这些请求消息是怎么通过物理网卡、网线、交换机、路由器等一路直达服务端的,比较偏重硬件部分了。
领取专属 10元无门槛券
私享最新 技术干货