输入URL之后都发生了什么

这个标题印象中已经有很多讨论了。也来说说这个话题。

从头开始,当你的电脑使用网线连接到网络的时候,我们都知道,这个时候你的电脑会获取一个IP,这个IP就是你的唯一标识了。好了继续,你在浏览器中敲入了http://www.sina.com,开始你的网络之旅。那么这个时候问题来了,我们都知道你这个数据是从哪里的机器来的呢?比如sina的提供这个服务的机器也有个IP,那么你敲入的www.sina.com怎么会定位到sina提供机器的IP呢?这里就是DNS概念了。

DNS

好了,这里其实最需要的就是域名与IP的对应关系,由于世界上的服务太多了,每个服务都有需要有一个域名和ip的映射,这个量太大了。所以我们将域名按照小数点进行划分。sina.com,最后一个小数点后面的叫做顶级域名,顺次叫做二级域名,三级域名。域名服务商也不是一家,有很多家,大致也是树形结构,其中管理顶级域名的公司全世界只有13家,其中唯一的一台主服务器在美国,其他的从域名服务器分别在美国,瑞典,荷兰和日本。

.com:表示商业机构

.net:表示网络服务机构

.org:表示非营利性组织

.gov:表示政府机构

.edu:表示教育机构

我们可以使用dig +trace命令来获取每次域名请求的情况

[yejianfeng@iZ23u681ae1Z ~]$ dig www.126.com +trace

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> www.126.com +trace
;; global options: +cmd
. 255442 IN NS g.root-servers.net.
. 255442 IN NS f.root-servers.net.
. 255442 IN NS i.root-servers.net.
. 255442 IN NS e.root-servers.net.
. 255442 IN NS d.root-servers.net.
. 255442 IN NS m.root-servers.net.
. 255442 IN NS j.root-servers.net.
. 255442 IN NS a.root-servers.net.
. 255442 IN NS k.root-servers.net.
. 255442 IN NS l.root-servers.net.
. 255442 IN NS c.root-servers.net.
. 255442 IN NS b.root-servers.net.
. 255442 IN NS h.root-servers.net.
;; Received 496 bytes from 10.202.72.116#53(10.202.72.116) in 2 ms com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
;; Received 501 bytes from 192.5.5.241#53(192.5.5.241) in 33 ms 126.com. 172800 IN NS ns2.nease.net.
126.com. 172800 IN NS ns3.nease.net.
126.com. 172800 IN NS ns4.nease.net.
126.com. 172800 IN NS ns5.nease.net.
126.com. 172800 IN NS ns6.nease.net.
126.com. 172800 IN NS ns7.nease.net.
126.com. 172800 IN NS ns1.nease.net.
126.com. 172800 IN NS ns8.nease.net.
;; Received 342 bytes from 192.41.162.30#53(192.41.162.30) in 275 ms www.126.com. 18000 IN CNAME mcache.mail.163.com.
mcache.mail.163.com. 18000 IN CNAME email.163.com.lxdns.com.
;; Received 93 bytes from 61.135.255.140#53(61.135.255.140) in 29 ms

上面就是说我们请求了5次才寻找出准确的提供服务的机器。

那么问题来了,这13台根域名服务器如果挂了,怎么办?比如2014年1月21日出现过顶级域名服务出错的情况,导致了域名服务器错误的情况。那么这种情况,只能说是世界崩溃了。你百度不了,google不了,网络就请求不了了。一出这种问题,很多流传的方法都是直接绑定DNS服务器到8.8.8.8,这个是google的服务器。

再说一个DNS的案例,13个顶级的域名服务商在解析了顶级域名之后,会把其他对应的域名解析防盗

好了,这里有个优化的点了,我一般浏览网站的时候都是连续请求一个网站的几个页面,每次都去域名服务商那边查询这个域名的服务IP,这本身就是脑残的事情。对于这种脑残的事情,程序员肯定是不会做的,所以在本机和浏览器保存域名和IP的查询。好了,现在所有浏览器一起讨论的方法就是请求先去浏览器DNS缓存中查找,比如chrome中可以使用

chrome://net-internals/#dns

进行缓存查询。

然后是本机的DNS缓存,本地的DNS缓存在windows可以通过ipconfig /displaydns进行查找。本地还有一个可以让人工干预DNS解析的地方,就是hosts文件,有个很好用的工具SwitchHosts可以来进行hosts文件设置。

路由

好了,知道了对方提供服务的机器地址了,但是不幸的事情发生了,它是在上海的,我是在北京的,我们两个之间并没有直接的电线进行连接。那么怎么办呢?程序员也想到了一个办法,驿站。在互联网中间建立很多站点,这些站点提供的一种服务叫转接服务。比如我想要连接到www.126.com所在的服务器怎么办呢?我可能要中间跳转10-20次才能到达它的服务器。第一次调转到北京燕郊,第二次跳转到河北,...使用traceroute就可以查看你到达一个ip中间跳转了几次。

那么是谁那么好心建立这些驿站呢?就是运营商。中国现在有6大运营商:中国移动,中国联通,中国电信,中国网通,中国铁通和中国卫通。然后长城宽带据说厚劲勃发,要做第七大运营商。当然这个网络肯定不是让大家免费用的,这里大家就知道了,我们平时交的网费是花在哪里了。

