从输入url到页面返回到底发生了什么
1. 前言
Google应该是开发者平日里用得最多的网站之一,今早笔者在浏览器地址栏里键入www.google.com的时候,突然想了解下这背后的网络通信过程究竟是怎么样的。毕竟自己也算是一名Web开发工程师,光是TCP/IP的书也看过不少,但是至始自终却从未思考过这个问题,所以话不多说,让我们来一次深入体验吧。由于Google比较特殊,我们就用news.cnblogs.com站点做一个介绍好了。
本文适合具有一定的计算机网络相关背景知识的读者,不过只要最低不要比笔者还低就行。笔者在这方面大概战五渣的水平。
2. 网络通信过程
1. 域名解析
互联网上穿梭的数据包基本都是IP包,所以笔者与博客园新闻站点服务器传输的也是IP包,那么我们就需要博客园新闻站点服务器的IP地址。对于浏览器的使用者来说,我们只需要告诉浏览器我们需要的地址(在地址栏键入域名),那么之后解析IP地址的任务就会由浏览器代劳了。
IP包的格式为IP+TCP+HTTP。
浏览器程序通知DNS进程,请帮忙解析news.cnblogs.com的地址,此时解析IP地址的任务就由浏览器交给了DNS进程。
- DNS进程先检查自己的程序缓存,查看是否有news.cnblogs.com对应的IP地址,如果有,则直接返回给浏览器;否则,进入第2步。
- 检查本地的host文件,如果有对应的IP地址,依然选择直接返回给浏览器;否则,进入第3步。
- 检查本地的DNS服务器设置并发给消息给它,由它帮忙查找,这时解析IP地址的任务就由DNS进程交给了远程的DNS服务器。
- DNS进程发送查询报文 "query news.cnblogs.com" 至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。
- 如果记录老化或不存在,则DNS服务器向根域名服务器发送查询报文"query news.cnblogs.com",根域名服务器返回.com域的权威域名服务器地址,这一级首先会返回的是顶级域名的权威域名服务器。
- DNS服务器向.com域的权威域名服务器发送查询报文"query news.cnblogs.com",得到.cnblogs.com域的权威域名服务器地址。
- DNS服务器向.cnblogs.com域的权威域名服务器发送查询报文"query news.cnblogs.com",得到主机news的记录,存入自身缓存并返回给DNS进程。
- DNS进程将查询返回的IP地址 114.55.49.182 存入自身缓存并返回给浏览器。
2. HTTP打包
浏览器将我们访问news.cnblogs.com的请求打包成HTTP格式,然后将打包好的HTTP包和IP地址告诉TCP进程。
TCP进程和IP进程在本文中是一个抽象概念,专指操作系统内核对TCP/IP协议族的实现。
HTTP 是一个客户端和服务器端请求和响应的标准TCP。
3. 三次握手
TCP进程作风稳健,所以并不会轻易地将HTTP包和IP地址发给IP进程,所以这就引出了TCP通信三次握手。三次握手中,TCP进程决定先不发HTTP包,而是先要确保自己的IP包能够被远程服务器正常接收,同时,远程服务器的IP包也能被己方机器正常接收。
TCP进程:洞腰洞腰,我是洞拐,听到请回话
Cnblogs服务器:洞拐洞拐,我是洞腰,我听到了
TCP进程:OK,我听到你说话了。
4. HTTP数据传输
所谓兵马未动,粮草先行,还没真正进行数据交流呢,双方就已经传递了三个IP包了。不过这样一来,双方都能听到对方的回复了。现在TCP进程可以委托IP进程安心大胆地发送包含HTTP数据的IP包了。
这里还有一个问题,由于发送的IP包都是通过分组交换发出的,所以TCP进程怎么知道哪个IP包被服务端正确地接收了呢。这里就引出了SEQ和ACK的概念。
SEQ=Sequence Number
ACK=Acknowledge Number
这两个字段分别被包裹在TCP头部(别忘了我们的IP包组成结构)。比如我们每次要传输1000字节的数据,初始序列号为1,那么就将SEQ设置为1,然后本地的TCP进程就把这1000个字节打包,然后层层地封装、传输,并最终到达服务器TCP进程。
讲完了SEQ的作用,ACK的作用呢?顾名思义,它是用来“确认收货”的。比如说假如我们发起了一个POST请求,第一次传输的报文中含有1000个字节的信息,服务端在接收到之后那么就将ACK标为1001,表示确认收到并返回给客户端(没有任何数据,只是一个IP+TCP而已),这样客户端可以安心传输第二波从1001序列号开始的数据了。当然啦,我们只是访问news.cnblogs.com站点界面,只是普通的HTTP GET请求而已。
接下来,我们静待news.cnblogs.com站点界面的返回即可。在这个过程中,存在一去一回表示数据和确认的两个IP包。
5. 服务器传回网页
cnblogs新闻站点服务器将首页封装成HTTP格式,通过TCP进程按照类似第4步的流程返回给我们的机器。这一个过程,数据传输也是基于分组交换的方式。所以又是两个IP包(只考虑一次传输)。
6. 释放TCP连接
经过两边不断的“交易”,网页数据终于基本传输完毕了,我们的浏览器也根据报文内容渲染出了最终的界面。但是这就结束了吗?显然还没有,我们还需要释放TCP连接以回收资源。
计算机上建立了大量TCP连接却没有释放可是要出大问题的,《使用HttpClient的优解》
不同于通信连接阶段的三次握手,释放TCP连接则是四次握手。类比通信的一端有一个数据传输口和一个数据接收口,分别是另一端的数据接收口和数据传输口,这两根管道需要依次被关闭。
TCP进程:洞腰洞腰,我是洞拐,数据传输完毕,我要关闭连接我的数据传输口了
Cnblogs服务器:洞拐洞拐,我是洞腰,我听到了,你关闭吧
(TCP进程默默关闭数据传输口(Cnblogs服务器的数据接收口))
Cnblogs服务器:洞拐洞拐,我是洞腰,数据传输完毕,我要关闭连接我的数据传输口了
TCP进程:洞腰洞腰,我是洞拐,我听到了,你关闭吧
(Cnblogs服务器默默关闭数据传输口(TCP进程的数据接收口))
不考虑超时重传,这里又用了4个IP包。
让我们用一张图作为本次数据传输的总结。其中SYN(synchronous)是TCP/IP建立连接时使用的握手信号。
从图上也可以很直观的看出,本次通信总共用了3+2*2(双向通信)+4=11个IP包。
3. 参考资料
- 计算机是如何聊天的?
- 互联网协议入门
- 如何生动形象、切中要点地讲解 OSI 七层模型和两主机传输过程?
从输入url到页面返回到底发生了什么的更多相关文章
- 【原】老生常谈-从输入url到页面展示到底发生了什么
刚开始写这篇文章还是挺纠结的,因为网上搜索“从输入url到页面展示到底发生了什么”,你可以搜到一大堆的资料.而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么,不过当面试官一步步 ...
- 【转】老生常谈-从输入url到页面展示到底发生了什么
今天看到了一篇很详细地解释了从输入url到页面展示过程的文章,好文章不能错过,所以转到自己这里来了. 原文地址:老生常谈-从输入url到页面展示到底发生了什么 以下为原文: 刚开始写这篇文章还是挺纠结 ...
- (转)老生常谈-从输入url到页面展示到底发生了什么
刚开始写这篇文章还是挺纠结的,因为网上搜索"从输入url到页面展示到底发生了什么",你可以搜到一大堆的资料.而且面试这道题基本是必考题,二月份面试的时候,虽然知道这个过程发生了什么 ...
- 转载--从输入URL到页面展示到底发生了什么
最近我也在看http协议, tcp相关知识, 在吃饭时无意看到来一篇文章讲解“从输入URL到页面展示到底发生了什么”, 细细看完, 很值得回味, 所以转载, 以供日后在温习. (PS, 作者这篇文章发 ...
- 从输入url到页面展示到底发生了什么
阅读目录 1.输入地址 2.浏览器查找域名的 IP 地址 3.浏览器向 web 服务器发送一个 HTTP 请求 4.服务器的永久重定向响应 5.浏览器跟踪重定向地址 6.服务器处理请求 7.服务器返回 ...
- 从输入 URL 到页面展示到底发生了什么?
1.输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全ur ...
- 老生常谈-从输入url到页面展示到底发生了什么
来自:咸鱼老弟 - 博客园 链接:http://www.cnblogs.com/xianyulaodi/p/6547807.html
- 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1
[ASP.NET Core]EF Core - “影子属性” 有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...
- 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...
随机推荐
- Http post请求数据分析 --作者, 你的这个需求我可以做, 我在平台上无法给你发消息和接收你的任务, 所以,如果你看到这个信息, 可以联系我.
Http post请求数据分析 作者, 你的这个需求我可以做, 我在平台上无法给你发消息和接收你的任务, 所以,如果你看到这个信息, 可以联系我. 软件需求就是不停post一个网址,然后根据返回的信息 ...
- 通过java api统计hive库下的所有表的文件个数、文件大小
更新hadoop fs 命令实现: [ss@db csv]$ hadoop fs -count /my_rc/my_hive_db/* 18/01/14 15:40:19 INFO hdfs.Peer ...
- cookie的实现原理
cookie技术通过在请求和响应报文中写入cookie信息来控制客户点的状态 cookie会根据从服务器端发送的响应报文内的一个叫做set-cookie的首部字段信息,通知客户端保存cookie 当下 ...
- Qt 的一些浅知识点
1 Qt 官网下载地址 http://download.qt.io/ 2 必须得有pro文件么 不是必须的. pro 文件是个中间文件,通过 qmake 程序能将 pro 文件转换成其它平台的项目文件 ...
- Treap讲解
Treap讲解 上一篇blog提出了Treap这个算法,在这里我就要详细讲解. 首先,我们可以从字面上理解这个算法,Treap这个单词是由Tree和Heap两个单词构成的,所以它的性质就很好理解了,明 ...
- [LeetCode] Max Chunks To Make Sorted II 可排序的最大块数之二
This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...
- linux必知必会命令
- TopCoder SRM 558 Div 1 - Problem 1000 SurroundingGame
传送门:https://284914869.github.io/AEoj/558.html 题目简述 一个人在一个n * m棋盘上玩游戏,想要占领一个格子有两个方法: 在这个格子放一个棋子. 这个 ...
- ●POJ 2828 Buy Tickets
题链: http://poj.org/problem?id=2828 题解: 线段树. 逆向考虑这个过程.最后的序列S共有n个元素. 先看最后一个人,如果他插入到第i位,那么他最终的位置就是当前序列S ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...