前言:
目前市场上得书籍很少能将http相关知识讲的很清楚,很多开发在这一块的体系知识需要得到补充,当然也包括我。无意间,看到一本 日本人写的 《图解http》书,发现里面讲的很细致,并且以图形得方式深度还原http之间的联系,值得推荐,于是好记性不如烂笔头,开始记录吧,本文主要是针对第一章记录,共11章每个章节都会做详细的讲解
第一章 了解web及网络基础
首先是一道经典面试题,我在面试和被面试的时候经常问的一个问题:
当我们在浏览器地址栏内输入URL后到页面渲染出来,期间浏览器进行了那些步骤?
当然我相信很多人在面试前都是去查了一下相关的问题解答,然后背下来进行面试,但是这个答案本身就是很基础的一个回答,面试官常常会说: 哦,好。但是要是你回答很非常详细,恰好面试官也不太了解这个http体系的时候,他可能不太懂,但是内心自然油然而生出一句: 牛b。
那这个本对这个问题进行的解答,是可以让面试官对你说牛逼的,强烈建议前端同学买书反复观看,支持原版
http诞生:
为知识共享而规划web,1989年3月,互联网只是属于少部分,在这个互联网的黎明期,http诞生了。CERN(欧洲核子研究组织) 蒂姆~博纳斯-李 提出了让远隔两地研究者们共享知识的设想,最初设想是:借助多稳定之间相互关联形成超文本,连接成可以相互参阅的www万维网(换句话说:就是兄弟几个能坐在一起玩电脑开黑)
现在提出了3项www构建技术,分别是SGML:
- 作为页面的文本标记语言 HTML
- 作为文档传递协议的http
- 指定文档所在地址的URL(统一资源占位符,IP地址)
web成长时代(html):
1990年大家针对html1.0草案讨论,但是很多地方模糊不清,直接废弃了。
1990年11月,CERN成功研发了世界上第一台web服务器和web浏览器。
1993年1月,现代浏览器的祖先NCSA (美国国家超级计算机应用中心)研发的mosaic问世,它用内联的形式展示HTML图像
1994年12月,网景公司发布netscape navigate 1.0,apache 成为服务器的标准,而html也发布了2.0版本
1995年微软发布了IE 1.0和2.0 浏览器,然后开始与网景公司浏览器大战,两家公司都在对html扩展,后网景公司衰落
2004年 火狐出现,第二次大战
以前做网站开发真的是头大,各种hack,555,现在终于好了,我爱谷歌
http(主要解决文档传输的难题):
http于1990年问世,没有正式版本所以是http/0.9
1996年5月,版本命名为http/1.0 ,虽然是初期标准,但该版本目前还在广泛使用在服务端
1997年1月发布http/1.1,也是当前最主流的http版本,2.0版本还在制定中,不知啥时候应用
tcp/ip协议
计算机与网络要相互通信,双方就基于相同的方法和约束进行交互,这些都需要规则,所以我们面试经常都在说要通过tcp三次握手,为什么要握手,握手的细节发生了什么,就不清楚了? tcp/ip协议是一个统称,它不是一个单一的名称,它包含了很多内容:IEEE、http、snmp、UDP、DNS、ip、icmp、tcp、ftp....
如何了解tcp/ip呢,首先要进行分层:
利用tcp/ip 进行分层,发送端以应用层开始往下走(1.2.3.4),接收端则从链路层往回走(4.3.2.1) 好处:如果一个互联网只由一个协议统筹,某个地方需要重新设计,就必须要把所有部分整体替换掉,分层只需要分对对应的变动的层级替换掉就行
-
应用层(http客户端) FTP(文件传输协议) 、DNS (域名系统) http协议就属于这层
发送端A:用户在地址栏发一个想看的web页面,开始http请求,(http会带http报文,以及添加首部信息)
-
传输层(TCP) 对应用层,提供网络连接两台计算机之间的数据传输,如TCP(传输控制协议),UDP(用户数据包协议)
发送端A:从应用层收到的请求报文进行分割,并在各个报文打上标记序号及端口号,以及tcp首部信息,并转发给网络层
-
网络层(ip)
处理网络上流动的流量包,数据包是网络传输的最小单位,这层规定了通过怎样的路径(传输路线)到对方的计算机,并把数据给它,与对方计算机之间通过多台计算机或网络设备进行传输时,网络层的作用就是在众多选项内选择一条传输路线
发送端A:从传输层收到数据,添加作为通信目的地的MAC地址、ip首部、tcp首部、http报文 转发给数据链路层
-
数据链路层 (网络) 处理链接网络的硬件部分,包括操作系统,硬件驱动,NIC(网卡)等一切传输媒介
发送端A:从网络端拿到数据,添加以太网首部、tcp首部、ip首部、http数据
层与层之间传递数据,都会添加一个该层的所属的首部信息,在接收端会逐步去掉
详细聊聊http关系比较密切的协议: tcp、ip、DNS
ip
作为网络层,几乎所有网络的系统都会用到ip协议,ip的作用就是即将各种数据包传送给对方,并确保确实传递到对方,需要满足各类条件,其中两个最重要的就是 ip地址和Mac地址。 ip是节点分配到的地址,mac是网卡所属的固定的地址,ip地址可变换,Mac是固定地址,不会变
使用ARP协议凭借mac地址进行通信 中转 ip通信依赖MAC地址,在网络通信中,用户们在同一局域网LAN内的情况很少,通过需要经过多台计算机和网络设备中转才能链接到对方,在中转时,会利用下一站中转设备的MAC地址搜素下一个中转目标,这时会使用ARM协议,ARP是一种用于解析地址的协议,根据通信方的ip地址就可以发查出对应的MAC地址,特别注意的是:在中转过程中,计算机和路由器只能获悉一个大概的传输路线,这种机制称为路由选择,就是将数据线送到集散中心站(快递举例),通过集散中心站对ip进行分类,集散中心站是否能送到对方家中
TCP
位于传输层,提供可靠的字节流服务,啥是字节流服务?其实就是为了方便传输将比较大的数据分割成以报文段(segment)为段位的数据包进行管理然后把数据准确的传递给MAC地址,
为了确保无误的将数据传递给网络层,TCP协议采用了三次握手
说到三次握手,不得不吐槽一下大批程序员,包括我,哈哈哈,每次面试问到这个问题,都会说三次握手,怎么个握手法,细节就不知道了
用TCP协议把数据包送出去后,tcp不会对传递后就置之不理了,因为它是一个有责任心的男人,它一定会问对方有没有收到情人节礼物,给对方礼物的时候,会添加一个自己名称还有SYN和ACK标志
男朋友(发送端)
A: 标有SYN(我的信息)的情人节礼物快递发你了
B: 收到了,谢谢你,好感动,我在给你寄点东西回来,里面带着ACK(你的信息)
女朋友(接收端)
A: 收到你的礼物了,爱你,我把我的礼物也给你,我给你标记了 SYN(你的名字)、ACK(我的信息),开始进行B步
B: 收到了,确实是你给我的礼物,你是一个好人
DNS
DNS是和http协议一样位于应用层的协议,提供了域名的解析服务。计算机可以被赋予ip地址,也可以被赋予主机名和域名,比如 www.baidu.com 因为用户一般是使用主机名或者域名来访问对方的计算机,而不是直接通过ip来访问,因为太难记了一大串数字,DNS的作用就是当用户输入了域名后,它会先从DNS中间站去拿到这个域名对应的ip地址,然后像ip地址进行请求对应的web服务器
看了半天有点枯燥哈,直接来张流程图,理解一下
一句土味话:当你在享受科技带来的便捷时,总有另外的存在为你东奔西走,感恩这些硬件大哥让世界的距离如此之小
URL和URI
开始的开始,我就经常见过,我以为是写错了单词(英语不太好,谢谢),但是后面一看,发现不是,这是两个不同的东西,一个是定位,一个是定位
URL是:统一资源定位符
URI: 统一资源标识符 URL 是 uniform resource identifier
uniform : 规定统一的格式方便处理不同类型的资源,,而不用根据上下文环境来识别资源指定的方式,(如:www.baidu.com/text,txt 或者 ftp://ftp.is.co.za/text,txt) 都可以访问到指定的资源
resource:可标识的任何东西,不管是什么文件,它都可以区分类型,全部作为可使用的资源
identifier: 可标识的对象
综合上述,得出的结论就是:URI就是某个协议方案标识的资源定位符,协议方案,就是访问资源所使用的资源类型,使用http协议,协议方案就是http,当然还有ftp访问,URL访问,telnet,file,mailto等等30多种,所以URL是URI的子集,
一个标准的URI格式
user:pass@www.example.jp:80/dir/index.h…
http:// 协议名
user:pass: 登录信息
www.example.jp 服务器地址 可以是ipv4 也可以是ipv6 【0:0:0:0:0】
:80 服务器端口号
dir/index.html 带层次的文件路径
?uid= 查询字符串
#chi 片段标识符 (RFC对片段标识符没有做要求,加不加都能访问到文件的子资源,但是如果RFC要添加这个规范,很多网站就打不开了。。。)
看的很枯燥,那就对了,书就是写的很枯燥,才显得很有底蕴和专业,但是用白话翻译一下,就很简单了