HTTP协议详解:从零开始的Web通信之旅

一、引言:Web通信的基石 - HTTP协议

HTTP是超文本传输协议,其定义了客户端和服务器端之间的文件传输规范,HTTP默认使用80端口,这个端口是指服务器端的端口,客户端使用的端口是动态分配的。当我们没有指定端口访问的时候,浏览器会默认帮我们添加80端口。我们也可以自己制定访问的端口比如:http://www.ip138.com:80

需要注意的是,现在大多数访问都使用了HTTPS协议,而HTTPS的默认端口是443,如果使用80端口访问HTTPS协议的服务器可能会被拒绝

二、HTTP请求方法

2.1 OPTIONS

功能: 返回服务器针对特定资源所支持的 HTTP 请求方法。

用途: 可以通过向 Web 服务器发送 ‘*’ 请求来测试服务器的功能性。OPTIONS 请求有助于确定服务器允许哪些请求方法,并有助于预检 CORS 请求。

2.2 HEAD

功能: 向服务器请求与 GET 请求相一致的响应,只不过响应体不会被返回。

用途: 这一方法可以在不必传输整个响应内容的情况下,获取包含在响应消息中的元信息,非常适合用于验证链接的有效性或检查网页是否更新。

2.3 GET

功能: 向特定资源发起请求。

注意: GET 方法不应当用于产生副作用的操作中,例如在 Web 应用程序中,因为 GET 请求可能会被网络蜘蛛等随意访问。LoadRunner 中对应的 GET 请求函数有:web_submit 和 web_url。

2.4 POST

功能: 向指定资源提交数据进行处理请求(例如提交表单或上传文件)。数据被包含在请求体中。

用途: POST 请求可能会导致新资源的建立或已有资源的修改。LoadRunner 中对应的 POST 请求函数有:web_submit_data 和 web_submit_form。

2.5 PUT

功能: 向指定资源位置上传输其最新的内容。

用途: 通常用于更新资源的整个内容,如果资源不存在,则创建新的资源。

2.6 DELETE

功能: 向服务器删除 Request-URL 所标识的资源。

用途: 请求服务器删除指定的资源,适用于需要删除资源的场景。

2.7 TRACE

功能: 回显服务器收到的请求。

用途: 主要用于测试和诊断,查看请求在传输过程中是否被修改。

2.8 CONNECT

功能: HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。

用途: 主要用于建立隧道协议,如用于 SSL 加密的 HTTP 代理。

通过了解和正确使用这些 HTTP 请求方法,可以更有效地进行 Web 开发和服务器通信,从而提高应用程序的性能和安全性。

2.9 注意

  1. 方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识和或者不支持对应的请求方法时,应返回状态码501(Not Implemented)
  2. HTTP 服务器应该至少实现GET HEAD POST方法,其他方法是可选的,此外除了上述的方法之外,特定的HTTP服务器支持扩展自定义的方法。

三、HTTP工作原理

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

四、HTTP 请求/响应流程

客户端连接到web服务器 -》 发送HTTP请求 -》服务器接受请求并返回HTTP响应 -》 释放连接TCP连接 -》 客户端浏览器解析HTML内容

4.1、客户端连接到web服务器

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

4.2、发送HTTP请求

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

4.3、服务器接受请求并返回HTTP响应

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

4.4、释放连接TCP连接

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

4.5、客户端浏览器解析HTML内容

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

五、HTTP报文结构

客户端发送一个HTTP请求到服务器的请求消息包括以下格式
请求行(request line) 、请求头部(header)、空行、请求数据四个部分组成
在这里插入图片描述

5.1 状态行

第一部分:请求行以一个方法符号开头、以空格分开、最后跟着请求的url和协议的版本

5.2 请求头部

第二部分:从第二行起为请求头部,HOST将指出请求的目的地。User-Agent服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础、该信息由你的浏览器来定义,并且在每个请求中自动发送等等

5.3 空行

第三部分:空行、请求头部后面的空行是必须的

即使第四部分的请求数据为空,也必须要有空行

5.4 请求数据

第四部分:请求数据也叫主体,可以添加任意的其他数据。

六、HTTP响应状态码

6.1信息响应

100 Continue

这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它

101 Switching Protocols

该代码是响应客户端的Upgrade 请求头发送到阿,指明服务器即将切换到协议

102 Processing

此代码表示服务器已收到并正在处理该请求,但是没有响应可用

103 Early Hints

此代码主要用于与Link链接头一起使用,允许用户代理在服务器准备响应阶段时开始预加载 Preloading 资源

6.2成功响应

200 OK

当你的操作将在响应正文中返回数据时,出现此结果

  • GET: 资源已被提取并在消息正文中传输。
  • HEAD: 实体标头位于消息正文中。
  • PUT or POST: 描述动作结果的资源在消息体中传输。
  • TRACE: 消息正文包含服务器收到的请求消息。

