网络协议(七)应用层-HTTP

这篇具有很好参考价值的文章主要介绍了网络协议(七)应用层-HTTP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章介绍了传输层的TCP、UDP协议,在TCP/IP协议中,下三层(网络接口层,网络层,传输层)都是计算机系统联合其他硬件设备自己在干的事,身为程序员的我们平时对其感知不大。而应用层却是与程序开发息息相关的一层,如HTTP,HTTPS,DNS,FTP,SMTP等等,针对不同应用场景在应用层都有其对应的应用层协议。这篇文章就来研究下做WEB程序开发时接触最多的HTTP协议。

HTTP全称(HyperText Transfer Protocol),超文本传输协议,HTTP协议广泛用于浏览器与服务器,服务器与服务器之间的请求交互。因其是应用层的一个协议,所以服务对象必然是一个应用程序。通常来说,由一台服务器充当服务端,在上面部署一个能接收与发送HTTP请求的应用程序;客户端方面,最常见的就是浏览器,浏览器可以发送HTTP请求并接收响应内容,对程序员来说,由另一台服务器来充当客户端也是常见的事,两台服务器上的应用程序都可以向对方提供接口,所以它们可互为服务端与客户端。

HTTP特性

1.无连接性

http是一个应用层的协议,只是应用程序之间数据交互的一种格式定义。至于连接性,这是数据传输时才会用到的概念,即传输层才存在所谓连接,通常情况下也就是tcp连接(tcp相关概念请阅读上一篇文章:网络协议(六)传输层)。所以http天然不具备连接性。

http需要一个能保证可靠传输数据的下层协议来支持,所以一般来说是tcp充当其在传输层的合作协议,http要发送一个请求给对端服务,数据到传输层后,tcp通过三次握手建立连接后,才能发送这些应用数据。那tcp何时断开连接呢?在http1.0及之前的版本中,http的每一次请求都是很独立的,即每次请求结束后tcp就进行四次挥手断开连接。http1.1版本出来后,请求头默认加上Connection: keep-alive,即在一次请求后不再马上断开tcp的连接,而是保持一个tcp长连接,来避免多次http请求时tcp的频繁握手挥手,减少不必要的网络消耗,加快传输效率。

2.无状态性

HTTP本身是一种无状态协议,协议定义中并没有要求必须有一个会话标识,所以服务端收到的每次请求都会看做是一个独立的请求,和其他任何请求没有关联。

但是很多情况下我们需要一个标识来标记一次会话过程,在一次会话中保存一些上下文信息,比如需要登录验证的系统。基于这种需求,Web应用程序通常使用Cookie和Session来跟踪用户的状态。用户不带cookie头首次访问服务器后,服务器的http返回头中会通知浏览器存储一个cookie标识,如下图

网络协议(七)应用层-HTTP,网络协议,http,网络

浏览器接下来对这个ip或域名(与端口无关)访问时,http请求头中都会带上这个cookie标识,

网络协议(七)应用层-HTTP,网络协议,http,网络

服务端有个session的记录表来记录一次次会话,收到cookie标识后就可以对应上指定Session,这样一套cookie+session的机制就实现了http的会话保持功能。

3.基于请求-响应模型

客户端与服务端使用http协议通信时都是有来有回的,一次请求必然对应着一个应答。

HTTP协议规范

来看看HTTP长什么样子,通过一个例子来看

