HTTP协议入门知识整理
本文最后更新于 115 天前,其中的信息可能已经有所发展或是发生改变。

基本概念

什么是HTTP?

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个用于传输超媒体文档(例如 HTML等)的协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。

特点:

  1. 该协建立在TCP连接上,位于应用层。
  2. HTTP 遵循经典的客户端-服务端模型。
  3. HTTP 是无状态协议。
  4. HTTP是无连接协议。
  5. 简单快速,客户向服务器请求服务时,只需传送请求方法和路径。
  6. 灵活:HTTP允许传输任意类型的数据对象,可以传输文本,声音,图像等等。正在传输的类型由Content-Type加以标记。

注:客户端-服务端模型:服务端一直保持开启,被动的等待客户端连接。客户端发送一个请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后发送响应把结果返回给客户端。客户端没有连接服务端之前,服务端无法向客户端主动传输数据,因为不知道客户端的IP地址。

无状态协议:为了提高Web服务器对并发访问的处理能力,在设计HTTP协议时规定Web服务器发送HTTP应答报文和文档时,不保存发出请求的Web浏览器进程的任何状态信息。这意味着服务器不会在两个请求之间保留任何数据(即状态)想要保存状态就要靠cookie session等手段维持状态。

无连接协议:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。但后期从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,长时间没有数据传输两端都可以关闭连接。

HTTP是明文传输的,默认的端口号是80,备用端口号是8080。

HTTPS是加密传输的,默认端口号是443,备用端口号是8443。

常用的HTTP服务器:Nginx、Apache、IIS等。

HTTP的制定与历史

HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的意见稿,也就是协议。

HTTP/0.9

已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。

HTTP/1.0

这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用。

HTTP/1.1

持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。主要改进了:

  • 缓存处理
  • 带宽优化及网络连接的使用
  • 错误通知的管理
  • 消息在网络中的发送
  • 互联网地址的维护
  • 安全性及完整性

HTTP/2

当前版本,于2015年5月作为互联网标准正式发布。改进了压缩算法,提高了加载速度添加了一些新的功能,如服务端推送,多路复用等。

(这个了解一下就可以)

URL统一资源定位符

统一资源定位符URL(Uniform Resource Locater)是用来表示互联网上得到的资源位置和访问这些资源的方法。互联网上的资源只有一个唯一确定的URL。

URL的构成:

<协议>://<主机>:<端口号>/<路径>

https://youth.sdut.edu.cn/2020/0330/c7063a376940/page.htm

一个完整的URL包括以下几部分:

  1. 协议部分:URL的协议部分为“https:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符
  2. 域名(主机)部分:URL的域名部分为“youth.sdut.edu.cn”。一个URL中,也可以使用IP地址作为域名使用。
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口
  4. 路径部分:存放文件的位置。

HTTP请求

接收和发送请求

如何发送和接收HTTP请求呢?HTTP请求大致操作过程:

  1. 解析主机的IP地址。将s机域名发送给DNS服务器,获得主机的IP地址,这样才能建立TCP连接。(请自行了解 DNS)
  2. 建立TCP连接。HTTP 是基于 TCP 协议的,当然是要先建立 TCP 连接。建立TCP先要进行三次握手,这里我们不讨论TCP连接是如何建立的,可以把TCP想象成通道。
  3. 建立连接后,客户端发送请求报文(Request),请求中包含请求的方式,URL,协议版本号,useragent,cookies等。请求分三部分,请求行(Request line),请求头(http header)和请求体(body)。第一行是请求行,包含http请求方式,请求的路径,http协议版本。

请求

  1. 服务器受到客户端发来的请求,对客户端发来的信息进行处理,并发送给客户端回应(Response)。Response也是分成同样的三部分,请求行(Request line),请求头(http header)和请求体(body)。其中的请求行包含协议版本,状态码,message。

回应

  1. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。
  2. 断开TCP连接。

请求方法

HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:

  • GET – 向特定的资源发出请求。
  • POST – 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • OPTIONS – 请求一些选项的信息。
  • HEAD- 请求读取由URL标志信息的首部。
  • PUT – 向指定资源位置上传其最新内容。
  • DELETE – 请求服务器删除Request-URI所标识的资源。
  • TRACE- 回显服务器收到的请求,主要用于环回测试或诊断。
  • CONNECT – HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • PATCH – 用来将局部修改应用于某一资源,添加于规范RFC5789。
    方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。

GET和POST的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。
  2. GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
  3. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

HTTP状态码

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

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

常见状态码:

状态码 状态码英文名称 中文描述
200 OK 请求成功。一般用于GET与POST请求
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
500 Internal Server Error 服务器内部错误,无法完成请求
502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求

