一篇文章带你了解HTTP

HTTP协议简介

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP),用于从万维网服务器传输超文本到本地浏览器的传送协议

HTTP是一种基于TCP/IP通信协议来传递数据(HTML 文件、图片文件、查询结果等)

HTTP工作原理

HTTP协议工作在于客户端-服务端架构上。

浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求

Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等

Web服务器根据接收到的请求,向客户端发送响应信息

HTTP默认端口为80

HTTP协议特点

客户端/服务端

HTTP是基于客户端/服务端(C/S)的架构模型,浏览器作为客户端访问服务端

无连接

​ 无连接的含义是限制每次连接只处理一个请求。

​ 服务器处理完客户端的请求,并收到客户端的应答后,即断开连接

​ 采用这种方式可以节省传输时间

无状态

​ HTTP是无状态协议

无状态是指协议对于事务处理没有记忆能里

​ 缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

单向性

服务端永远被动等待客户端的请求

灵活

​ HTTP允许传输任意类型数据对象

​ 传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识) 来标识

HTTP协议版本

  • HTTP 1.0

  • HTTP 1.1

  • HTTP 2.0

HTTP 1.0

​ 服务器不跟踪每个客户端也不记录过去的请求(无状态)

​ 请求只能由客户端发起(单向性)

​ HTTP/1.0中默认使用Connection: close

HTTP 1.1

