浅谈HTTP事务的一个过程

一个腾讯在职的朋友问道,当咱们在浏览器的地址栏输入 www.baidu.com ,而后回车,这一瞬间页面发生了什么?下面以谷歌浏览器一一解释.php

一.域名解析

首先Chrome浏览器会解析www.baidu.com 这个域名对应的IP地址。css

1 浏览器搜索自身的DNS缓存,看是否有www.baidu.com 对应的条目,若是有且没有过时则解析到此结束。html

2 若是没有找到对应的条目,那么Chrome会搜索操做系统自身的DNS缓存,若是找到且没过时则中止搜索解析到此结束.nginx

3 若是在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件,看有没有该域名对应的IP地址,若是有则解析成功。web

4 若是在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器发起域名解析请求,运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过时,则解析成功。后端

二.发起TCP的3次握手

拿到域名对应的IP地址后,User-Agent(通常是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序80端口发起TCP的链接请求。这个链接请求(原始的http请求通过TCP/IP4层模型的层层封包)到达服务器端后,进入到网卡,而后是进入到内核的TCP/IP协议栈,还有可能要通过Netfilter防火墙的过滤,最终到达WEB程序,创建了TCP/IP的链接。在TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接:浏览器

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;缓存

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;安全

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。服务器

握手过程当中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP链接一旦创建,在通讯双方中的任何一方主动关闭链接以前,TCP 链接都将被一直保持下去。断开链接时服务器和客户端都可以主动发起断开TCP链接的请求,断开过程须要通过“第四次握手”,就是服务器和客户端交互,最终肯定断开。

三.创建TCP链接后发起http请求

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网经常使用的协议之一,HTTP协议是创建在TCP协议之上的一种应用。HTTP链接最显著的特色是客户端发送的每次请求都须要服务器回送响应,在请求结束后,会主动释放链接。从创建链接到关闭链接的过程称为“一次链接”。

1)在HTTP 1.0中,客户端的每次请求都要求创建一次单独的链接,在处理完本次请求后,就自动释放链接。
2)在HTTP 1.1中则能够在一次链接中处理多个请求,而且多个请求能够重叠进行,不须要等待一个请求结束后再发送下一个请求。因为HTTP在每次请求结束后都会主动释放链接,所以HTTP链接是一种“短链接”,要保持客户端程序的在线状态,须要不断地向服务器发起链接求。一般 的作法是即时不须要得到任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持链接”的请求,服务器在收到该请求后对客户端进行回复,代表知道客户端“在线”。若服务器长时间没法收到客户端的请求,则认为客户端“下线”,若客户端长时间没法收到服务器的回复,则认为网络已经断开。

进过TCP3次握手以后,浏览器发起了http的请求,使用的http的方法 GET 方法,请求的URL是 / ,协议是HTTP/1.0。那么HTTP请求报文和响应报文会是什么格式呢?

起始行:如 GET / HTTP/1.0 (请求的方法、请求的URL 请求所使用的协议)

头部信息:User-Agent  Host等成对出现的值

主体

起始行中的请求方法有如下:

GET

GET是http的默认请求方式,通常用来获取数据,传输的数据通过url编码后放在路径?以后,多个键值对经过&链接,另外get的传输长度通常不推荐超过255个字节。

GET方法通常被视为安全方法, 由于它仅用来获取数据而不会对服务器有其余改动。像HEAD、GET、OPTIONS 和 TRACE这几种http方法是被认为是“安全的”,它们只会进行获取数据而不会修改服务器的状态,可用于记录日志、建立缓存或者建立其余统计信息。相反,像POST、PUT、DELETE 和 PATCH 等方法是有可能产生反作用。网络爬虫等通常不会使用这些方式

POST

POST通常用来上传文件或者提交一个完整的web表单。浏览器中提交表单时,这里与get相似,每一个键值对都是经过&分割, 其余非字母数字会进行url转码。

为何一些请求会使用POST提交数据?

  1. GET请求数据均可以在URL中看到
  2. GET提交的数据都会有长度限制
  3. 通常规范,POST用来修改数据,GET用来获取数据
  4. GET请求提交的数据放置在HTTP请求协议头中,而POST提交的数据放在实体数据中

其余请求方式

HEAD获取某个URI响应头信息,基本与GET相同可是不返回响应主体。

PUT经过提供的URI获取到特定的内容主体,若是存在则修改内容,若是不存在则建立。

