你不得不知道HTTP协议基础

HTTP(HyperText Transfer Protocol),超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP协议工作于客户端-服务端(C/S)架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。而HTTP就是浏览器和服务器之间的传输协议,也就是服务器与浏览器之间相互通信所遵守的规则。

HTTP客户端是一个应用程序(Web浏览器或其他任何客户端),通过向服务器发送请求来工作。

HTTP服务端也是一个应用程序(通常是一个Web服务器,如Apache Web、IIS、Nginx、Lighttpd、Zeus、Sun、Resin、Jetty、BEA WebLogic、Tomcat等),通过接收客户端发来的请求并作出响应来工作。

HTML是一种用来定义网页的文本,会HTML,就可以编写网页;

HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

1. URL和HTTP的工作原理

1.1 什么是URL

URL(Uniform Resource Locator) 地址用于描述一个网络上的资源, 基本格式如下:

schema://host[:port#]/path/.../[?query-string][#anchor]
  • scheme - 指定低层使用的协议(例如:http, https, ftp)

  • host - HTTP服务器的IP地址或者域名

  • port# - HTTP服务器的默认端口是80(可以省略)。如果使用了别的端口(如8080),必须指明。

  • path - 访问资源的路径

  • query-string - 发送给http服务器的数据

  • anchor - 锚

举一个栗子: 

https://baike.baidu.com/item/http/243074?fromtitle=http#2
  • scheme - https

  • host - baike.baidu.com

  • path - /item/http/243074

  • query-string - fromtitle=http

  • anchor - 2 

1.2 HTTP是如何工作的

当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。实际上是在输入URL后,浏览器给Web服务器发送了一个Request,Web服务器接到Request后进行处理,生成相应的Response,然后返回给浏览器,浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示:

Request有可能是经过了代理服务器,最后才到达Web服务器的。过程如下图所示:

Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response)。这就是Http的工作原理。

2. 如何使用Chrome调试工具

Chrome提供了一套完整地调试工具,非常适合Web开发,用来调试Web应用。打开Chrome,在菜单中选择视图 >> 开发者 >> 开发者工具,就可以显示开发者工具:

Elements显示网页的结构,Network显示浏览器和服务器的通信。点击Network,确保第一个小红灯亮着,Chrome就会记录所有浏览器和服务器之间的通信。 当我们在地址栏输入http://www.163.com/时,浏览器将显示网易的首页。在这个过程中,浏览器都干了哪些事情呢?通过Network的记录,我们就可以知道。

2.1 HTTP Request

在Network中,定位到第一条记录,点击,右侧将显示Request Headers,点击右侧的view source,我们就可以看到浏览器发给网易服务器的请求:

我们来对该Request的信息一一解释一下。

GET / HTTP/1.1

GET表示一个读取请求,将从服务器获得网页数据, / 表示URL的路径,URL总是以 / 开头, / 就表示首页,最后的HTTP/1.1指示采用的HTTP协议版本是1.1。

从第二行开始,每一行都类似于Xxx: abcdefg的结构,即Heather。

Host: www.163.com

表示请求的域名是www.163.com。如果一台服务器有多个网站,服务器就需要通过Host来区分浏览器请求的是哪个网站。

Connection: keep-alive

HTTP/1.0主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样相应这个字段。

Cache-Control: max-age=0

Cache-Control用来指定Response-Request遵循的缓存机制。各个指令含义如下

  • Cache-Control: Public - 可以被任何缓存所缓存()

  • Cache-Control: Private - 内容只缓存到私有缓存中

  • Cache-Control: no-cache - 所有内容都不会被缓存

  • Cache-Control: max-age=0 - 如果值为max-age,则在过期之前不会重复访问。max-age=0,其作用和no-cache类似。

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36

User-Agent描述客户端信息,告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accep告诉服务器,浏览器端可以接受数据类型。如果服务器无法返回对应类型的数据,服务器应该返回一个406错误(non acceptable)。通配符 * 代表任意类型。

Accept-Encoding: gzip, deflate

浏览器申明自己接收的压缩方法(gzip,deflate)。

Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4

浏览器申明自己接收的字符集。

2.2 HTTP Response

同理,点击Response Headers,点击右侧的view source,显示服务器返回的数据:

HTTP/1.1 200 OK

这一行是”协议版本 + 状态码(status code) + 状态描述”。200表示一个成功的响应,后面的OK是说明。失败的响应有404 Not Found:网页不存在,500 Internal Server Error:服务器内部出错,等等。后面我们会详细说明。

Expires: Sun, 08 Oct 2017 07:45:16 GMT

Expires表示应该在什么时候认为文档已经过期而不再缓存它?

Date: Sun, 08 Oct 2017 07:43:56 GMT

当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

Server:nginx

Server表示服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

Content-Type: text/html; charset=GBK

服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。常见的Content-Type字段的值如下:

  • text/plain

  • text/html

  • text/css

  • image/jpeg

  • image/png

  • image/svg+xml

  • audio/mp4

  • video/mp4

  • application/javascript

  • application/pdf

  • application/zip

  • application/atom+xml

这些数据类型总称为MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔。MIME type还可以在尾部使用分号,添加参数。例如:

Content-Type: text/html; charset=utf-8

以上Content-Type表明,发送的是网页,而且编码是UTF-8。

Transfer-Encoding: chunked

只要请求或回应的头信息有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,就表示本次回应的数据发送完了。

Content-Encoding: gzip

文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader(“Accept-Encoding”))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

3. HTTP消息结构

3.1 HTTP Request的消息格式

每个HTTP请求都遵循相同的格式:消息分为3部分:

  • 第一部分叫Request line:用来说明请求类型,要访问的资源以及所使用的HTTP版本。

  • 第二部分叫Request header:紧接着请求行后的部分,用来说明服务器要使用的附加信息。

  • 第三部分是Request body:请求数据也叫主体,可以添加任意的其他数据。有些请求Body为空。

Method /path HTTP/version 
Header1: Value1 
Header2: Value2 
Header3: Value3 

Optional Request Body

注意:header和body之间有个空行。Method表示请求方法,比如”POST”,”GET”。HTTP/version表示HTTP协议的版本号。


3.2 HTTP Response的消息格式

Response消息的结构和Request消息的结构基本一样。 同样也分为三部分:

  • 第一部分是Response line:即状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

  • 第二部分是Response header:也就是消息报头,用来说明客户端要使用的一些附加信息。

  • 第三部分是Response Body: 服务器返回给客户端的结果。

HTTP/version StatusCode StatusMessage
Header1: Value1 
Header2: Value2 
Header3: Value3 

Optional Response Body

4. HTTP Request常见方法

根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

5. HTTP Response常见状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

以下是些常用的状态码:

200 OK - 客户端请求成功。一般用于GET与POST请求
400 Bad Request - 客户端请求的语法错误,服务器无法理解
401 Unauthorized - 请求要求用户的身份认证,该状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden - 服务器收到请求,但是拒绝提供服务
404 Not Found - 服务器无法根据客户端的请求找到资源(网页),eg:输入了错误的URL。
408 Request Time-out - 服务器等待客户端发送的请求时间过长,超时
409 Conflict - 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
500 Internal Server Error - 服务器发生不可预期的错误
502 Bad Gateway - 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
505 HTTP Version not supported - 服务器不支持请求的HTTP协议的版本,无法完成处理

 

别浪费时间了,快来关注【七姑娘日记】吧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值