在21世纪互联网几乎已经融入了每个人的生活了,有了互联网使得我们的生活变得更便利的同时,有没有想过互联网倒是是什么?互联网是通过怎么样的方式把每个人连接在一起的?互联网是如何传递我们产生的数据的?当我们在浏览器打开一个网页的时候这个网页是怎么显示出来的?我写这篇文章目的就是要介绍互联网是什么,并且我自己也是一个Z时代,我出身就和互联网融入在一起了。
John Gage在1980年代提出了"THE NETWORK IS THE COMPUTER!"宣传口号,之后被Sun使用了数十年,直到 2010 年被Oracle收购。根据Sun前营销总监Ray Rothrock的解释,这个口号的意思是通过个人计算机你在网络中有了一扇窗,如果有合适软件的话你还可以使用其他人的计算机。
早期的计算机程序都没有统一的系统,而是各自厂商开发的程序,并且都是运行本机上的。直到后面美国军方把ARPANET开始慢慢民用,才发展起来了互联网。之后每个人的个人计算机就对应上面那句话:通过个人计算机你在网络中有了一扇窗。现在互联网更应该是物联网,接入网络的设备不只是是传统的计算机和手机了,更多家用电器,工业互联网电冰箱、台灯、微波炉、智能汽车等,都接入到互联网中。
WORLD WIDE WEB
上面说计算机相当于一个连接世界的窗口,我个人认为这里更多的指的是Browser即浏览器,我们可以通过浏览器去访问一些在互联网中其他计算机所提供的服务,我们一般把这种访问其他计算机提供的资源的方式叫做Web网络服务。
Web网络服务: 只是一种依赖于互联网计算机提供服务的一种方式,具体的通讯是依靠着HTTP协议进行的。当我们在浏览器输入www.google.com的时候,浏览器就会使用http协议请求到具体服务器上,这里的很多人把www认为是World Wide Web的简称当成了通讯协议,其实并非如此,而是初代网页内容编辑器和网页服务器的简称。World Wide Web只是一种通过互联网的基础之上做的一层网络计算机数据交换的方式;万维网并不等同互联网,万维网只是互联网所能提供的服务其中之一,是靠着互联网运行的一项服务。
万维网发源地是欧洲核子研究中心,上面就为万维网的发明者蒂姆·伯纳斯-李,第一代浏览器和HTML编辑器就为他开发的。在万维网还没有普及的时候,大部分个人电脑都是靠着购买软件来使用,当时个人PC市场苹果、惠普,生产软件的公司是像微软这样的公司,靠着卖软件来挣钱的。
计算机发展史就是软件行业发展史,最早计算机可能功能单一就是为了计算一些弹道和一些数学相关的,最后各大公司开始研发操作系统软件,在操作系统软件发展中,最后胜利的是微软公司,微软靠着自家的Windows系统占据个人PC市场。微软并没有把目光注重在计算机硬件上,而是更关注计算机软件,怎么充分发挥这些硬件优势。微软开发很多软件,靠着卖软件盈利,例如操作系统,在微软占据了操作系统市场之后几乎就是弄断了整个个人PC市场,除了Apple公司软件和硬件都做以外。
在当时大部分软件都是靠着本机运行,直到后面万维网的出现,通过万维网去访问其他计算机上的信息,微软就意识到浏览器的重要性,不能完全依靠着操作系统去占据个人PC市场了,未来的市场应该是在万维网上,提供这一些网络服务的公司都是虚拟的,他们服务大部分运行在自己的万维网服务器上;这也就是后面Yahoo、Google等这些,网络服务公司出现,有浏览器就可以访问这些在线上提供服务的公司。
WWW架构
现在开发者开发的网络应用服务大部分都是在编写服务端应用或者是服务端的前端应用,都会对依赖于万维网才能正常工作的,所以每个开发者都应该了解万维网是如何工作的。网络应用服务不仅仅是我们日常编写的HTTP协议的应用,现在浏览器还支持更多不同协议例如FTP、mailto、file这些。这里我主要偏重的是HTTP协议进行网络通讯架构介绍:
一般我们在浏览器输入一个网址的时候,浏览器会解析输入的网址然后生产请求数据包,但是HTTP是基于TCP协议的在发送数据之前要知道对方的网络服务器IP;这时就需要操作系统请求另外一个服务了DNS,DNS负责解析域名所绑定的IP地址,然后浏览器才能生产请求头和数据包然后交给操作系统发送出去,这就是一次完整浏览器HTTP请求过程。
HTTP协议
协议这个东西很重要的,做任何事情都需要协议才能达到默契配合,这不紧体现在生活中还体现在计算机的世界里,HTTP协议就是负责浏览器和WEB应用服务器进行数据交换的协议。HTTP是在应用层的协议所以依赖于TCP协议,最后请求数据包是通过tcp发送出去的。所以HTTP需要组织请求数据包,这里的数据包要要按照HTTP协议的规则进行的,例如下面就为一个标准的请求头数据包结构:
数据包除了第一行是一些具体请求方式和请求资源路径和协议版本之外,其他一些参数信息是键值对的存在,最后一行为具体请求消息数据实体。在浏览器上打开开发者工具,也可以抓包到每次请求的数据,如下:
当应用服务器收到了客户端请求,这时应用程序会根据HTTP协议来解析请求的数据包,这个过程就是拆解数据包,然后处理完对应的请求,响应给浏览器,从而到达一次请求和请求响应工作,下面是响应数据包内容:
同样第一行HTTP协议版本和请求状态号码,剩下就是处理请求服务器相关信息键值对格式,这里的状态码和头字段所对应的参数非常多我不会一一列举我只是介绍工作原理。状态码表示的每次请求的状态信息,这是由HTTP协议制定的标准码,然后头字段这些表示客户端一些参数配置或者服务器端参数配置信息;最后是响应数据体;更多相关HTTP资料查看:什么是 HTTP?
日常开发中我们使用的最多就是RESTful,这是一种设计提供万维网络服务的软件构建风格,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化,这里就对应着HTTP协议不同的请求方法了;例如GET、POST、PUT、DELETE等来对URI进行各种操作。但是如果这个静态文件,页面中的HTML嵌入了其他资源链接,一个请求发送到web服务器,服务器返回了页面有其他资源,浏览器会继续请求页面中嵌入的其他资源,这些URI可能是其他服务器上的,和具体提供服务的服务器没有具体的关系,web服务器也不知道具体请求来自那个浏览器发出的,只需要回传的客户端IP和端口号就可以,然后通过HTTP协议响应数据包返回。
DNS查询服务
上面讲到了当我们在浏览器地址栏里输入一串域名地址,这时浏览器就要去生成一个请求数据包,请求数据包是要通过TCP协议发送出去的,也就是说目标服务器的IP地址我们得提前知道才能生成一个数据包发送出去。这里要说明的是访问WEB服务器也可以不需要通过域名,直接通过IP地址就可以,HTTP服务器默认端口就是80端口。有了域名是为了方便我们能快速找到WEB服务器所在的IP,这个就依赖于DNS服务器查询,域名相当于IP的一个别名;就好像每个人都是手机号,但是手机号是一串数字,我们可以给手机号添加备注名来方便快速查找。
DNS服务基本工作原理就是,DNS解析器这里会在每个操作系统都有的服务,解析器依赖于遍布全球的DNS服务器,DNS服务器相当于一个分布式的数据库,DNS服务器上存储了全球的域名绑定的IP映射信息;查询DNS信息的时候对应开发者而言就是调用一个系统提供API查询,但是有一个前提就是操作系统要配置DNS服务器的IP,实际上有很多DNS服务器查询供应商,例如Google的8.8.8.8
这个地址就为Google的DNS查询服务。
在DNS服务架构是一个层次架构的也就是一个树型结构,域名一般以.
做为分割线,由于互联网上的域名和web服务器太多了,一台DNS服务器是不够管理的,所以将域名划分了等级来存储在每个DNS节点服务器,每个节点服务器管理者都是对应着域名结尾的DNS信息,如上图所示;在DNS消息中每条对应的这记录也是有类型区分的如下图:
当客户端发送域名记录查询消息的时候就要提供要查询的记录类型信息,这样DNS服务器在处理的时候就可以返回对应value
给客户端使用,更多细节可以查看这篇文章:DNS 的工作方式。
需要注意的是世界上只有13组根服务器,根域名服务器是什么?我们每次写域名的时候一遍都是些blog.ibyte.me
,其实正确的地址是blog.ibyte.me.
在域名末尾处还有一个.
,这里就是根域,这里对应着DNS根服务器,根服务器会在互联网所有的DNS域名服务器上都有保存,并且所有的电脑中都有根DNS服务器地址信息,所有只要计算机联网就能查到到根域名服务器信息,根域名服务器会有互联网所有域名的所在的DNS服务器信息,这样就能快速越级查找。另外全球的DNS服务器节点都可以临时缓存一些域名信息,这也就是TTL过期时间,买过域名的朋友都知道域名绑定IP生效需要一点时间,有了缓存DNS信息支持,在查询域名信息的时候就不需要去逐步访问每个节点了。
Socket通讯
Socket就像一个电话插座,负责连通两端的电话,进行点对点通信,让电话可以进行通信,端口就像插座上的孔,端口不能同时被其他进程占用。这是操作系统为每台计算机提供一个特殊的网络操作库,中文叫“套接字”,当两台计算机要通讯的时候就可以使用套接字进行建立连接;创建一个套接字很简单只需要创建者提供被访问的计算机网络中的IP和所在进程的网络服务端口接口,例如在Java中创建一个网络通讯连接代码如下:
import java.net.*;
import java.io.*;
/**
* This program is a socket client application that connects to a time server
* to get the current date time.
*
* @author www.codejava.net
*/
public class TimeClient {
public static void main(String[] args) {
String hostname = "time.nist.gov";
int port = 13;
try (Socket socket = new Socket(hostname, port)) {
InputStream input = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(input);
int character;
StringBuilder data = new StringBuilder();
while ((character = reader.read()) != -1) {
data.append((char) character);
}
System.out.println(data);
} catch (UnknownHostException ex) {
System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
应用程序创建套接字需要借助操作系统通过的系统呼叫接口,我们只需要提供IP和端口号,操作系统就会返回一个文件描述符,这个描述符里面就保存了刚才传入的一些连接信息;这就和去超市购买商品时,有寄存东西的寄存柜一样会吐出来一个解锁码,通过解锁码上的标号就能找到对应位置,这里就是套接字的描述符,描述符相当于一个网络通讯入口标识,如下图:
服务器端程序会主动监听某个端口,如果有连接请求会创建一个文件描述符保存起来,方便服务器主动发出数据使用;
网络协议层次结构
数据包最后还是通过操作系统的协议栈发出,这里的具体的层次关系是从传输层发出数据发生到网络IP层最后到链路层,如下图:
在计算机网络中网络层次结构被分为了两种,第一种是7层网络模型,第二种是5层网络模型,我个人比较偏向喜欢的是5层模型。5层网络模型就如上图中所示,最顶层也就是我们日常使用的一些特殊的软件或者系统提供好的应用程序所封装的网络协议模型,例如浏览器的HTTP、邮箱的SMTP等,这些都属于应用层的协议,当然如果开发者自己能力很强可以使用传输层协议实现自己的网络协议,例如QQ有自己实现应用层协议。可以协议认为是多个计算机商量好一种处理数据的方式,这也就和平常打游戏时候,游戏得分评判标准一样,有了协议那么就好处理数据了;在计算机中网络协议指的是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合。在计算机把这些规则分成多个可以相互协助工作的层次,来达到计算机网络通讯目的,这也就是为什么设计成上图的5层网络模型的原因。
传输层TCP: TCP传输协议最大的特点就是可靠性,但是由于要保证通讯的可靠性,性能就会有所折耗;它能够保证数据包的可靠性交付,TCP 能够正确处理传输过程中的丢包、传输顺序错乱等异常情况;此外,TCP 还提供拥塞控制用于缓解网络拥堵。
传输层UDP: UDP传输协议相比TCP协议实现要简单的多,效率也是最高的,只要有数据知道目标端口和IP即可把数据发送出去,不需要保证通讯的可靠性;它无法保证数据的可靠交付,相比 TCP ,UDP 不会检查数据包是否到达、网络是否阻塞等情况,特点是常用于分组数据较少或者广播、多播等视频通信和多媒体领域。
网络层IP: IP协议主要工作在网络层,这里的网络层就是路由器、交换机、计算机子网等,主要工作目的是将数据包来确定IP所在的网络区域;互联网都是有不同子网组成,IP协议要做的设计就针对TCP和UDP网络路由确定工作,将其分发到具体那个子网络中,以便最终达到目标计算机的子网络;这和现实生活中的邮寄快递一样,要填写好收货人地址,快递公司在世界各地的分公司进行分发操练工作。
目前为5层架构网络,网络层还一些其他辅助网络通讯协议,例如ARP,地址转换协议,这里主要用于的是子网内IP地址到MAC地址的翻译工作,例如一个数据包里面只有IP但是不知道MAC地址;这些就需要通过ARP协议,ARP协议就会广播到网络中计算机,如果计算机中的MAC地址匹配就会返回,以便查找到网络中的计算机。一个标准的数据包结构如下:
最顶层的数据是属于传输层的TCP协议,至于这块详情文章可以查看我写的一篇文章:何时使用TCP协议;TCP模块主要包含着的是执行连接、收发数据、断开连接等操作,而IP网络层主要是来运输数据包达到目的地的,这和日常生活在快递包裹的运输单差不多。主要负责通过网络集线器和交换机、路由器来区分数据包具体传输到下一个目的是哪里。IP协议可以根据IP头部信息来查询目标地址和下一个路由器的位置,子网中以太网协议会将数据包继续送达到下一个设备,依次递归直到到达目的地为止,能配合完成此项各种的完全依赖于每个网络设备上的路由表。
交换机的每个接口都接入一台计算机的物理网卡,交换机可以根据端口号对应着网卡,交换机路由表就可以查询到对应出口,从而把数据从对应的接口发出,交换机主会关注MAC地址,而MAC地址处于OSI层的数据链路层,所以交换机被称为二层设备,IP和以太网MAC的区别主要在于前者只能定位到设备所在的网络区域位置,而以太网MAC可以定位到具体的通信设备是谁。
其他资料
- TCP/IP vs. OSI
- ARPANET Wikipedia
- 互联网发展史
- The Network is the Computer
- Cloudflare得到了Sun的“网络就是计算机”商标
- 三十分钟看遍计算机历史博物馆
- 偷来的地基,窃来的图纸
- 微软是如何成为今天的商业巨头浏览器大战
- 所有人都应该了解的浏览器发展史
- Web3.0 vs Web2.0 vs Web1.0
- The History Of The Web
- 超文本传输协议
- RESTful API 是什么意思?
- 什么是RESTful,What is RESTful?
- Writing Web Server in Python: sockets
- 网络基础 LinuxCast视频教程
- 什么是三次握手与四次挥手
- IP地址与mac地址是什么
- 交换机和路由器有什么区别?