DELETE经过URI删除指定内容

TRACE返回接受到的请求,用来查看数据通过中间服务器时发生了哪些变更

OPTIONS返回给定URL支持的全部HTTP方法

CONNECT要求使用SSL和TLS进行TCP通讯

PATCH请求修改局部数据

那什么是URLURIURN

URI  Uniform Resource Identifier 统一资源标识符

URL  Uniform Resource Locator 统一资源定位符

格式以下:  scheme://[username:password@]HOST:port/path/to/source

              http://www.magedu.com/downloads/nginx-1.5.tar.gz

URN  Uniform Resource Name 统一资源名称。URL和URN 都属于 URI。为了方便就把URL和URI暂时都通指一个东西

下面是Chrome发起的http请求报文头部信息:

Accept  就是告诉服务器端,我接受那些MIME类型

Accept-Encoding  这个看起来是接受那些压缩方式的文件

Accept-Lanague   告诉服务器可以发送哪些语言

Connection       告诉服务器支持keep-alive特性

Cookie           每次请求时都会携带上Cookie以方便服务器端识别是不是同一个客户端

Host             用来标识请求服务器上的那个虚拟主机,好比Nginx里面能够定义不少个虚拟主机.那这里就是用来标识要访问那个虚拟主机。

User-Agent       用户代理,通常状况是浏览器,也有其余类型,如:wget curl 搜索引擎的蜘蛛等 

条件请求首部:

If-Modified-Since 是浏览器向服务器端询问某个资源文件若是自从什么时间修改过,那么从新发给我,这样就保证服务器端资源.文件更新时,浏览器再次去请求,而不是使用缓存中的文件

安全请求首部:

Authorization: 客户端提供给服务器的认证信息;

什么是MIME

MIME(Multipurpose Internet Mail Extesions 多用途互联网邮件扩展)是一个互联网标准,它扩展了电子邮件标准,使其可以支持非ASCII字符、二进制格式附件等多种格式的邮件消息,这个标准被定义在RFC 204五、RFC 204六、RFC 204七、RFC 204八、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不容许在邮件消息中使用7位ASCII字符集之外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各类各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。

MIME 遵循如下格式:major/minor 主类型/次类型 例如:

image/jpg

image/gif

text/html

video/quicktime

appliation/x-httpd-php

四.服务器端响应http请求,浏览器获得html代码

服务器端WEB程序接收到http请求之后,就开始处理该请求,处理以后就返回给浏览器html文件。

1xx: 信息性状态码

     100, 101

2xx: 成功状态码

     200:OK

3xx: 重定向状态码

     301: 永久重定向, Location响应首部的值仍为当前URL,所以为隐藏重定向;

     302: 临时重定向,显式重定向, Location响应首部的值为新的URL

     304:Not Modified  未修改,好比本地缓存的资源文件和服务器上比较时,发现并无修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源便可。

4xx: 客户端错误状态码

     404: Not Found  请求的URL资源并不存在

5xx: 服务器端错误状态码

     500: Internal Server Error  服务器内部错误

     502: Bad Gateway  前面代理服务器联系不到后端的服务器时出现

     504:Gateway Timeout  这个是代理能联系到后端的服务器,可是后端的服务器在规定的时间内没有给代理服务器响应

用Chrome浏览器看到的响应头信息:

Connection            使用keep-alive特性

Content-Encoding      使用gzip方式对资源压缩

Content-type          MIME类型为html类型,字符集是 UTF-8

Date                  响应的日期

Server                使用的WEB服务器

Transfer-Encoding:chunked   分块传输编码 是http中的一种数据传输机制,容许HTTP由网页服务器发送给客户端应用(一般是网页浏览器)的数据能够分红多个部分,分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供

五. 浏览器解析html代码,并请求html代码中的资源

浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每一个浏览器的线程数不同),这个时候就用上keep-alive特性了,创建一次HTTP链接,能够请求多个资源,下载资源的顺序就是按照代码里的顺序,可是因为每一个资源大小不同,而浏览器又多线程请求请求资源,顺序并不必定是代码里面的顺序。

浏览器在请求静态资源时(在未过时的状况下),向服务器端发起一个http请求(询问自从上一次修改时间到如今有没有对资源进行修改),若是服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。

六.浏览器对页面进行渲染呈现给用户

最后,浏览器把请求到的静态资源和html代码进行渲染,呈现给用户。

总结

域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户

相关文章
相关标签/搜索