好了,运营商的厉害之处就知道了吧,如果有运营商使坏,你本来从北京传递消息“我爱你”给上海的一台机器,但是运营商路由传递的过程中把这个信息改成了“分手吧”。好了,这下你哭都没法子了。这个就叫做运营商劫持。现在有的运营商劫持不会很暴露,但是加个广告,加个js还是很有可能的。

TCP握手

好了,我们现在找到了提供服务的机器了,我们想要从这个机器上获得一个页面。机器的行为和人的行为很像。对于人来说,A要和B握手,A先伸出手,B也伸出手回应,你好,我是B,然后A再回应,你好,我是A。这样一个握手认识的环节就完成了。

在互联网中,也是这样的一个三次握手的顺序。A要和B服务进行交互,要经过三次握手的环节。A发送一个请求给B,B回应了一个请求,然后A再发送一个确认请求给B。这样两个人的信任关系就搭建完成了。

好了,这里插入说一种攻击方式。如果我现在有很多小弟,然后我让这些小弟都轮番和你进行第一次握手,就是那次伸手环节。但是等你伸手之后,我不对你进行回应,你就会傻傻在那边等待我的回应。这种攻击就叫做SYN FLOOD攻击。

搭建完成之后两边就进行了数据交互。这里数据交互的部分我们等会再说。数据交互完之后,这里就有一个结束交互的环节了。

再想想恋人是如何如何分手呢?两个恋人决定要分开了,A和B说,我已经不爱你了,B和A说,好,我也已经不爱你了。然后由于A和B都已经确定我们互相不爱了,B就干脆的说,我们分手吧,A也非常干脆地说,分手吧。然后两人就分手了。

这个过程术语叫做四次挥手环节。A和B是双工的,双工的意思就是A和B都有接收信道和发送信道。A发送结束信号给B,并且把自己的发送信道设置为待关闭状态,B收到A的结束信号之后,先发送一个信号给A,我也可以结束了,并且自己关闭了发送信道。然后再发送一个信号给A,告诉A我最后接收到你的确认之后就把接收信道关闭了。A收到这个确认信号之后,最后发送了一个信号,关闭吧,然后把自己的接收信号给关闭了,也把自己的发送信号给彻底关闭了。B收到这个信号之后,就最后把自己的发送和接收信道就关闭了。

交互消息内容

好了,现在回到双方交互的时候,进行数据传递。首先,A要的其实不是数据,而是一个有图片,有字体的页面,B能给的是一个数据。这里就有一个问题了,如何使用数据来描述一个页面呢?这里就需要有一个描述页面的语言。就叫做HTML。

如果给你一个页面,让你描述它。你一定会这么描述,整个页面分为上下两个部分,上面部分10厘米,下面部分100厘米,上面的部分底色为蓝色,又分为几个标题。我要说,你真聪明。实际上我们的页面切图也就是这么切图的。不过我们的语言不是这样平白的语言,而是用HTML语言。

<div style="heigh:10px" >
<div style="width:10px;float:left" ></div>
<div style="width:10px;float:left" ></div>
<div style="width:10px;float:left" ></div>
</div>
<div style="heigh:100px"></div>

这HTML语言是1982年之后就创建的。在逐步发展演变过程中成为了国际的标准,现在所有的浏览器都支持这个语言。HTML现在由一个国际组织万维网联盟(W3C)来进行维护。

HTML现在的发展历程已经到了HTML5。HTML1.0, HTML2.0, HTML3.0,HTML4.0,也都是有的,现在最新的是HTML5,2014年10月完成标准制定。在这个之前,HTML5的草案其实已经发布很久了,但是各个浏览器对于它的支持也都不一致,等到5.0正式发布之后,现在浏览器对于HTML5的支持已经很强大了。

好了,一般来说,客户端获取到了HTML,这个过程就完成了。但是现在角度换到服务端。如果像新闻一样,所有人看到的东西都一样,那么就很简单了,我把一个HTML文件放在服务器端,你过来拿就行了。但是偏偏现在同样一个新闻,不同的人看到的东西是不同的。这两种情况就叫做“静态页面”和“动态页面”。动态页面需要完成一定的业务逻辑才能返回一个HTML页面。那么这个时候服务端就需要写一些逻辑,于是就有了写这些逻辑的语言了。现在我们大多数使用的语言有PHP,JAVA,PYTHON等。各种语言有各种语言的优势,但是总的目的就是为了生成动态页面。

AJAX

好了,我们换回浏览器角度,我们获取到HTML之后,然后根据HTML的语意,进行渲染,描绘出我们需要的页面样式。

但是,这种页面是“死”的。意思是什么。这种页面我想要在文本中输入一个字,然后文本提示我,还可以输入几个字。这个功能就需要页面有一个功能“如果用户输入了一个字,计算距离20个字还有多少字,修改提示文本”。这个逻辑就需要脚本语言来做,这个就是JavaScript。最早javascript是由一家国外公司netscape进行设计的,后来逐步成为了一种国际标准。现在所有的浏览器都支持javascript语言了。