201 Created

该请求已经成功,并因此创建了一个新的资源,这通常是在POST请求,或是某些PUT请求之后返回的响应。

202 Accepted

请求已经收到,但是还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求或者,批处理

203 Non-Authoritative Information

服务器已成功处理了请求,但是返回的实体头部元信息不是在原始服务器上有效的确定集合, 而是来自本地或者第三方的 拷贝 ,当前的信息可能是原始版本的子集或者超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 ok 的情况才是最合适的

204 No Content

当你的操作成功,但不在响应正文中返回 数据的时候,出现这个结果。用户代理可能会用此时请求头部信息来更新原来资源的头部资源字段

205 Reset Content

告诉用户代理重置发送此请求的文档

206 Partial Content

当从客户端发送range 范围表头以只请求资源的一部分的时候,将使用此响应代码

207 Muti-Status

对于多个状态码都可能合适的情况。传输多个资源的信息

208 Already Reported

在DAV里面使用dav:propstat响应元素以避免重复枚举多个绑定的内部成员到同一个集合

226 IM Used

服务器已经完成了对资源的GET请求,并且响应是对当前实例应用的一个或者多个实例操作的表示

6.3重定向消息

300 Mutiple Choice

请求拥有多个可能的响应,用户代理或者用户应当重中选择一个。(没有标准化的方法来选择其中一个响应,但是建议用指向可能性的HTML链接,以便用户可以选择)

301 Moved Permanently

请求资源的URL已永久更改,但是在响应中给出了新的URL

302 Found

此响应代码表示所请求资源的URL暂时更改未来可能会对url进行进一步的改变。因此,客户机应该在将来的请求中使用这个相同的URL

303 See other

服务器发送此响应,指示客户端通过应该GET 请求在另一个URL中获取请求的资源。

304 Not Modified(重定向)

当测试实体自上次检索以来是否被修改的时候,出现此结果。一般用于缓存的目的,它告诉客户端,因此客户端可以继续使用相同的缓存版本的响应

305 Use Proxy

在HTTP规范中定义,以指示请求的响应必须被代理访问,由于对于代理的带内配置的安全考虑,他已经被弃用

306 unused

此响应代码不再使用;它只是保留。它曾在HTTP 1.1规范的早期版本中使用过

307 Temporary Redirect

服务器发送此响应,以指示客户端使用在前一个请求中使用的相同方法在另一个URL上获取请求的资源。这与302 Found HTTP响应代码具有相同的语义,但用户代理不能更改所使用的HTTP方法:如果在第一个请求中使用了POST,则必须在第二个请求中使用POST。

308 Permanent Redirect

这意味着资源现在永久位于Location:HTTP Response标头指定的另一个URL。这与301 Moved Permanetly HTTP响应代码具有相同的语义,但用户代理不能更改所使用的HTTP 方法:如果在第一个请求中使用POST,则必须在第二个请求中使用POST

6.4客户端错误响应

400 Bad Request

由于被认为是客户端错误(如:错误的请求语法,无效的请求消息帧或欺骗性的请求路由),服务器无法或者不会处理请求。

401 Unauthorized

客户端错误,虽然HTTP标准指定了”Unauthorized“,但是从语义上来说,这个响应意味着”unauthenticated“也就是说,客户端必须对自身进行身份验证才能获得请求的响应。

402 Payment Required

此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准的约定

403 Forbidden

客户端错误,客户端没有访问内容的权限,也就是说,它是经过授权的,因此服务器拒绝提供请求的资源。与 401 Unauthorized 不同,服务器知道客户端的身份。

404 Not found

(客户端错误) 当资源不存在的时候,出现此结果。在浏览器中这意味着无法识别URL,在API中,这也可能意味着端点有效,但资源本身不存在,服务器也可以发送此响应,而不是 403 Forbidden , 以向未经授权的客户端隐藏资源的存在。这个响应代码可能是最广为人知的。

405 Method Not Allowed

服务器知道请求方法,但是目标资源不支持该方法。例如,API可能不允许调用DELETE来删除资源。

406 Not Acceptable

当web服务器在执行服务器驱动型内容协商机制之后,没有发现任何符合用户代理给定标准的内容时候就会发出此响应

407 Proxy Authentication Required

类似于 401 Unauthorized 但是认证需要由代理完成

408 Request Timeout

此响应由一些服务器在空闲连接上发送,即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接。由于一些浏览器,如chrome ,Firefox使用HTTP预连接机制来加速冲浪,所以这种响应被使用的更多,还需注意的是,有些服务器只是关闭了连接而没有此发送消息。

409 Conflict

当请求与服务器的当前状态冲突时,将发送此响应

