最近在看一本关于网络协议的书《图解HTTP

当我们在浏览器的地址栏输入 http://www.pwstrick.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢?

1.  域名解析

2. 建立TCP连接

3. 发起HTTP请求

4. 服务器响应HTTP请求

5. 浏览器渲染页面

自己原先不是很了解,通过读了这本书后了解了些内幕。

接下来将使用工具Chrome、FiddlerWireshark。曾经写过一篇Fiddler的教程《移动开发中Fiddler的那些事儿》。

一、基础概念

1)TCP/IP是互联网相关的各类协议族的总称

2)TCP/IP分为4层:应用层、传输层、网络层、链路层。

发送端从应用层网下走,接收端从链路层网上走。

IP(Internet Protocol):网际协议位于网络层,IP地址可以和MAC地址配对。

ARP(Address Resolution Protocol):ARP是一种用以解析地址的协议,根据通信方的IP地址反查出对应的MAC地址。

Routing:路由选择,有点像快递公司的送货过程。

TCP(Transmission Control Protocol):传输控制协议,提供可靠的字节流传输,将大数据分割成报文段(segment),TCP协议能够确认数据最终是否送达到对方。

3)数据信息包装

4)域名解析DNS服务

DNS(Domain Name System)位于应用层,提供域名和IP地址之间的解析服务。

5)URI和URL

URI(Uniform Resource Identifier):统一资源标识符。

URL(Uniform Resoure Locator):统一资源定位符,通俗的说法是网址。

URI表示某一互联网资源,而URL表示资源地点,所以URL是URI的子集,下面是几个URI资源。

6)RFC

RFC(Request For Comments):征求修正意见书,RFC是互联网的设计文档。

要是不按照RFC标准执行,就有可能导致无法通信的状况。

7)HTTP

HTTP是无状态协议,协议对于发送过的请求或响应都不做持久化处理。

HTTP/1.1为了实现保持状态的功能,引入了Cookie。

二、域名解析

在《What really happens when you navigate to a URL》中曾提到DNS会先在缓存中查找记录。

浏览器缓存、系统缓存、路由器缓存、ISP DNS 缓存、递归搜索。

三、建立TCP连接

1)发送端发送一个带SYN标志的数据包给对方

Sequence Number:序号;

Acknowledgment Number:确认号。

2)接收端回传一个带有SYN和ACK标志的数据包以示传达确认信息

3)发送端再回传一个带ACK标志的数据包,代表“握手结束”

四、发起HTTP请求

HTTP(Hyper Text Transfer Protocol),超文本传输协议,由请求和响应构成。

在书本的第3章介绍了HTTP信息。

1)请求报文

报文首部内容如下:

在书本的第6章中有详细的HTTP首部说明。

Connection:keep-alive”:持久连接,只要任意一端没有明确提出断开,就保持TCP连接状态。

2)响应报文

报文首部内容如下:

上图中的200是HTTP状态码,在书中的第4章详细介绍了状态码。

五、服务器响应HTTP请求

从上面的响应报文中可以看到服务器软件是Nginx,并且请求的是一张PHP页面。

以前曾经写过一篇《PHP代码的执行》,不过软件用的是Apache。这里就假设是Apache+PHP(fastcgi)架构提供服务。

1)Apache

Apache对HTTP的请求可以分为连接、处理和断开连接3个大的阶段。同时也可以分为上图所示的11个小的阶段。

2)FastCGI

FastCGI可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。

比如现在请求的是“index.php”,根据配置文件,Apache知道这个不是静态文 件,需要去找PHP解析器来处理,那么它会把这个请求简单处理后交给PHP解析器。

Apache会传url、查询字符串、POST数据、HTTP header等,而CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

3)PHP脚本执行

PHP程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。

初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。

编译成opcode执行。

服务器最终将生成的HTML代码返回给浏览器。

六、浏览器渲染页面

从Chrome的网络工具中可以看到,浏览器会先下载HTML代码,再去下载CSS或JS外部资源。

网上的很多资料显示,浏览器是边下载HTML,边解析HTML的。

有篇文章叫《How browsers work》介绍浏览器内部工作原理的,文中提到了浏览器的渲染引擎——Webkit

渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成,下面是渲染引擎基本流程:

解析HTML以构建DOM树 -> 构建Render(渲染)树 -> 布局Render树 -> 绘制Render树

下图是Webkit的主流程:

参考资料:

Wireshark基本用法

当你输入一个网址,实际会发生什么?

一次完整的HTTP事务是怎样一个过程