常见请求头

request header

Host
用法:Host: youth.sdut.edu.cn

作用: 主要用于指定被请求资源的Internet主机和端口号,它通常是从HTTP URL中提取出来的

Connection
Connection: keep-alive: 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

Connection: close: 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接

Accept
用法:Accept: /,Accept: text/html

作用: 浏览器端可以接受的媒体类型;
Accept: / 代表浏览器可以处理所有回发的类型,(一般浏览器发给服务器都是发这个)

Accept-Language
用法:Accept-Language: en-us

作用: 浏览器申明自己接收的语言。

User-Agent

用法: User-Agent: Mozilla/4.0……

作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

Cookie

用法:

Cookie: bdshare_firstime=1439081296143; ASP.NET_SessionId=rcqayd4ufldcke0wkbm1vhxb; pgv_pvi=7361416192; pgv_si=s6686106624; ce.sysu.edu.cn80.ASPXAUTH=9E099592DD5A414BEECD8CF43CFC71664

作用: 最重要的header, 将cookie的值发送给HTTP 服务器

Referer

用法:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

response header

Allow

作用:服务器支持哪些请求方法(如GET、POST等)。

Set-Cookie
用法:
Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

作用:非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.

Content-Encoding
用法:Content-Encoding:gzip

作用:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。

跨域请求 CROS

在 HTML 中,<a> <img> <link> 等标签以及 Ajax 请求都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。

这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

因为安全问题,为防止跨站请求伪造(CSRF)攻击,浏览器通常会对跨域请求做出限制。

举例

a.example.com对于:

a.example.com/api/index.php 不是跨域请求

b.example.com 跨域请求

example.com 跨域请求


如果a.example.com 需要向b.example.com请求的话,这种请求就属于跨域请求。如果在b.example.com返回回来的响应头文件里有允许进行跨域访问的Header,那么就能进行正常请求,否则就不能。

Access-Control-Allow-Origin

响应首部中可以携带这个头部表示服务器允许哪些域可以访问该资源,其语法如下:

Access-Control-Allow-Origin: <origin> | *

其中,origin 参数的值指定了允许访问该资源的外域 URI。对于不需要携带身份凭证的请求,服务器可以指定该字段的值为通配符,表示允许来自所有域的请求。

Access-Control-Allow-Methods

该首部字段用于预检请求的响应,指明实际请求所允许使用的HTTP方法。其语法如下:

Access-Control-Allow-Methods: <method>[, <method>]*

Access-Control-Allow-Headers

该首部字段用于预检请求的响应。指明了实际请求中允许携带的首部字段。其语法如下:

Access-Control-Allow-Headers: <field-name>[, <field-name>]*

HTTPS

超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议

HTTP 协议直接使用了 TCP 协议进行数据传输。由于数据没有加密,都是直接明文传输,所以存在以下三个风险:

  1. 窃听风险:第三方节点可以获知通信内容。
  2. 篡改风险:第三方节点可以修改通信内容。
  3. 冒充风险:第三方节点可以冒充他人身份参与通信。

比如你在手机上打开应用内的网页时,有时会看到网页底部弹出了广告,这实际上就说明你的 HTTP 内容被窃听、并篡改了。HTTPS 协议旨在解决以上三个风险,因此它可以:

  1. 保证所有信息加密传输,无法被第三方窃取。
  2. 为信息添加校验机制,如果被第三方恶意破坏,可以检测出来。
  3. 配备身份证书,防止第三方伪装参与通信。

HTTPS使用非对称加密,非对称加密会有一对秘钥:公钥私钥。 公钥加密的内容,只有私钥可以解开,私钥加密的内容,所有的公钥都可以解开(当然是指和秘钥是一对的公钥)。使用 HTTPS 时,服务端会将自己的证书发送给客户端,其中包含了服务端的公钥。基于非对称加密的传输过程如下:

  1. 客户端使用公钥将信息加密,密文发送给服务端
  2. 服务端用自己的私钥解密,再将返回数据用私钥加密发回客户端
  3. 客户端用公钥解密

这里的证书是服务器证明自己身份的工具,它由权威的证书颁发机构(CA)发给申请者。如果证书是虚假的,或者是自己给自己颁发的证书,服务器就会不认可这个证书并发出警告。

参考资料

HTTP概述 – HTTP | MDN

HTTP 教程 | 菜鸟教程

一篇比较全的HTTP协议详解

HTTP协议详解-比小白大一点的大白的博客-51CTO博客

跨域请求中遇到的问题解决记录

【网络基础知识6】 — HTTP 与 HTTPS 简介 – 简书

看图学HTTPS – 掘金

暂无评论

发送评论 编辑评论


上一篇
下一篇