​ HTTP/1.1中已经默认使用Connection: keep-alive(长连接

​ 避免了连接建立和释放的开销,但服务器必须按照客户端的先后依次顺序回送响应的结果

​ 以保证客户端能够区分出每次请求响应的内容

​ 1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”

​ HTTP1.1默认使用长连接,可有效减少TCP的三次握手开销。

HTTP 2.0

  • 多路复用
  • 头部压缩
  • 服务端推送
  • 更安全

多路复用

​ 在HTTP1.0中,当页面需要请求很多资源是,队头阻塞(Head of line blocking)会导致在

达到最大请求时,资源需要等待其他资源请求完成后才能继续发送

​ 多路复用,连接共享。不同Request可以使用一个连接传输,根据每个Request上的id好组合成正常的请求

Header压缩

​ HTTP 1.1中Header带有大量信息,并且的重复传输

​ HTTP 2.0使用Encoder(编码器)来减少需要传输的Herder大小

更安全

  • HTTP2.0使用了TLS的拓展ALPN做为协议升级

  • TLS(安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性)

  • 除此之外,HTTP2.0对tls的安全性做了近一步加强,通过黑名单机制禁用了几百种不再安全的加密算法

服务器Push(推送)

  • 在HTTP2.0中,服务端可以在客户端某个请求后,主动推送其他资源

    可以想象一下,某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,就可以相对减少一点延迟时间

URI、URL、URN

URI(Uniform Resource Identifier),统一资源标识符,用于表示某一互联网资源名称字符串

例如: /image/logo.gif

URI 包含URL、URN

URL(Uniform Resource Location)统一资源定位符,可以帮助我们唯一定位互联网上的某一个资源,相当于是互联网资源的身份证号,用于在网络中传播和访问互联网资源的一个地址,一个标准的URL必须包括:

  • 协议(Protocol)
  • 存放资源的主句或域名(Host)
  • 端口号(Prot)
  • 资源文件名(Path)
  • 参数(Parameter)
  • 锚点(Anchor)可选 跳转页面某个位置

例如 http://www.liyushen.com.cn

URN(Uniform Resource Name)统一资源名称,其目的是通过提供一种途径,用于在特定的命名空间资源的标识,以补充网址。

URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式

例如: bitpoetry.io/posts/hello.html#intro

HTTP消息结构

HTTP Request (请求信息)

Request 消息分为3部分:

​ 第一部分:Request Line

​ 第二部分:Request Headers

​ 第三部分:Request body

Request Line(请求行)

GET /hello.txt HTTP/1.1

Request Headers(请求头)
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
响应字段描述
Host客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号
Connection连接方式 如果值是close则表示基于短连接方式,如果该值是keep-alive,网络连接就是持久的,在一定时间范围内是不会关闭
Upgrade-Insecure-Requests服务端是否支持https加密协议。
Cache-Control指定请求和响应遵循的缓存机制
User-Agent浏览器表明自己的身份(是哪种浏览器)
Accept告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型。
Accept-Encoding浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
Accept-Language浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等。
Accept-Charset浏览器告诉服务器自己能接收的字符集
Referer浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL
Refresh表示浏览器应该在多少时间之后刷新文档,以秒计时
Cookie可向服务端传递数据一种模型
Request body(请求体)

客户端向服务器发送数据。比如:表单使用POST方式提交数据,上传的文件数据

HTTP Response (响应信息)

Response 消息分为3部分:

​ 第一部分:Response Line

​ 第二部分:Response Headers

​ 第三部分:Response body

Response Line
HTTP/1.1 200 OK
Response Headers
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
响应头字段描述
Date响应的Date使用的是GMT时间格式,表示响应消息送达时间
Server服务器通过这个Server告诉浏览器服务器的类型。
Vary客户端缓存机制或者是缓存服务器在做缓存操作的时候,会使用到Vary头,会读取响应头中的Vary的内容,进行一些缓存的判断
Content-Encoding文档的编码(Encode)方式。用gzip压缩文档能够显著地减少HTML文档的响应时间
Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据
Content-Type用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件 表示响应的文档属于什么MIME类型。
Response body(响应体)

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码

HTTP状态码(HTTP Status Code)

当访问一个网页时,浏览器会向网页所在服务器发出请求。

浏览器接收并显示网页前,此网页所在服务器会返回一个HTTP状态码,用以响应浏览器的请求

常见HTTP状态:

  • 200 请求成功

  • 301 资源(网页等 )被永久转移到其他URL

  • 404 请求的资源(网页等)不存在

  • 500 内部服务器错误

HTTP状态码分类

HTTP状态码共分为5种类型:

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

HTTP请求方法

GET

GET请求指定页面信息

  • GET请求中会将请求中床的数据包含在URL中并在也浏览器的地址栏中显示。
  • GET请求传递数据时要求数据必须时ASCLL字符

  • GET请求可以被浏览器缓存

POST

POST 向指定资源提交数据,请求服务器处理

  • POST请求数据包含在请求体中
  • POST请求传递数据时,数据可以试试ASCII字符也可以是字节型数据,默认为字符型
  • POST请求默认情况下不会浏览器所缓存

注意

​ POST请求可能会导致新的资源的建立/或已有资源的修改

HEAD

获取报文首部

HEAD与GET请求相一致的响应,只不过响应体将不会被返回,用于获取报头

PUT

向指定资源位置上传最新内容

PATCH

是对 PUT 方法的补充,用来对已知资源进行局部更新

TRACE

回显服务器收到的请求,主要用于测试或诊断

DELETE

请求服务器删除指定的页面

OPTIONS

允许客户端查看服务器性能

CONNECT

要求在与代理服务器通信时建立隧道,通常用于SSL加密服务器

重点:GET和POST的区别

GET用于获取资源,而POST用于传输实体主体

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留

GET产生的URL地址可以被Bookmark(书签标记),而POST不可以

缓存

  • GET请求会被浏览器缓存
  • POST请求不会被浏览器缓存,除非浏览器手动设置

编码方式

  • GET请求只支持URL编码
  • POST支持多种编码方式

参数长度

  • GET请求在URL中传送的参数是有长度限制的
  • POST请求参数不会有长度限制

数据类型

  • GET只接受ASCII字符
  • POST即是字符也可以是字节

重复提交

  • GET在浏览器回退时是不会在提交
  • GET在浏览器回退时POST会再次提交

安全性

  • GET安全性比POST低,因为参数直接暴露在URL中,不能用来传递敏感信息

传递方式

  • GET参数通过URL传递
  • POST参数放在Request body(请求体中)传递

GET产生的URL地址可以被Bookmark(书签标记),而POST不可以

缓存

  • GET请求会被浏览器缓存
  • POST请求不会被浏览器缓存,除非浏览器手动设置

编码方式

  • GET请求只支持URL编码
  • POST支持多种编码方式

参数长度

  • GET请求在URL中传送的参数是有长度限制的
  • POST请求参数不会有长度限制

数据类型

  • GET只接受ASCII字符
  • POST即是字符也可以是字节

重复提交

  • GET在浏览器回退时是不会在提交
  • GET在浏览器回退时POST会再次提交

安全性

  • GET安全性比POST低,因为参数直接暴露在URL中,不能用来传递敏感信息

传递方式

  • GET参数通过URL传递
  • POST参数放在Request body(请求体中)传递
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值