请求内容
POST /practice/gift/updateGift HTTP/1.1
Accept: application/json, text/plain, */*
Content-Length: 149
Content-Type: application/json;charset=UTF-8
Cookie: SESSION=ZjliZjhlZDEtMDk0YS00ZjA3LWJkMDItYTc3Nzk2ZTY1NGFh
Host: 47.94.211.120:8090
Origin: http://47.94.211.120:8090
Proxy-Connection: keep-alive
Referer: http://47.94.211.120:8090/
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36

[{"giftName":"一个掌声","price":10}]

请求内容的格式分为四大块:请求行,请求头,空行,消息体

网络协议(七)应用层-HTTP,网络协议,http,网络

返回内容
HTTP/1.1 200
Transfer-Encoding: chunked
Connection: keep-alive
Content-Type: application/json
Date: Thu, 14 Dec 2023 03:59:35 GMT
Keep-Alive: timeout=4
Proxy-Connection: keep-alive
Server: nginx/1.12.2

{"code":0,"message":"操作成功","data":null}

返回内容的格式也分为四大块:请求行,请求头,空行,消息体。其中,请求行的状态描述不是必须项。

网络协议(七)应用层-HTTP,网络协议,http,网络

可以看到,请求内容和返回内容的格式相差不大,主要区别在于第一行。下面具体看下第一行的内容都有啥待选项。

协议版本

协议版本就是http的版本,目前主流的还是1.1版本。

请求方法(八种方法)

  • GET。用于获取某些资源,比如查询操作。
  • POST。用于新建或更新资源。
  • PUT。用于更新资源,但是需要完整的更新,不能局部更新。
  • DELETE。用于删除资源
  • HEAD。与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回消息体,只传回状态行和响应头。
  • TRACE。回显服务器收到的请求,主要用于测试或诊断。
  • OPTIONS。这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
  • CONNECT。CONNECT方法可以开启一个客户端与所请求资源之间的双向沟通的通道,可以用来创建隧道(tunnel)。例如,CONNECT可以用来访问采用了SSL(HTTPS)协议的站点。

此外,特定的HTTP服务器还能够扩展自定义的方法。例如:PATCH,用于将局部修改应用到资源。

其中GET和POST是非常常用的方法。这两种方法基本能满足绝大多数应用场景(因为每种方法的用法只是一种约定用法,实际使用中能达到想要的效果就行)。如果应用程序用的是rest风格的api,那么还会用到PUT,PATCH,DELETE。剩余的几个在程序开发时就不太常见了。

状态码

HTTP协议定义了一系列状态码,用于表示服务器对请求的处理结果。这些状态码分为五类,每类都有特定的含义。以下是一些常见的HTTP状态码:

  • 1xx(信息性状态码): 表示请求已被接收,继续处理。

    • 100 Continue:服务器已收到请求的头部信息,客户端应该继续发送请求的剩余部分。
    • 101 Switching Protocols:服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端切换协议。
  • 2xx(成功状态码): 表示请求已成功被服务器接收、理解、并接受。

    • 200 OK:请求成功。
    • 201 Created:请求已经被实现,而且有一个新的资源已经依据请求的需要而建立。
    • 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容。
  • 3xx(重定向状态码): 表示需要客户端采取进一步的操作才能完成请求。

    • 301 Moved Permanently:请求的资源已永久移动到新位置。
    • 302 Found:请求的资源临时移动到新的位置(短链跳转常用)。
    • 304 Not Modified:资源未被修改,可以使用缓存的版本。
  • 4xx(客户端错误状态码): 表示客户端在请求时出现了错误。

    • 400 Bad Request:请求无效,服务器不理解请求的语法。
    • 401 Unauthorized:请求要求身份验证,需要提供有效的用户身份。
    • 403 Forbidden:服务器拒绝请求。
    • 404 Not Found:服务器找不到请求的资源。
  • 5xx(服务器错误状态码): 表示服务器在处理请求时发生了错误。

    • 500 Internal Server Error:服务器遇到了不知道如何处理的情况。
    • 502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
    • 503 Service Unavailable:服务器暂时不可用。

HTTP2.0

HTTP/2保留了HTTP/1.1的大部分语义,例如请求方法、状态码乃至URI和绝大多数HTTP头字段一致。而HTTP/2采用了新的方法来编码、传输客户端和服务器之间的数据。

HTTP2.0版本和1.1版本的区别:

  1. 多路复用(Multiplexing): HTTP/2.0支持多路复用,允许在单个连接上同时发送多个请求和响应,而不需要按照顺序进行阻塞。这提高了并发性,减少了延迟。

  2. 二进制传输: HTTP/2.0在传输数据时使用二进制格式,而不是HTTP/1.1中的文本格式。这使得协议的解析更加高效,并且可以减少错误。但也使得直接查看和调试成为挑战。

  3. 头部压缩: HTTP/2.0使用HPACK算法对请求和响应头部进行压缩,减少了传输的数据量。这有助于降低带宽的使用,特别是对于包含大量重复头部的请求。

  4. 流(Stream): HTTP/2.0引入了流的概念,一个流代表一个双向的、独立的逻辑通道,可以在同一个连接上传输多个流。每个流都有一个唯一的标识符,允许并发处理多个请求和响应。

  5. 服务器推送(Server Push): HTTP/2.0允许服务器在客户端请求之前推送资源,以提高性能。服务器可以主动将与请求相关的资源推送给客户端,避免了客户端再次发起请求的延迟。

  6. 优先级(Priority): HTTP/2.0支持请求的优先级,允许客户端指定对请求的优先级,而服务器则可以使用这些信息来调整响应的顺序。

HTTP1.1版本工作方式相当于半双工方式,2.2版本相当于全双工。关于双工概念,网络上有个比喻很到位:

双工是相对与单工而言的,单工是单方面传输的,比如有一条路,是从A到B,那么单工就是单向行道,只能从A到B不能从B到A,而半双工就是这条路能从A到B,也能从B到A,但不能同时进行,从A到B时不能从B到A,从B到A时不能从A到B,而全双工就是双行道,能从A到B,也可以从B到A,而且可以同时进行。因此单工就相当于BB机,别人能给你发,但你不能直接回;半双工就是对讲机,一个说完一个说;不能同时进行;全双工就是手机,双方可能同时进行。这就是单工,半双工与全双工的区别。

回到http上,http1.1只能一个一个请求排队发,服务端一个一个排队进行响应。而2.0可以同时将多个请求发给服务端,服务端也可以同时接收多个请求。这都是浏览器和服务器建立了一个tcp连接的前提下。现在的浏览器可能会对同一个host同时申请多个tcp连接,方便它进行并发请求。

网络协议(七)应用层-HTTP,网络协议,http,网络

HTTP的沟通都是明文沟通,所以程序开发时一般使用HTTP来进行调试,方便观察请求与返回结果,但是明文的话就存在安全性的问题。HTTPS在HTTP的基础上增加了加密逻辑,线上部署时一般都会使用HTTPS的形式,下篇文章就来研究下HTTPS。文章来源地址https://www.toymoban.com/news/detail-779227.html

到了这里,关于网络协议(七)应用层-HTTP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机网络】应用层——HTTP 协议(一)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌 HTTP协议全称超文本传输协议,通过浏览器和服务器进行数据交互,进行

    2024年01月23日
    浏览(33)
  • 计算机网络 - 应用层http协议 - http报文格式介绍(1)

    本篇认识和理解应用层中的http协议,了解抓包工具并进行使用,认识请求报文与响应报文,了解报文中基本键值对意思例如:Set-Cookie, 状态码等,如有错误,请在评论区指正,让我们一起交流,共同进步! 本文开始 ① 根据输入的url,在域名系统DNS中进行解析获取对应的服务

    2024年02月12日
    浏览(30)
  • 【Linux网络】网络应用层的 http 和 https协议

    在之前学习序列化和反序列化的时候,认识到主机之间传输结构数据的时候,最好是通过某种约定将结构数据序列化成一串字符串,接收方再通过反序列化将字符串转换成结构数据。以上说的这种约定,其实可以看成是用户层通信的一种协议,是由程序猿自己定的。   实际

    2024年02月02日
    浏览(42)
  • 「网络编程」应用层协议_ HTTP协议学习及深入理解

    「前言」文章内容大致是应用层协议的HTTP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 俗话说,开弓没有回头箭,唯有箭折、箭落、箭中靶子三种结果而已。 ——江晓英《苏东坡:最是人间真情味》

    2024年02月13日
    浏览(33)
  • 学习网络编程No.8【应用层协议之HTTP】

    北京时间:2023/10/9/13:03,一晃好多天过去了,9月14号的文章终于在昨天发出去了,也是许久没有更文了,国庆放假期间由于各种原因,在王者峡谷和铲子世界遨游的不亦乐乎,有待改善!目前面临挑战艰巨,问题很多,在这个空窗期我们需要有一股强大的支撑作为动力,毕竟

    2024年02月08日
    浏览(28)
  • 计算机网络:应用层(二) Web与http协议

    我最近开了几个专栏,诚信互三! ==== ||| 《算法专栏》::刷题教程来自网站《代码随想录》。||| ==== ||| 《C++专栏》::记录我学习C++的经历,看完你一定会有收获。||| ==== ||| 《Linux专栏》::记录我学习Linux的经历,看完你一定会有收获。||| ==== ||| 《C#专栏》::记录我复

    2024年02月03日
    浏览(33)
  • 【网络】应用层——协议定制 | 序列化和反序列化 | 初识http

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 在前面本喵已经带大家见识过了 scoket 网络通信的样子,现在开始深入学习网络的原理,本喵采取的策略是从顶层往底层讲解,也就是从应用层到数据链路层的顺序。 我们知道,协议就是

    2024年02月15日
    浏览(29)
  • 应用层协议——http

    虽然我们说,应用层协议是我们自己定的,但实际上,已经有一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。 平时我们俗称的 “网址” 其实就是说的 URL: 这里的登录信息现在已经隐藏起来,改成例如手机登录、微信登录

    2024年02月15日
    浏览(27)
  • 应用层协议 HTTP

    我们已经学过 TCP/IP , 已然知道数据能从客户端进程经过路径选择跨网络传送到服务器端进程。 我们还需要知道的是,我们把数据从 A 端传送到 B 端, TCP/IP 解决的是顺丰的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用

    2024年02月06日
    浏览(29)
  • 【网络应用层协议】【HTTP】详解HTTP与HTTPS、POST 请求与 GET请求 、TCP与UDP、cookie和session的区别

    目录 1. HTTP和HTTPS的区别 2. POST 请求与 GET 请求区别 3. TCP与UDP的区别 4. cookie和session的区别

    2024年04月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包