【Linux】应用层http协议

2024-09-09 07:44
文章标签 linux 协议 http 应用层

本文主要是介绍【Linux】应用层http协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、HTTP协议

1.1 简要介绍一下HTTP

       我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。

       在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

       HTTP协议是客户端与服务器之间通信的基础。客户端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是一个无连接、无状态的协议,即每次请求都需要建立新的连接,并且服务器不会保存客户端的状态信息。

1.2 认识URL

       平时我们俗称的“网址”其实就是说的是URL(统一资源定位符)。

       在网络通信中,网络通信都是IO操作的通信。当用户通过HTTP协议来获取的数据一般都在服务器中存储,我们需要通过特定的路径找到所请求的文件。那么为什么每一次使用HTTP协议去请求网页都要有网址呢?因为该网址上的信息是非常重要的,我们需要通过该网址上的信息找到我们所要访问的文件。

       现在的问题是如何在庞大的互联网中标定一个文件的位置,在Linux中一切皆文件,在Linux系统中,所有文件都有其特定的路径,但是在不同的主机,有些文件可以有相同的路径,那么我们想要表示文件的唯一路径还需要在其前面添加该文件所在服务器的地址(IP + Port)。这样,我们就可以找到文件的唯一路径了。

       再次回头看一看URL的组成(如下图所示):URL的部分有:协议方案名,登录信息(不需要),服务器地址,服务器端口号,带层次的文件路径,查询字符串,片段标识符。其中,我们最关心的是服务器地址和带层次的文件路径。

我们现在来理解一下查询字符串和片段标识符:

       查询字符串用于在URL中传递数据,通常以?开头,后面跟着键值对,如?key=value。片段标识符则以#开头,表示网页中的一个具体位置或部分,例如#section1。查询字符串用于传递参数,片段标识符用于指定浏览器显示的页面位置。

// 举个例子
https://cn.bing.com/search?q=dshfks&form=ANNTH1&refig=66dad2d0652448a28f0f3ec39a1b794f&pc=CNNDDB

1.3 urlencode和urldecode

       在URL中避免不会出现一些特殊字符:/  ?: 等这样的字符,因为已经被URL当做了特殊意义理解了,因此这些字符不能随意地出现,比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义。我们也可以使用专门的工具来看看特殊字符会转移成为什么?urlencode工具

       转义的规则如下:将需要转码的字符转为16进制,然后从右向左取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

例如:c++   --->   c%2B%2B

二、HTTP协议请求与响应格式

2.1 HTTP请求

  • URL:指定服务器的什么资源,在网页地址中,出现的第一个文件分割符不一定是根目录,而是web根目录,可以是任何目录。
  • 请求方法:GET,POST,HEAD,其中最重要的是GET和POST方法。
  • HTTP版本:请求的是client的版本,一般是http/1.0 http/1.1 http/2.0

我们要来考虑两个问题:如何将报头和有效载荷进行分离;如何分用和交付? 

       如何将报头和有效载荷进行分离:空行可以保证我们把报头读完。content-length是正文长度,我们可以根据这个字段的长度来提取出报文中的正文。

       如何进行分用和交付呢?因为是应用层,所以我们不需要进行分用,但是在还需要将数据进行交付给上层用户,交付的过程其实就是解包的过程。

2.2 HTTP响应

HTTP响应的报头和HTTP请求的报头的格式是类似的。

  • HTTP版本:HTTP服务端的版本
  • 状态码:HTTP协议中状态码分为五类:1XX  2XX  3XX  4XX  5XX,在下面讲解分别代表什么含义
  • 状态码描述:解释状态码的含义

       url默认我们指明了请求什么资源,HTTP协议可以支持默认首页,或者是一段Linux路径 /a/b/c.html。我们在一个网站中访问网页,进行页面跳转,每一次访问都是以HTTP请求!!!

        什么是网站?站在程序员的视角中就是一对特定目录结构和文件构成的目录结构,所以我们写的HTTP 的服务器是后端,负责将特定目录下的特定资源(文件)发送给client IO程序!!一张网页中,可以包含很多资源,比如图片,获取一张完整的网页,先获取html,浏览器会发送多次请求获取网页中的所有元素,然后构成一个完整的网页结果。

三、HTTP的方法

HTTP的方法
方法说明支持的HTTP协议版本
GET获取资源1.0  1.1
POST传输实体主体1.0  1.1
PUT传输文件1.0  1.1
HEAD获得报文首部1.0  1.1
DELETE删除文件1.0  1.1 
OPTIONS询问支持的方法1.1
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK       建立和资源之间的联系1.0
UNLINK断开连接关系1.0