实际使用中,我们常常会碰到一种需求,我们希望我点击一个按钮,这个按钮不要跳转到另外一个页面,而是直接在这个页面内和服务端做操作,做完操作之后,修改当前页面的一个元素或者内容。这样我们的执行效率就会提高了。这种逻辑,我们专门给它一个名词“AJAX”,由javascript对服务器端发起一个网络请求,比如请求修改用户名称,然后服务器返回说修改成功了,然后客户端就进行页面元素的修改。

输入URL之后都发生了什么的更多相关文章

  1. 解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细

    这道题目没有所谓的完全的正确答案,这个题目可以让你在任意的一个点深入下去, 只要你对这个点是熟悉的.以下是一个大概流程: 浏览器向DNS服务器查找输入URL对应的IP地址. DNS服务器返回网站的IP ...

  2. 在浏览器中输入一个URL后都发生了什么

    这道题目没有所谓的完全的正确答案,这个题目可以让你在任意的一个点深入下去, 只要你对这个点是熟悉的.以下是一个大概流程: 浏览器向DNS服务器查找输入URL对应的IP地址. DNS服务器返回网站的IP ...

  3. 浏览器地址栏输入url回车之后发生了些什么

    1.输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全ur ...

  4. 地址栏输入url按回车发生了什么

    浏览器向DNS服务器(先查找缓存)查找输入URL对应的IP地址 DNS服务器返回对应的IP地址 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码 浏览器 ...

  5. [网络] 在浏览器输入URL回车之后发生了什么

    目录 一  前言 二  URL解析 三  DNS域名解析 1  IP 地址 2  什么是域名解析 3  浏览器如何通过域名去查询 URL 对应的 IP 呢 4  小结 四  建立连接 1  TCP三次 ...

  6. 浏览器输入URL后,发生了什么?(打开一个网页会使用哪些协议?)

    简单说来分为6个过程 1.DNS解析 互联网每一个服务器都是以ip地址作为界限的,并不是我们平时输入的url地址,就比如www.ccc.com这一个网址,当输入进浏览器之后就会由DNS解析将它转化成一 ...

  7. 在浏览器输入URL回车之后发生了什么?(超详细版)

    前言 这个问题已经是老生常谈了,更是经常被作为面试的压轴题出现,网上也有很多文章,但最近闲的无聊,然后就自己做了一篇笔记,感觉比之前理解更透彻了. 这篇笔记是我这两天看了数十篇文章总结出来的,所以相对 ...

  8. 在浏览器输入URL回车后发生了什么?

    本文由 简悦 SimpRead 转码, 原文地址 https://4ark.me/post/b6c7c0a2.html 这个问题已经是老生常谈了,更是经常被作为面试的压轴题出现,网上也有很多文章,但最 ...

  9. 在浏览器输入 URL 回车之后发生了什么

    注意:本文的步骤是建立在,请求的是一个简单的 HTTP 请求,没有 HTTPS.HTTP2.最简单的 DNS.没有代理.并且服务器没有任何问题的基础上. 大致流程 URL 解析 DNS 查询 TCP ...

随机推荐

  1. 最快让你上手ReactiveCocoa之进阶篇

    前言 由于时间的问题,暂且只更新这么多了,后续还会持续更新本文<最快让你上手ReactiveCocoa之进阶篇>,目前只是简短的介绍了些RAC核心的一些方法,后续还需要加上MVVM+Rea ...

  2. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  3. 基于uploadify.js实现多文件上传和上传进度条的显示

    uploadify是JQuery的一个插件,主要实现文件的异步上传功能,可以自定义文件大小限制.文件类型.是否自动上传等属性,可以显示上传的进度条.官网地址是http://www.uploadify. ...

  4. 【面试必备】javascript操作DOM元素

    前言 时间过的真快,不知不觉就到年底了.问问自己,这一年你对自己的工作满意吗? 评价标准是什么呢?当然是马云的那两条准则了:钱给到了吗?干的爽吗?如果答案都是no,那么,你准备好跳槽了吗? 为了应对年 ...

  5. Javascript事件模型系列(一)事件及事件的三种模型

    一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...

  6. [ACM_动态规划] 嵌套矩形

    问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ...

  7. 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目

    系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使 ...

  8. 自制操作系统(七) 加快中断处理,和加入FIFO缓冲区

    参考书籍<30天自制操作系统>.<自己动手写操作系统> 2016-05-26.2016-07-09 主要是加快中断处理,和加入FIFO缓冲区. 因为之前是将打印字符的代码放在了 ...

  9. ./在Linux下是什么意思

    在网上找的答案: . 在这里表示的是当前目录,就像 .. 表示上级目录一样. 这个 / 表示的是目录级别的分隔符,他之前的就是目录名,./aaa/ 表明的就是 . (也就是当前目录)下面的 aaa 目 ...

  10. String的length()和Array的length

    String是个final修饰的最终类,不能被继承,String中属性都设置为private,方法为public,并不提供set方法,想要获得字符串的长度必须调用length()方法这个长度是确定的, ...