一、浏览器访问服务器的过程

      当浏览器输入网址后,会在本地找对应的域名,找到的话,把IP地址返回,若找不到,就把这个网址放到DNS(Domain Name System域名解析系统)中去找解析,找到对应的IP地址后,返回给浏览器,然后再把这个IP地址发送到远程服务器,服务器服务器会返回HTML标记给浏览器,浏览器负责渲染展现出来,DNS再找不到的话,就会报错,无法发送IP地址给服务器,自然得不到想要的资源了。下面用两张图为相应的流程:

 

二、HTTP概念

      超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

  HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。

      超文本传输协议是一种应用层协议。

  1. 链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡.

  2. 网络层:处理分组在网络中的活动,比如分组的选路.

  3. 运输层:主要为两台主机上的应用提供端到端的通信.

  4. 应用层:负责处理特定的应用程序细节.

 三、HTTP请求报文格式

    3.1 使用谷歌/火狐浏览器 开发者工具来分析通信过程和格式

  

      这里介绍 谷歌开发者工具使用

      windows和Linux平台按F12调出开发者工具, MAC选择 视图 -> 开发者工具。

      在 web 应用中, 服务器把网页传给浏览器, 实际就是把网页的 HTML 代码发送给浏览器, 浏览器解析显示出来. 而浏览器和服务器之间的传输应用层协议就是 HTTP. 所以:

  • HTML 是一种用来定义网页的文本, 会 HTML 就可以编写网页.
  • HTTP 是用来在网络上传输 HTML 文本的协议, 用于浏览器和服务器的通信.

      Chrome 浏览器提供了一套完成的开发者工具, 很适合 web 开发者. 

                                                     ( 打开开发者工具)

                                                                           (开发者工具界面)

  • 元素(Elements):用于查看或修改HTML元素的属性、CSS属性、监听事件、断点等.
  • 控制台(Console):控制台一般用于执行一次性代码, 查看JavaScript对象, 查看调试日志信息或异常信息.
  • 源代码(Sources):该页面用于查看页面的HTML文件源代码、JavaScript源代码、CSS源代码, 此外最重要的是可以调试JavaScript源代码, 可以给JS代码添加断点等.
  • 网络(Network):网络页面主要用于查看 header 等与网络连接相关的信息.

      注意: Network 中的每一项就是一次请求/响应过程, 点击每一项, 可查看本次请求响应的报文信息.

    3.2 请求报文格式

      3.2.1 请求报文的协议格式

     

Request Headers 中就是请求的报文数据内容. 下面就是我们要请求的报文示例数据:

GET / HTTP/1.1
Host: localhost:10000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7

就是浏览器向服务器请求数据时候的格式

      http请求又包含了四个部分:

  1. 请求行(request-line)
  2. 请求头(request-header)
  3. 空行
  4. 请求数据(request-content),也叫作请求内容或者请求主体

 

3.2.2 请求行

    请求行又可以分成三个部分:

    请求方式 请求路径 协议版本

     其中,GET就是请求方式(还有post请求方式),/model/list_father.php就是请求路径,HTTP/1.1就是协议版本号

     需要注意的几点:

     1, 请求行需要单独的占一行,用来说明当前请求的最基本的信息

     2, 请求路径是不包括域名的

     3, HTTP协议以前是1.0版本,现在是1.1版本

 

3.2.3 请求头

    请求头就是所有当前需要用到的协议项的集合!

    协议项就是浏览器在请求服务器的时候事先告诉服务器的一些信息,或者一些事先的约定!

    常见的请求头有:

    host: 当前url中所要请求的服务器的主机名(域名)

    

      accept-encoding:是浏览器发给服务器,声明浏览器支持的压缩编码类型 比如gzip

    accept_charset:表示,浏览器支持的字符集

    referer:表示,此次请求来自哪个网址

 

    accept-language:可以接收的语言类型,cn,en,有权重的高低之分

cookie:如果之前当前请求的服务器在浏览器端设置了数据(cookie),那么当前浏览器再次请求该服务器的时候,就会把对应的数据带过去

3.2.4 空行

    就是用来分离请求头和请求数据,意思就是请求头到此结束!(注意:空行是必须存在的,不能省略)

3.2.5 请求数据

    只有post方式提交的时候,才有请求数据!

 请求报文格式总结:

3.3 HTTP响应报文协议格式

也就是服务器向浏览器作出响应(反馈数据)时候的协议!

http响应也分成了四个部分:

  1. 响应行(状态行)

  2. 响应头

  3. 空行

  4. 响应主体(响应数据)

如何使用开发者工具查看请求报文, 以请求 Baidu.com 为例:

 

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 14 Mar 2018 09:52:48 GMT
Server: BWS/1.1

3.3.1 响应行

    第一行 HTTP/1.1 200 OK 叫做响应行, 共分成3部分:协议版本号 状态码 状态描述

比如:

HTTP/1.1 200 OK

注意:

状态码和状态描述是一一对应的!

常见的状态码:

3.3.2  响应头

也是一些协议的集合,也是

协议名:值 的形式!

常见的有:

server:服务器主机信息

3.3.3 空行

     用来分割响应头与响应主体,也就是响应头到此结束!

3.3.4 响应数据

就是服务器反馈给浏览器的数据!

响应报文总结

四、长连接和短连接

在HTTP/1.0中, 默认使用的是短连接.也就是说, 浏览器和服务器每进行一次HTTP操作, 就建立一次连接, 但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的 Web 页中包含有其他的Web资源,如js文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:

Connection:keep-alive

在真正的读写操作之前,server与client之间必须建立一个连接,

当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

连接的建立通过三次握手,释放则需要四次握手,

所以说每个连接的建立都是需要资源消耗和时间消耗的。

TCP短连接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

 TCP长连接通信过程

  1. client 向 server 发起连接

  2. server 接到请求,双方建立连接

  3. client 向 server 发送消息

  4. server 回应 client

  5. 一次读写完成,连接不关闭

  6. 后续读写操作…

  7. 长时间操作之后client发起关闭请求

TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,节约时间。但是如果用户量太大容易造成服务器负载过高最终导致服务不可用
  • 短连接对于服务器来说实现起来较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但是如果用户访问量很大, 往往可能在很短时间内需要创建大量的连接,造成服务器响应速度过慢

总结:

  • 小的WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源来让套接字 保持存活-keep alive

  • 对于中大型WEB网站一般都采用长连接,好处是响应用户请求的时间更短,用户体验更好,虽然更耗硬件资源一些,但这都不是事儿。另外,数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

和格式

 

版权声明:本文为yu110812原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yu110812/p/9491795.html