【计算机网络】理解应用层协议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仓库点击这里有源码

相关推荐
黑客Ash3 小时前
【D01】网络安全概论
网络·安全·web安全·php
->yjy3 小时前
计算机网络(第一章)
网络·计算机网络·php
摘星星ʕ•̫͡•ʔ4 小时前
计算机网络 第三章:数据链路层(关于争用期的超详细内容)
网络·计算机网络
阳光帅气男孩5 小时前
PhpSpreadsheet导出图片
php
周全全6 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
Mr.Pascal6 小时前
刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)
开发语言·安全·web安全·php
建群新人小猿7 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
战术摸鱼大师10 小时前
计算机网络-理论部分(二):应用层
计算机网络