410 Gone

当请求的内容已经从服务器中永久删除且没有转发地址的时候,将发送此响应。客户端需要删除缓存和指向资源的链接。HTTP规范打算将此状态码用于”有限时间的促销服务“。API 不因该被迫指出已使用此状态代码删除的资源

411 Length Required

服务器端拒绝该请求是因为Content-Length头部字段未定义,但是服务端需要它。

412 Precondition Failed

客户端错误,客户端在头文件中指出了服务器不满足的先决条件。

413 Payload Too Large

(客户端错误) 当请求长度过长的时候,出现此结果,服务器可能会关闭连接,或者在标头字段返回重试 Retry-After

414 URL Took Long

客户端请求的URL比服务器愿意接受的长度长

415 Unsupported Media Type

服务器不支持请求数据的媒体格式,因此服务器拒绝请求

416 Range Not Satisfiable

无法满足 Range 标头字段指定的范围,该范围可能超出了目标URL数据的大小

417 Exceptation Failed

此协议代码表示服务器无法满足 Expect 请求表头字段所指示的期望

418 I’m a teapot

服务端拒绝用茶壶煮咖啡,来源茶壶冲泡咖啡

421 misdirected Request

请求被定向到无法生成响应的服务器,这可以由未配置为针对请求url包含的方案和权限组合生成的响应服务器发送。

422 Unprocessable Entity

请求格式正确,但由于语义错误而无法遵循

423 Locked

正在访问的资源已锁定

424 Failed Dependency

由于前一个请求请求失败,请求失败

425 Too Early

表示服务器不愿意冒险处理可能被重播的请求

426 Upgrade Required

服务器拒绝使用当前协议执行请求,但在客户端升级到其他协议后可能愿意这样做,服务端发送带有Upgrade字段的426响应来表明它所需要的协议

428 Precondition Required

源服务器要求请求是有条件的,此响应旨在防止‘丢失更新’问题,即当第三方修改服务器上的状态的时候,客户端GET 获取资源的状态,对其进行修改并将其PUT放回服务器,从而导致冲突

429 Too Many Requests

用户在给定的时间内发送了太多的请求(‘限制请求速率’)

431 Request Header Fields Too Large

服务器不愿意处理请求,因为其头字段太大。在减少请求头字段的大小之后,可以重新提交请求

451 Unavailable For Legal Reasons

用户代理请求了无法合法提供的资源,例如政府审查的网页

6.5服务器端错误响应

500 Internal Server Error

服务器遇到了不知道如何处理的情况。

501 Not Implemented

(服务器错误) 当为实施某个请求的操作时,服务器不支持这种请求方法,出现这个结果

502 Bad Gateway

此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到了一个错误的响应。

503 Service Unavailable

(服务器错误) 当web API 服务不可用时,出现此结果服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。请注意,与此响应一起,应发送解释问题的用户友好页面。这个响应应该用于临时条件和如果可能的话,HTTP 标头 Retry-After 字段应该包含恢复服务之前的估计时间。网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。

504 Gateway Timeout

当服务器充当网关且无法及时获得响应的时候,会给出此错误响应

505 HTTP Version Not Supported

服务器不支持请求中使用的HTTP版本

506 Variant Also Negotiates

服务器存在内部配置错误;所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中适当的终点。

507 Insufficient Storage

无法在资源上执行该方法,因为服务器无法存储成功完成请求所需的表示。

508 Loop Detected

服务器在处理请求时候检测到无限循环

510 Not Extended

服务器需要对请求进行进一步扩展才能完成请求。

511 Network Authentication Required

指示客户端需要进行身份验证才能获取网络访问权限

七、HTTP主要特点

7.1无连接

无连接的含义是指每次连接只能处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间

7.2无状态

HTTP协议是无状态的协议,无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次传输的数据量增大,另一个方面,在服务器不需要先前信息时,它的应答就比较快。

协议的状态是指下一次传输可以“记住”这次传输信息的能力.
http是不会为了下一次连接而维护这次连接所传输的信息的.

无状态是指,当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再发送请求给服务器的时候,他会响应,但是他不知道你就是刚才那个浏览器,简单地说,就是服务器不会去记得你,所以是无状态协议。

7.3简单快速

客户向服务器请求服务的时候,只需要传送请求方法和路径。请求方法常用的有GET,HEAD,POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小。因而通信速度很快

7.4灵活

HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
支持B/S 和 C/S模式

结语

在撰写这篇文章的过程中,我尽力确保内容的准确和全面,但难免会有疏漏的地方。如果您发现任何错误或有任何改进建议,请不要犹豫,随时告诉我。我非常乐意接受您的宝贵建议,并会及时进行修改。

再次感谢您的阅读和支持,希望这篇文章对您有所帮助!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值