在这些方法中最常见的是GET方法和POST方法。

3.0 介绍一下表单

        HTML表单用于收集用户的输入信息,HTML表单表示文档的一个区域,该区域包含交互控件,将用户收集到的信息发送到Web服务器上,GET和POST方法与其有关。

<form action="/" method="post"><!-- 文本输入框 --><label for="name">用户名:</label><input type="text" id="name" name="name" required><br><!-- 密码输入框 --><label for="password">密码:</label><input type="password" id="password" name="password" required><br><!-- 单选按钮 --><label>性别:</label><input type="radio" id="male" name="gender" value="male" checked><label for="male">男</label><input type="radio" id="female" name="gender" value="female"><label for="female">女</label><br><!-- 复选框 --><input type="checkbox" id="subscribe" name="subscribe" checked><label for="subscribe">订阅推送信息</label><br><!-- 下拉列表 --><label for="country">国家:</label><select id="country" name="country"><option value="cn">CN</option><option value="usa">USA</option><option value="uk">UK</option></select><br><!-- 提交按钮 --><input type="submit" value="提交">
</form>

3.1 GET方法

  • 用途:用于请求URL指定的资源,也可以用于提交参数。
  • 报头示例:GET  /index.html HTTP/1.1
  • 特性:指定资源经服务器端解析后返回响应内容。

       一般我们在使用网址时使用的方法是GET,在使用GET来提交参数的时候,我们需要将键值对数据转换为字符串的格式拼接到URL中。

3.2 POST方法

  • 用途:用于传输实体的主体。通常用于提交表单数据
  • 报头示例:POST /submit.html HTTP/1.1
  • 特性:可以发送大量的数据给服务器,并且数据要包含在请求体中

       POST用正文部分将请求提交参数,POST上传参数要比GET更私密,无论是GET还是POST数据都不安全。POST可以传递更大,更多的数据

3.3 PUT方法(不常用)

  • 用途:用于传输文件,将请求报文主题中的文件保存到请求URL指定的位置
  • 报头示例:PUT /example.html HTTP/1.1
  • 特性:不经常使用,但是在某些情况下,比如RESTful API中,用于更新资源

3.4 HEAD方法(不常用)

  • 用途:与GET方法类似,但是不返回报文主体部分,仅仅返回响应头
  • 报头示例:HEAD /index.html HTTP/1.1 
  • 特性:用于确认URL的有效性以及资源更新的日期时间等

3.5 DELETE方法(不常用)

  • 用途:用于删除文件,是PUT的相反方法
  • 报头示例:DELETE /examplie.html /HTTP/1.1
  • 特性:按请求URL删除指定的资源

3.6 OPTIONS方法(不常用)

  • 用途:用于查询针对请求URL指定的资源支持的方法
  • 报头示例:OPTIONS * HTTP/1.1 
  • 特性:返回允许的方法,比如GET、POST等

四、HTTP常见的Header

4.0 最常用的Header

Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器,所请求的资源在哪个主机的哪个端口上
User-Agent: 声明用户的操作系统和浏览器版本信息
referer: 当前页面是从哪个页面跳转过来的
Location: 搭配3XX状态码使用,告诉客户端接下来要去哪里访问
Cookie: 用于在客户端存储少量的信息,通常用于实现会话(session)的功能

4.1 关于connection报头

       HTTP中的Connection字段是HTTP报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态

核心作用:

  • 管理持久连接:Connection字段还用于管理持久连接(也称为长连接)。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便在同一个连接上发送多个请求和接收多个响应。
  • 持久连接(长连接):HTTP/1.1:在HTTP/1.1协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和想用可以服用同一个连接。HTTP/1.0:在HTTP/1.0协议中,默认连接时非持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显示设置Connection: keep-alive.

语法格式:

  • Connection:keep-alive:表示希望保持连接以复用TCP连接
  • Connection:close:表示请求/想用完成后,应该关闭TCP连接

4.2 HTTP常见的header表格

字段名含义样例
Accept客户端可接受的响应内容类型

Accept:

