Web的诞生和网络基础 | 读《图解HTTP》

666 阅读7分钟


当今互联网的由来

蒂姆·伯纳斯·李在1989年的时候提出一种设想,借助多文档之间的相互关联形成的超文本(HyperText),连成可相互参阅的WWW(World wide web,万维网)。

对于这个想法,李爵士(伊丽莎白二世给他发了爵士勋章)也提出了三个相应的解决方案:HTML,承载超文本内容;URL,标明文档所在的唯一地址;HTTP,文档在各个机器之间传递的协议。所以,李爵士可以说是FEer的祖师爷。

HTML和HTTP的发展

最早期的网页是非常简单的,只有简单的文字呈现和超链接跳转,能够显示图片都已经很了不起了。此外,最开始的时候,是没有CSS的,页面上的样式都由<center> <big>这样的标签来改变。直到1994年的时候,HTML 1.0已经经过了多次版本更迭,CSS才被提出。

HTTP的发展经历了0.9 -> 1.0 -> 1.1 的变动。尽管HTTP2.0早已到来,但大部分浏览器使用的仍是1.1版本。我之前的一次面试就被问到2.0中包含了那些新特性。详见这里

互联网&万维网

书中没有提及这一点,但我认为有不少人对这两个词没有清楚的概念。有一点很好区分的是,在上面说到李爵士的设想时,万维网是建立在相互连接的超文本上的。但除去查看超文本外,电脑还可以做更多的事,比如发邮件(SMTP)、文件传输(FTP)等,这些就不能称为万维网了,应该是互联网。在协议层面上来说,我们说万维网其实是在说HTTP,而互联网在应用层远不止HTTP这一个协议,还包括诸如上面提到SMTP、FTP等协议。万维网是包含在互联网中的一个功能,所以你可以笼统地认为,在浏览器的范围内都是万维网。

网络基础TCP/IP

之前说到的HTTP协议只是TCP/IP协议族中应用层中的一个协议。TCP/IP 协议存在的必要性,如同人类世界中双方的沟通需要使用都理解的符合规范的语言,计算机之间的沟通更是需要基于相同的方法。

不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们把这种规则称为协议(protocol)。

TCP/IP协议族按层次分为应用层、传输层、网络层和数据链路层。应用层最靠近用户,越往后越底层。

应用层向用户提供应用服务,包含FTP、DNS和HTTP等协议,开发者基于这些协议进行应用开发。

传输层提供处于网络连接中的两台计算机之间的数据传输,包含TCP和UDP协议。

网络层用来处理在网络上流动的数据包,规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。

链路层用来处理连接网络的硬件部分,硬件上的范畴均在链路层的作用范围之内。

在进行网络通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接收端则从链路层往上走。

与HTTP关系密切的协议:IP、TCP和DNS

前面说到IP协议的作用就是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件,其中两个重要的条件是IP地址和MAC地址。IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址配对。由于网络的变动,IP地址会变动,但MAC地址基本上不会更改。

通信双方的连接一般需要通过多台计算机和网络设备的中转,在进行中转的时候,会利用下一站中转设备的MAC地址来搜索下一个中转目标。不断获取连接路线的这个过程称为路由选择。

前面说到传输层包含TCP和UDP协议,TCP是能够确保可靠的协议。可靠在这里的含义是无论如何它都会确保数据最终到达另一方。说到可靠性保证,就无法不提三次握手。请求端首先发送一个带SYN(synchronize)标志的数据包给对方,接收端收到后,回传一个带有一个带有SYN和ACK(acknowledgement)标志的数据包以示传达确认信息(这一步表明接收端能正常接收请求端消息)。最后,发送端再回传一个带ACK标志的数据包,代表“握手”结束(表明请求端可以接收到接收端回传的消息)。

负责域名解析的DNS服务

真正标识一个计算机位置的是IP地址,但对于每个网站我们使用的是域名,所以在每个请求发送前,需要到DNS服务器查询该域名对应的IP地址。域名系统在应用层上使用的就是UDP(user data  protocol用户数据报协议)。UDP相较于TCP较为明显的不同之处在于,UDP不保证消息的可靠传递,但是速度比TCP快。

各种协议与HTTP协议的关系

其实这就是著名面试题“在浏览器输入域名按下回车后发生的事”的答案。在通过域名系统获得目标网站IP地址后,HTTP协议会生成针对目标Web服务器的HTTP请求报文;到达传输层后,TCP协议为了方便通信,将HTTP请求分割成有序的报文段;在网络中,IP协议搜索对方的地址,一边中转一边传送;到达目标服务器后,TCP协议将接受到的被分割的报文段重组成报文,HTTP协议对请求的内容进行响应,回传请求内容。当然,若要说答案,这只能说是基于各协议层面上非常粗略的一份。在这些之外,还涉及到内容缓存、过期时间、render tree构建和渲染等其他知识。

URI和URL

URI是统一资源标识符,URL是统一资源定位符。URI是由某个协议方案表示的资源定位标识符。URL是URI的子集。

http://www.baidu.com:80/dir/index.html?id=9#chapter1

上面是我瞎写的一个URL,其中http是协议方案名;www.baidu.com:80是服务器地址,因为80是默认端口,所以一般不写,但开发环境中我们就会见到需要填写端口的情况;dir/index.html是带层次的文件路径;?id=9是查询字符串;#chapter1是片断标识符,即一个页面中的锚点,有它打开后会直接到页面中锚点所在位置。

书中没有说到一个点是同源策略,同源策略是指协议相同,域名相同,端口相同。同源策略的目的是为了保证用户信息的安全,防止恶意的网站窃取数据。

自说自话

这本书不厚,但内容丰富足够,之前较为快速的翻阅过一遍,现在已经忘的差不多。在看第二遍的时候准备以上面的形式记录下来。关于内容的形式,也有思考过,现在是章节和小标题基本以书中为标准,每一小节的内容有的参考书上,有不少会用自己的话总结下,另外还会补充一些书中没有提及,但我有这个疑惑或者我觉得有必要提及的也会加到内容中。关于内容的组织形式,欢迎大佬们提更好的建议。

谢谢看完^_^,欢迎点赞。