当前位置: 首页 > article >正文

【计算机网络】理解应用层协议HTTP

目录

  • HTTP协议
  • 认识URL
  • HTTP协议的请求
    • 如果我们想获得请求报文的完整内容,怎么办?
  • HTTP协议的响应
  • HTTP的方法
    • GETvsPOST
  • HTTP的状态码
  • HTTP常见Header
  • HTTP版本
  • 实现一个简单的HTTP服务器

HTTP协议

HTTP协议是一种超文本传输协议,它定义了客户端与服务端之间如何进行数据传输进而通信的协议,HTTP是一种可以用来解析和传输超文本的协议,

认识URL

随便找一个网址我们看一下对应的URL的格式是怎样的
在这里插入图片描述
对于协议方案名,我们这里学习的是http,但我们平常使用的都是https,但两者大同小异,https使用起来更安全。
对于域名,浏览器后台会自动给转换为ip地址,找到相应服务器,加上后面的带层次的文件路径,就能唯一标识网络上唯一一台主机上的唯一的文件资源,即互联网上的唯一文件资源。
域名后面其实还有端口号,但端口号跟协议名称是强关联的,我们不需要看到,后台会自动拼接。
对于?后面的一些字符串我们不需要知道,这些都是编码格式。

HTTP协议的请求

在这里插入图片描述

  • 首行(请求行):方法 + url + HTTP版本
  • Header(请求报头):请求的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
  • Body行(请求正文):Body后面跟的都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length 的属性来标识Body的长度。

如果我们想获得请求报文的完整内容,怎么办?

假如我们从网络中截获一段网络报文,我们如何知道这串报文是一个完整的请求报文呢?
我们可以按照换行符为分隔符,如果拿到空行,就说明我们已经拿到了请求报头部分,再从请求报头中拿到Content-Length属性就能知道Body数据的大小了,从而就能拿到完整的报文。
下面是一个截获的报文
在这里插入图片描述
上面就是一个GET请求的报文。

HTTP协议的响应

在这里插入图片描述

  • 首行(状态行):版本号 + 状态码 + 状态码描述
  • Header(响应报头):回应的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
  • Body(响应正文): 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.

应答响应格式
在这里插入图片描述

HTTP的方法

HTTP的方法都是请求时使用,HTTP的方法众多
在这里插入图片描述
其中GET和POST是重点理解的两个方法,其他方法不常用,了解即可。

GETvsPOST

我们在进行登陆时,使用的账号密码就可以作为参数进行传递。

  1. GET一般用来获取静态资源(例如html),也可以通过URL来向服务器传递参数。
  2. POST可以通过http request的正文来进行参数传递。
  3. URL传递参数,参数的体量一定不大,正文可以很大。
  4. POST方法比GET方法传参更私密,但都不安全!所以需要对http的参数部分进行加密,所以就有了https。

HTTP的状态码

在这里插入图片描述
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
在这里插入图片描述
在这里插入图片描述
理解重定向:

  • 永久重定向:即状态码为301,表示请求的资源已经被永久的移动到新的位置,在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置,这个Location包含了新的URL地址,以后浏览器会自动重定向到指定的地址。
  • 临时重定向:即状态码为302,表示请求的资源被暂时移动到新的位置,同样的,服务器会在响应中添加一个Location头部,用于暂时指定资源的新位置,浏览器会使用新的URL来重定向指定的地址,但不会缓存这个重定向。
  • 总之:无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。

HTTP常见Header

  • Content-Type: 数据类型(text/html 等)
  • Content-Length: Body 的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息(比如存储账号密码,使得后续再次进入无需登录). 通常用于实现会话(session)的功能;
  • connection: 用于控制和管理客户端与服务器之间的连接状态。
  • Connection: keep-alive:表示希望保持连接以复用 TCP 连接(长连接)
  • Connection: close:表示请求/响应完成后,应该关闭 TCP 连接(短连接)

HTTP/1.1: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接,而HTTP/1.0: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。

HTTP版本

  • HTTP/0.9:仅支持GET请求,无请求与响应的报头,仅支持纯文本传输。
  • HTTP/1.0:引入POST和HEAD方法,请求和响应头信息,支持多种数据格式,支持缓存、状态码、字符集等。
  • HTTP/1.1:在1.0基础上增加了长连接、管道化、缓存控制。
  • HTTP/2.0:多路复用、二进制帧格式、头部压缩、服务器推送等功能的引入。
  • HTTP/3.0:使用 QUIC 协议替代 TCP 协议, 基于 UDP 构建的多路复用传输协议,减少了 TCP 三次握手及 TLS 握手时间, 提高了连接建立速度,解决了 TCP 中的线头阻塞问题, 提高了数据传输效率。

实现一个简单的HTTP服务器

我的gitee仓库点击这里有源码


http://www.kler.cn/news/319690.html

相关文章:

  • Codeforces 1338A —— Powered Addition 题解
  • 持续学习与创新能力的双重提升
  • javaseday31多线程
  • Node.js 学习 path模块、fs模块、npm软件包管理器、导出、导入
  • 通信工程学习:什么是VPN虚拟专用网络
  • 微服务配置中心介绍
  • 计算机毕业设计之:基于微信小程序的校园流浪猫收养系统
  • 【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享
  • 应用层 I(C/S模型、P2P模型、域名系统DNS)【★★】
  • can not run elasticsearch as root
  • 【前端】ES6:Proxy代理和Reflect对象
  • 【百日算法计划】:每日一题,见证成长(020)
  • 如何查看线程
  • 项目第一弹:RabbitMQ介绍
  • C语言之预处理详解(完结撒花)
  • JAVA链表
  • 网站在线客服插件配置
  • Stable Diffusion的高分辨率修复(Hires.fix)
  • 嵌入式单片机中can总线调试方法
  • 漏洞扫描工具使用
  • vulnhub(11):derpnstink(hydra爆破用户名和密码、验证的文件上传)
  • 多表查询。
  • 以太坊客户端Geth的介绍与搭建
  • (PySpark)RDD实验实战——取一个数组的中间值
  • 求一个数的因子数(c语言)
  • C语言 | Leetcode C语言题解之第416题分割等和子集
  • 自然场景文本定位系统源码分享
  • MFC -文件类控件
  • 暑期内卷!就练这400页软件测试面试题(附答案解析)!
  • fmql之ubuntu添加dhcp服务