从输入url到页面加载完的过程中都发生了什么事情

当在浏览器地址栏输入一个URL后回车,将会发生的事情?

输入URL到展现页面的全过程的更多相关文章

  1. 从输入 URL 到展现页面的全过程

    总体分为以下几个过程 DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 DNS解析 域名到ip地址转换 TCP连接 HTTP连接是基于TCP连接 ...

  2. 浏览器输入URL到响应页面的全过程

    B/S网络架构从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP协议采用无状态的短链接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通 ...

  3. 浏览器输入URL到返回页面的全过程

    [问题描述] 在浏览器输入www.baidu.com,然后,浏览器显示相应的百度页面,这个过程究竟发生了什么呢? [第一步,解析域名,找到主机] 正常情况下,浏览器会缓存DNS一段时间,一般2分钟到3 ...

  4. 浏览器中输入URL到返回页面的全过程

    第一步,解析域名,找到主机IP (1)浏览器会缓存DNS一段时间,一般2-30分钟不等.如果有缓存,直接返回IP,否则下一步. (2)缓存中无法找到IP,浏览器会进行一个系统调用,查询hosts文件. ...

  5. 关于浏览器,从输入URL到呈现页面过程!(主讲TCP/IP协议)

    一.文本对话--从请求到响应 我们在浏览器中输入一个 URL,回车之后便会在浏览器中观察到页面内容.实际上这个过程是: (1)浏览器向网站所在的服务器发送了一个 Request(请求) (2)网站服务 ...

  6. 简略图解:输入 url 到出现页面,浏览器做了什么?

    应该有很多前端开发人员都思考过这么一个问题:从输入 URL 到页面加载完成,中间都做发生了什么? 这个问题涉及的面非常广,每个涉及的点又很深入.从触屏/键盘如何到 CPU?CPU 如何到系统内核?如何 ...

  7. 输入URL地址到页面加载完成 过程

    在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...

  8. 计算机网络【6】—— 从浏览器输入URL到显示页面发生了什么

    当在浏览器地址栏输入网址,如:www.baidu.com后浏览器是怎么把最终的页面呈现出来的呢?这个过程可以大致分为两个部分:网络通信和页面渲染. 一.网络通信 互联网内各网络设备间的通信都遵循TCP ...

  9. HTTP:地址栏输入url到显示页面的步骤

    在浏览器地址栏输入URL 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤 如果资源未缓存,发起新请求 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证. 检验 ...

随机推荐

  1. USACO翻译:USACO 2013 NOV Silver三题

    USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...

  2. 华为oj 购物单

    这两天断断续续敲完这个(放假的时候比较懒),一次成功有点小激动(●'◡'●)  不过貌似从第一次打开开始计时..... 这道题目很像01背包,我将附件与它们的主件绑定(就是link起来)然后套用动态规 ...

  3. DataTable的数据批量写入数据库

    最近在将excel中的文件导入到数据库中,用程序进行编写,由于数据量较大所以速度很慢,后来采用了SqlBulkCopy类,解决了速度的问题,我就insert语句,sqldataadapter.upda ...

  4. Repeater的分页

      Repeater控件是个好东西.轻量级.又好用.完全的自定义.但是,正是因为这些优点它没有自动分页的功能.这个需要研究一下.我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很 ...

  5. C语言中的栈和堆

    原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...

  6. 日常办公工具利器 notepad++

    日常办公工具利器 notepad++ 文本内容比较 Notepad++ https://notepad-plus-plus.org/ http://jingyan.baidu.com/article/ ...

  7. CodeFirst实战:用文本数据库存档软件配置

    背景: 以前要写软件的时候,在编写用户配置这一块时,由于存档数据库不靠谱或大题小作,所以一般是存在文本中. 一开始是一个文件保存一个配置(图个File.Read与File.Write的操作简单) 由于 ...

  8. Linux堆内存管理深入分析(下)

     Linux堆内存管理深入分析 (下半部) 作者@走位,阿里聚安全 0 前言回顾 在上一篇文章中(链接见文章底部),详细介绍了堆内存管理中涉及到的基本概念以及相互关系,同时也着重介绍了堆中chunk分 ...

  9. ABP理论学习之实体类

    返回总目录 本篇目录 实体类 惯例接口 审计 软删除 激活/未激活 IEntity接口 实体是DDD(领域驱动设计)的核心概念之一.Eirc Evans是这样描述的实体的:"它根本上不是通过 ...

  10. C语言 · 动态数组的使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...