HTTP协议详解

HTTP协议简介

HTTP超文本传输协议(HyperText Transfer Protocol,缩写HTTP)是用于服务器传输超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端和服务器模型。


HTTP协议概述

HTTP是一个客户端终端(用户)和服务端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网站爬虫或者其他工具。客户端发起了一个HTTP请求到服务器上的指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理服务器、网关或者隧道(tunnel)。
尽管TCP/IP协议是互联网最流行的应用,HTTP协议中,并没有规定必须使用它或支持它的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为传输层。

通常,由HTTP客户端发起一个请求,创建一个服务器指定端口(默认是80端口)的TCP连接,HTTP服务器则在80端口监听客户端的请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,比如请求的文件,错误消息,或者其他信息。


HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接

  1. 发送HTTP请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  1. 服务器接受请求并返回HTTP响应

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,发送到客户端,客户端进行读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

  1. 释放连接TCP连接

若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

TCP keepalive指的是TCP保活计时器(keepalive timer)。设想有这样的情况:客户已主动与服务器建立了TCP连接。但后来客户端的主机突然出故障。显然,服务器以后就不能再收到客户发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。
----摘自谢希仁《计算机网络》

  1. 客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏输入URL(www.baidu.com),按下回车之后会经历一下流程:

  • 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
  • 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接
  • 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
  • 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器
  • 释放 TCP连接
  • 浏览器将该 html 文本并显示内容

HTTP协议特点

  1. 传输效率高

无连接:交换HTTP报文前,不需要建立HTTP连接(仅支持在http1.0版本之前, http1.1之后引入维护长连接keep-alive)
无状态:数据传输过程中,不保存任何历史和状态信息
传输格式简单:请求时,只需要传输请求方法和路径

  1. 传输可靠性高

采用TCP作为传输层协议

  1. 兼容性好、灵活性高

支持B/S、C/S模式
HTTP允许传输任意类型的数据对象


HTTP请求

HTTP请求格式由三部分构成,请求行,请求头,空行 请求正文

在这里插入图片描述
下面是一段浏览器访问服务端请求消息内容

POST /agent/v2001/get/itf/stat HTTP/1.1
Host: 192.168.0.94:8888
Connection: keep-alive
Content-Length: 82
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36
Content-Type: application/json
Origin: http://192.168.0.94:8888
Referer: http://192.168.0.94:8888/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

{"ctrl_ver":"v2001","upper_type":"web","token":"c825916db593117a4cd655002e05af89"}

常见报文头的属性

字段说明示例
Accept可接收的响应内容类型Accept:text/plain (文本类型)
Accept-Charset可接收的字符集Accept-Charset: utf-8
Accept-Encoding可接收的响应内容的编码方式Accept-Encoding: gzip, deflate
Accept-Language可接受的响应内容语言列表Accept-Language: en-US
Accept-Datetime可接受的按照时间来表示的响应内容版本Accept-Datetime: Sat, 26 Dec 2020 16:30:00 GMT
AuthorizationHTTP协议中需要认证资源的认证信息Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
Cache-Control请求/回复中的,是否使用缓存机制Cache-Control: no-cache
Connection客户端想要优先使用的连接类型Connection: keep-alive Connection: Upgrade
Content-Length以8进制表示的请求体的长度Content-Length: 348
Content-Type请求体的MIME类型Content-Type: application/x-www-form-urlencoded
Date发送该消息的日期和时间Date: Dec, 26 Dec 2020 16:30:00 GMT
Expect表示客户端要求服务器做出特定的行为Expect: 100-continue
From发起此请求的用户的邮件地址From: user@baidu.com
If-Match主要用于PUT,实体匹配才可以操作If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd”
If-Modified-Since资源未被修改的情况下返回304未修改If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT
User-Agent浏览器的身份标识字符串User-Agent: Mozilla/
Upgrade要求服务器升级到一个高版本协议Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Via告诉服务器,这个请求是由哪个代理发出的Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1)
Referer表示跳转到当前页面的之前的页面Referer: http://www.baidu.com
Origin发起一个针对跨域资源共享的请求Origin: http://www.baidu.com

HTTP请求方法

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

1. GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问.

2. HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

3. POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

4. PUT
向指定资源位置上传其最新内容。

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

6. OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

7. DELETE
请求服务器删除Request-URI所标识的资源。

8. CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。


HTTP响应格式

HTTP响应是由四部分组成,分别是状态行, 消息报头,空行和响应正文。
在这里插入图片描述
在这里插入图片描述


HTTP状态码

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

详细状态码如下:

status codecontent
1xx指示信息–表示请求已接收,继续处理
100Continue
101Switching Protocols
2xx成功–表示请求已被成功接收,理解,接受
200OK
201Created
202Accepted
203Non-Authoritative Information
204No Content
205Reset Content
206Partial Content
3xx重定向–要完成请求必须进行更快一步操作
300Multiple Choices
301Moved Permanently
302Partial Content
303Found
304See Other
305Not Modified
307Temporary Redirect
4xx客户端错误–请求有语法错误或请求无法实现
400Bad Request
401Unauthorized
402Payment Required
403Forbidden
404Not Found
405Method Not Allowed
406Not Acceptable
407Proxy Authentication Required
408Request Time-out
409Conflict
410Gone
411Length Required
412Precondition Failed
413Request Entity Too Large
414Request-URI Too Large
415Unsupported Media Type
416Requested range not satisfiable
417Expectation Failed
5xx服务端错误–服务器未能实现合法请求
500Internal Server Error
501Not Implemented
502Bad Gateway
503Service Unavailable
504Gateway Time-out
505HTTP Version not supported

参考文档:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值