text/html,application/xhtml+xml,app lication/xml;q=0.9,image/webp,image /apng,*/*;q=0.8

Accept-Encoding客户端支持的数据压缩格式Accept-Encoding:gzip, deflate, br
Accept-Language客户端可接收的语言类型Accept-Language: zhCN,zh;q=0.9,en;q=0.8
Host请求的主机名和端口号Host: www.example.com:8080
User-Agent客户端的软件环境信息User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Cookie客户端发送给服务器的HTTP cookie信息Cookie: session_id=abcdefg12345; user_id=123
Referer请求的来源URL        

Referer:

http://www.example.com/previous_pag e.html

Content-Type        实体主体的媒体类型Content-Type: application/x-wwwform-urlencoded (对于表单提交) 或 Content-Type: application/json (对于 JSON 数据)
Content-Length实体主体的字节大小Content-Length: 150
Authorization认证信息,如用户名和密码Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== (Base64 编码后的用户名:密码)
Cache-Control        缓存控制指令请求时:Cache-Control: no-cache 或 Cache-Control: max-age=3600;响应 时:Cache-Control: public, maxage=360
Connection请求完后是关闭还是保持连接Connection: keep-alive 或 Connection: close
Data请求或响应的日期和时间Date: Wed, 21 Oct 2023 07:28:00 GM
Location重定向的目标URL(与3XX状态码配合使用)Location: http://www.example.com/new_location .html (与 302 状态码配合使用)
Server服务器类型Server: Apache/2.4.41 (Unix)
Last-Modified资源的最后修改时间Last-Modified: Wed, 21 Oct 2023 07:20:00 GMT
ETag资源的唯一标识符,用于缓存ETag: "3f80f-1b6-5f4e2512a4100"
Expires响应过期的日期和时间Expires: Wed, 21 Oct 2023 08:28:00 GMT

五、HTTP的状态码(面试题)

5.1 状态码分类

类别原因短语
1XX信息性状态码接收的请求正在处理
2XX成功状态码请求正常处理完毕
3XX重定向状态码需要进行附加操作以完成请求
4XX客户端错误状态码服务器无法处理请求
5XX服务器错误状态码服务器处理请求出错

       最常见的状态码,比如200(OK)404(Not Found)302(Redirect,重定向)504(Bad Gateway)

5.2 重定向相关的状态码

我们来看一看关于重定向相关的状态码的表格:

状态码含义是否为临时重定向应用样例
301Moved Permanently否(永久重定向)网站换域名后,自动跳转到新域名;搜索引擎更新网站链接时使用
302Found或SeeOther是(临时重定向)用户登录成功后,重定向到用户首页
307Temporary Redirect是(临时重定向)临时重定向资源到新的位置(较少使用)
308Permanent Redirect否(永久重定向)永久重定向资源到新的位置(较少使用)

关于重定向的验证,我们可以使用301和302为代表:

       HTTP状态码301(永久重定向)和302(临时重定向)都依赖Location选项。以下是关于两者依赖Location选项的详细说明。

5.2.1 HTTP状态码301(永久重定向)

       当服务器返回HTTP301状态码时,表示请求的资源已经被永久移动到新的位置。

       在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会自动重定向到该地址。

例如,在HTTP响应中,可能会看到类似于以下的头部位置:

HTTP/1.1 301 Moved Permanently\r\n
Location: https://www.new-url.com\r\n

5.2.2 HTTP状态码302(临时重定向)

       当服务器返回HTTP302状态码时,表示请求的资源临时被移动到新的位置。

       同样地,服务器也会在响应中添加一个Location头部来指定资源的新位置。浏览器会暂时使用新的URL进行后续的请求,但不会缓存这个重定向。

例如,在HTTP响应中,可能会看到类似于以下的头部信息:

HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n

       总结:无论是HTTP301还是HTTP302重定向,都需要一栏Location选项来指定资源的新位置。这个Location选项是一个标准的HTTP响应头部,用于告诉浏览器应该将请求重定向到哪个新的URL地址。

这篇关于【Linux】应用层http协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150561

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Linux编译器--gcc/g++使用方式

《Linux编译器--gcc/g++使用方式》文章主要介绍了C/C++程序的编译过程,包括预编译、编译、汇编和链接四个阶段,并详细解释了每个阶段的作用和具体操作,同时,还介绍了调试和发布版本的概念... 目录一、预编译指令1.1预处理功能1.2指令1.3问题扩展二、编译(生成汇编)三、汇编(生成二进制机器语

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li

Linux部署jar包过程

《Linux部署jar包过程》文章介绍了在Linux系统上部署Java(jar)包时需要注意的几个关键点,包括统一JDK版本、添加打包插件、修改数据库密码以及正确执行jar包的方法... 目录linux部署jar包1.统一jdk版本2.打包插件依赖3.修改密码4.执行jar包总结Linux部署jar包部署

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s