【应用层协议】HTTP协议 {统一资源定位符URL;HTTP协议格式;HTTP请求的方法;HTTP响应的状态码;HTTP头部的常见字段;HTTP协议的特性:无状态性,无连接性}

一、统一资源定位符URL

平时我们俗称的 “网址” 其实说的就是 URL

在这里插入图片描述

URL(Uniform Resource Locator,统一资源定位符)是互联网上用于定位资源的字符串。它定义了资源的地址,允许用户通过Web浏览器或其他工具访问这些资源。URL通常由几个部分组成,每个部分都有其特定的含义。下面是对URL的基本介绍,以及它各个部分的说明:

1.1 URL的基本结构

一个典型的URL由以下几部分组成,各部分之间用冒号(:)、斜杠(/)等分隔符分隔:

scheme://username:password@host:port/path?query#fragment
  • scheme(协议):指定了访问资源时所使用的协议类型,如httphttpsftp等。
  • username:password(用户名:密码):指定了访问资源时可能需要的用户名和密码(可选)。现代Web应用中,出于安全考虑,直接在URL中传递用户名和密码的做法已经较少见。
  • host(主机名):资源所在的服务器名称(域名)或IP地址。
  • port(端口号):指定了服务器监听的端口号,用于区分同一主机上运行的不同服务(可选,默认为协议的标准端口,如HTTP的80,HTTPS的443)。
  • path(路径):资源在服务器上的具体位置。
  • query(查询字符串):可选部分,用于向服务器传递额外的信息,通常以键值对的形式出现,多个键值对之间用&分隔。
  • fragment(片段标识符):指定了资源内部的一个片段或锚点,浏览器会自动滚动到该位置(仅在客户端有效,不发送给服务器)。

示例

https://www.example.com/path/to/resource?name=value#section1
  • schemehttps,表示使用HTTPS协议进行通信。
  • hostwww.example.com,是资源所在的服务器地址。
  • path/path/to/resource,是资源在服务器上的具体位置。
  • query?name=value,是传递给服务器的查询参数。
  • fragment#section1,是指向资源内部section1部分的锚点。

URL是互联网上资源访问的基础,理解其结构对于进行Web开发、网络爬虫、SEO优化等工作都非常重要。


1.2 域名和域名解析

域名系统
由于IP地址是一串难以记忆的数字(如192.0.2.1),人们设计了域名系统(DNS, Domain Name System)来将域名和IP地址相互映射,以便更方便地访问互联网资源。域名解析(Domain Name Resolution)是将域名转换为IP地址的过程。

域名的组成
域名由多个部分组成,包括数字和字母,但每个标号(即用点分隔的每一部分)不超过63个字符,且除了连字符(-)外不能使用其他标点符号。级别最低的域名写在最左边,而级别最高的域名写在最右边。例如,在域名www.example.com中,com是顶级域名(TLD),example是二级域名,www是主机名(也可以称为子域名)。域名是需要注册和购买的。

域名解析的过程

当用户输入一个域名(如www.example.com)并尝试访问时,浏览器会向DNS服务器(位于运营商数据中心)发送一个查询请求。DNS服务器会查找该域名对应的IP地址,并将其返回给浏览器。浏览器随后使用该IP地址与对应的服务器建立连接,从而访问所需的资源。

  1. 查询:用户在浏览器中输入域名,浏览器向DNS服务器发送查询请求。
  2. 解析:DNS服务器查找域名对应的IP地址,并将其返回给浏览器。
  3. 连接:浏览器使用返回的IP地址与服务器建立连接,访问所需资源。

总之,域名和域名解析是互联网中不可或缺的部分,它们共同构成了网络世界的基石,使得人们能够方便地访问和共享各种网络资源。


1.3 Web根目录

Web根目录是Web服务器上存放网站文件的最顶层目录。它是Web服务器的默认文件夹,所有的网站文件都存放在该目录下。Web服务器根目录一般由Web服务器软件的配置文件指定,常见的Web服务器软件如Apache、Nginx等都会在其配置文件中指定一个文件夹作为根目录。

Web根目录在Web服务器的工作流程中扮演着至关重要的角色。当用户在浏览器中输入网站的域名或IP地址时,Web服务器会根据配置文件中指定的根目录路径去查找对应的文件。例如,如果根目录被设定为/var/www/html,而用户请求的网页文件路径为/index.html,那么Web服务器就会在/var/www/html目录下寻找index.html文件,并将其发送给用户的浏览器进行显示。

Web根目录的作用主要体现在以下几个方面:

  1. 存放网站文件:Web根目录是存放网站文件的最外层目录,包括HTML页面、CSS样式表、JavaScript脚本、图片、视频、音频等所有与网站相关的文件。这些文件构成了网站的主体内容,是网站得以正常运行的基础。
  2. 定义网站的访问路径:Web根目录中的文件和文件夹的相对路径关系可以定义网站的访问路径。例如,根目录下的index.html文件可以通过访问根路径(如http://example.com)或者访问根路径下的index.html(如http://example.com/index.html)来访问。
  3. 默认网页的显示:当用户访问Web服务器的根目录时,服务器会根据配置显示一个默认网页(首页)。这个默认网页通常是index.htmlindex.phpdefault.html等文件名。如果存在这样的默认网页文件,服务器将自动加载并显示它。
  4. 访问控制:Web根目录可能包含敏感数据或需要保密的文件。因此,Web服务器通常会根据访问权限控制根目录中文件的查看和访问。这可以通过服务器配置文件或访问控制列表(ACL)来实现。

1.4 URL编码

URL编码(也称为百分比编码或URL转义)是一种将非ASCII字符(如汉字)和某些特殊字符转换为可在URL中安全传输的格式的方法。这是必要的,因为URL的标准格式(URI)仅包含ASCII字符的一个子集,并且保留了某些字符(如/?#等)用于特殊用途。

在这里插入图片描述

URL编码

URL编码过程将不安全的字符替换为%后跟两位十六进制数的形式。例如,空格字符在URL中是不安全的,因为它可能被解释为URL不同部分的分隔符。因此,空格通常被编码为%20

一些常用的URL编码字符包括:

  • 空格 ( ) 编码为 %20
  • # 编码为 %23
  • % 本身编码为 %25
  • & 编码为 %26
  • + 编码为 %2B
  • / 在某些上下文中(如路径部分)不需要编码,但在查询字符串中作为分隔符使用时,如果需要将其作为普通字符传递,则可能需要编码为 %2F
  • ? 编码为 %3F
  • = 编码为 %3D

URL解码

URL解码是编码的逆过程,即将%后跟两位十六进制数转换回原始字符。

在线url网址编码、解码器-BeJSON.com


二、HTTP协议格式

HTTP协议(Hypertext Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它基于TCP/IP协议运行,是Web上进行数据交换的基础,也是一种客户端-服务器协议。HTTP协议的基本格式包括请求(Request)和响应(Response)两部分,下面分别进行介绍:

2.1 HTTP请求(Request)

HTTP请求由四部分组成:请求行(Request Line)、请求头部(Header)、空行和请求体(Body,可选)。

在这里插入图片描述

  1. 请求行

    • 格式:[方法] [URL] [HTTP版本]
    • 示例:GET /index.html HTTP/1.1
    • 方法:常见的有GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT等。
    • URL:统一资源定位符,用于定位互联网上的资源。
    • HTTP版本:指示客户端使用的HTTP协议版本,如HTTP/1.1。
  2. 请求头部

    • HTTP 头部(Headers)是 HTTP 请求和响应消息中非常关键的一部分,它们包含了关于请求或响应的元信息(metadata)。
    • 格式:键值对结构,每对键值占一行,键和值之间用冒号+空格分隔,如Host: www.baidu.com
  3. 空行

    • 用来分隔请求头部和请求体。
  4. 请求体(可选)

    • 当使用POST、PUT等方法时,请求体包含要发送给服务器的数据。
  • 数据格式和长度由请求头部的Content-Type和Content-Length指定。

2.2 HTTP响应(Response)

HTTP响应也由四部分组成:状态行(Status Line)、响应头部(Header)、空行和响应体(Body)。

在这里插入图片描述

  1. 状态行
    • 格式:[HTTP版本] [状态码] [状态消息]
    • 示例:HTTP/1.1 200 OK
    • HTTP版本:响应使用的HTTP协议版本。
    • 状态码:表示请求的处理结果,如200表示成功,404表示未找到资源。
    • 状态消息:对状态码的简单文本描述。
  2. 响应头部
    • 格式与请求头部相同,也是键值对结构,键和值之间用冒号+空格分隔。
  3. 空行
    • 用来分隔响应头部和响应体。
  4. 响应体
    • 服务器返回给客户端的资源内容,如HTML文档、图片等。
    • 响应体的长度和内容类型由响应头部的Content-Length和Content-Type指定。

2.3 调试代理工具Fiddler

Fiddler是一款功能强大、易于使用的HTTP协议调试代理工具,它能够帮助开发人员和测试人员更好地理解和调试网络流量。通过捕获和查看HTTP/HTTPS请求和响应的详细信息,Fiddler可以帮助用户分析和诊断网络通信中的问题,优化性能,提高开发效率。

主要功能

  1. 网络调试和分析:
    • Fiddler能够捕获和查看HTTP/HTTPS请求和响应的详细信息,包括请求头、请求体、响应头和响应体等。
    • 通过这些信息,开发人员和测试人员可以分析和诊断网络通信中的问题,识别错误,优化性能,并进行网络安全测试。
  2. 修改和篡改请求:
    • Fiddler允许用户修改和篡改网络请求,以模拟不同的场景。
    • 用户可以更改请求头、请求参数、请求体等,以查看服务端的不同响应,这对于测试和调试非常有用。
  3. 模拟网络环境:
    • Fiddler可以模拟慢速网络连接、高延迟、网络丢包等不同网络环境,以测试应用程序在不同网络条件下的表现。
    • 这对于评估应用程序的性能和可靠性非常有帮助。
  4. 自定义扩展和脚本:
    • Fiddler具有强大的扩展功能,允许开发人员编写自定义扩展和脚本,以执行各种自动化任务和增强Fiddler的功能。
    • 用户可以根据自己的需求来定制Fiddler,并实现更多的自动化功能。

工作原理

  • Fiddler以代理web服务器的形式工作,它使用代理地址127.0.0.1和端口8888。
  • 当Fiddler启动时,它会将自己变成一个代理服务器,并默认监听127.0.0.1:8888。
  • 浏览器或其他客户端在发送HTTP请求时,会先经过Fiddler,然后Fiddler再将请求转发给服务器。
  • 服务器返回响应时,也会先经过Fiddler,然后Fiddler再将响应返回给客户端。

安装与基本操作


三、HTTP请求的方法

在这里插入图片描述

HTTP请求的GET和POST方法是HTTP协议中两种最基本且最常用的请求方法,它们各自具有不同的特点和用途。

3.1 GET方法

GET方法主要用于从服务器获取资源,也可以用于向服务器传递请求参数。以下是GET方法的一些关键特点:

  1. 请求参数通过URL传递:GET请求将请求参数附加在URL后面,以查询字符串的形式进行传递。例如,http://example.com/resource?param1=value1&param2=value2
  2. 请求参数长度有限制:由于请求参数是作为URL的一部分传递的,因此URL长度有限制。不同的浏览器和服务器对URL长度的限制可能有所不同,但通常在几千个字符左右。
  3. 请求结果可被缓存:GET请求被视为幂等的,即多次对同一URL发起GET请求,应得到相同的结果。因此,GET请求的结果可以被缓存,以提高网络性能和资源利用率。
  4. 请求可被收藏和分享:由于GET请求的参数直接暴露在URL中,因此带有特定参数的URL可以被收藏或分享给他人,以便他们直接访问相同的资源。
  5. 请求对服务器无副作用:GET请求应仅用于获取资源,而不应对服务器进行任何修改操作。因此,GET请求不应产生服务器端的副作用。
  6. 请求数据在URL中可见:由于请求参数直接暴露在URL中,敏感信息不应通过GET请求传递,以避免信息泄露。

GET方法常用于浏览器请求网页、获取静态资源、进行搜索等场景。


3.2 POST方法

POST方法主要用于向服务器提交数据,通常是用来创建新资源或者对现有资源进行修改。以下是POST方法的一些关键特点:

  1. 请求参数包含在请求体中:与GET方法不同,POST请求的参数不是附加在URL上,而是包含在请求体中。这意味着POST请求可以提交大量的数据,且不受URL长度限制。
  2. 数据类型和编码方式灵活:POST请求支持多种数据类型和编码方式。例如,application/x-www-form-urlencoded 是最常见的 POST 数据提交方式,它用于模拟表单提交;multipart/form-data 主要用于文件上传;而 application/json 则常用于提交JSON格式的数据,便于处理复杂的结构化数据。
  3. 对数据的修改:POST请求通常用于提交数据以创建新资源或修改现有资源。与GET请求不同,POST请求可能对服务器上的资源状态产生影响。
  4. 安全性:由于POST请求的参数不会直接暴露在URL中,因此它在一定程度上比GET请求更安全。然而,这并不意味着POST请求可以完全避免安全漏洞,如跨站请求伪造(CSRF)等。

POST方法常用于表单提交、文件上传、数据更新等场景。


3.3 接口测试工具Postman

Postman是一款功能强大的接口测试工具,它主要用于测试HTTP请求,并支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等。

基本概述

  • 定义:Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,并获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配。
  • 应用场景:Postman广泛应用于接口测试和开发阶段,帮助开发人员和测试人员快速、高效地测试和管理API接口。

主要功能

  1. 支持多种HTTP请求方法:Postman支持HTTP协议的所有请求方式,满足各种测试需求。
  2. 请求参数设置:用户可以设置请求的URL参数、请求头、请求体等,支持表单格式和JSON格式的数据发送。
  3. 模拟登录和Cookies管理:Postman可以模拟登录过程,保存登录后的Cookies,以便在后续的请求中使用。
  4. 数据同步和团队协作:支持数据同步功能,可以在不同设备上同步测试数据;支持团队协作,可以推送请求给团队成员执行或继续开发。
  5. 接口开发和测试全流程支持:从接口开发到测试,再到模拟测试和监控,Postman提供了全面的支持。
  6. 内置脚本和测试自动化:支持编写内置脚本进行接口测试自动化,提高测试效率。

安装与基本操作

使用Postman测试GET方法

请求URL:https://wis.qq.com/weather/common

请求方式:GET

参数:

参数名        必选 类型    说明
source       是   string pc
weather_type 是   string observe
province     是   string 省
city         是   string 市
county       是   string 县

请求和返回示例:

在这里插入图片描述


四、HTTP响应的状态码

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。我们常见的404 Not Found就是HTTP状态码之一。

img

4.1 状态码的分类

所有状态码的第一个数字代表了响应的五种状态之一:

  1. 1xx(信息性状态码):表示临时的响应,需要请求者继续执行操作。
  2. 2xx(成功状态码):表示请求已成功被服务器接收、理解并处理。
  3. 3xx(重定向状态码):表示客户端需要采取进一步的操作才能完成请求。
  4. 4xx(客户端错误状态码):表示请求包含错误或无法被服务器理解。
  5. 5xx(服务器错误状态码):表示服务器在处理请求时遇到了错误。‌

4.2 常见状态码的含义

  • 200 OK:请求已成功,请求所希望的响应内容将会在消息主体中返回。
  • 204 ‌No Content:服务器成功处理了请求,但没有返回任何内容。
  • 301 Moved Permanently:请求的资源已经永久移动到新的URL,应使用新的URL进行访问(永久移动)。
  • 302 Found:请求的资源临时从不同的URI返回(临时移动)。
  • 400 ‌Bad Request:服务器不理解请求的语法。
  • 401 Unauthorized:请求需要用户验证。
  • 403 Forbidden:服务器理解请求,但拒绝执行。
  • 404 Not Found:服务器无法找到请求的资源。
  • 500 Internal Server Error:服务器遇到错误,无法完成请求。
  • 503 Service Unavailable:服务器当前无法处理请求,由于维护或过载。‌

五、HTTP头部的常见字段

5.1 常见的请求头部字段

在这里插入图片描述

  • Host:请求资源的主机名和端口号。

  • User-Agent:发出请求的客户端信息,其中包括操作系统和浏览器信息。

  • Accept:客户端能够接收的内容类型。

  • Accept-Language:客户端首选的语言。

  • Referer: 当前页面是从哪个页面或资源跳转过来的;

  • Connection:指示是否需要保持连接打开(keep-alive),或者请求/响应完成后关闭。在HTTP/1.1中,默认是keep-alive,但在HTTP/1.0中可能需要显式指定。

  • Cookie(如果cookie存在):这是客户端发送给服务器的。在随后的请求中,如果客户端需要向服务器发送之前存储的cookie,它会在HTTP请求的头部中包含一个Cookie字段。这个字段包含了客户端想要发送给服务器的所有cookie的名称和值,通常以分号和空格分隔。

  • Content-Type(如果请求体存在):请求体的媒体类型。

  • Content-Length(如果请求体存在):请求体的长度。

5.2 常见的响应头部字段

在这里插入图片描述

  • Server:服务器软件的信息,如Apache/2.4.25 (Unix)。这个头部可以被用来识别特定的服务器软件,但也可能暴露给攻击者一些安全相关的细节。
  • Connection:指定连接类型,如keep-alive表示持久连接。
  • Set-Cookie:这是服务器发送给客户端的。当服务器想要设置或更新客户端的cookie时,它会在HTTP响应的头部中包含一个或多个Set-Cookie字段。这些字段告诉客户端(如浏览器)应该存储哪些cookie信息。
  • Location: 搭配3xx状态码使用,用于指示请求的资源现在位于何处,或者客户端应该使用哪个URI来访问请求的资源。它通常与HTTP重定向相关,当服务器希望客户端访问另一个URI时,会在响应中包含Location字段,并返回状态码如301(永久移动)、302(临时移动)或307(临时重定向)等。
  • Date:响应生成的日期和时间。
  • Content-Type:响应体的媒体类型。
  • Content-Length:响应体的长度。

六、HTTP协议的特性

HTTP协议具有无状态性和无连接性两个重要特性,下面分别进行介绍:

6.1 无状态性

定义

HTTP协议的无状态性指的是协议对于事务处理没有记忆能力。即服务器不会保存任何客户端的状态信息,每次请求都是独立的,服务器不会记住之前的请求。

原因

HTTP无状态的根本原因在于浏览器与服务器之间是通过Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,并且服务器也会在处理完页面之后销毁页面对象。

优缺点

  • 优点:解放了服务器,使服务器不需要持续追踪和管理客户端的状态,每一次请求都“点到为止”,不会造成不必要的连接占用,提高了服务器的处理效率和可伸缩性。
  • 缺点:如果后续处理需要前面的信息,则必须重传,这可能导致每次连接传送的数据量增大,增加了网络负担。此外,无状态性也阻碍了需要保持状态的Web应用程序的实现。

解决方案

为了处理HTTP无状态带来的问题,引入了Cookie和Session机制。HTTP协议中的Cookie和Session机制是Web开发中用于管理用户会话状态的两种重要技术。Cookie通过客户端保持状态,Session则通过服务器保持状态。这两种机制通过在客户端和服务器之间传递标识符来跟踪会话状态。

6.1.1 Cookie机制

1. 定义

Cookie是由W3C组织提出,并在Netscape社区发展起来的一种机制,目前已成为标准,被所有主流浏览器支持。Cookie是一种在客户端保存少量数据并随每次请求发送到服务器的技术。

2. 工作原理

  • 当用户首次访问Web站点时,服务器会在HTTP响应头中包含一个Set-Cookie字段,将Cookie信息发送给客户端(浏览器)。
  • 浏览器将Cookie信息保存在用户的计算机上(内存级或文件级),并在后续对同一网站的请求中,将Cookie信息添加到HTTP请求头中发送给服务器。
  • 服务器通过读取Cookie信息来识别用户身份,并据此提供相应的响应。

3. 主要属性

  • NAME=VALUE:指定Cookie的名称和值,名称大小写不敏感,值必须经过URL编码。
  • domain:Cookie的有效域名,即哪些域名下的请求会带上这个Cookie。
  • path:指定向域中的哪个路径发送请求时,应该带上这个Cookie。
  • expires/max-age:Cookie的有效时间,指定何时应该停止向服务器发送这个Cookie。如果未设置,默认为浏览器会话结束即删除。
  • Secure:仅在HTTPS安全通信时才会发送Cookie。
  • HttpOnly:该Cookie不能被脚本访问,提高了安全性。

4. 优缺点

  • 优点:
    • 无需在服务器端保存大量数据,减轻了服务器的负担。
    • Cookie的读写操作简单,易于实现。
  • 缺点:
    • Cookie数据存储在客户端,容易被篡改或窃取,存在安全隐患。
    • Cookie的大小和数量受到浏览器限制,不能存储大量数据。

6.1.2 Session机制

1. 定义

Session是一种在服务器端保存用户会话状态的技术。每个用户访问网站时,服务器都会为其创建一个唯一的会话ID(Session ID),并通过Cookie或URL重写等方式将这个会话ID发送给客户端。客户端在后续的请求中会携带这个会话ID,服务器通过识别会话ID来恢复用户的会话状态。

2. 工作原理

  • 用户首次访问Web站点时,服务器为其创建一个会话ID,并将其存储在服务器上(通常是内存或数据库中)。
  • 服务器将会话ID通过Cookie或URL重写等方式发送给客户端。
  • 客户端在后续的请求中会携带会话ID,服务器通过识别会话ID来恢复用户的会话状态。

3. 优缺点

  • 优点:
    • 会话数据存储在服务器端,更加安全,不易被篡改或窃取。
    • 可以存储大量数据,不受客户端限制。
  • 缺点:
    • 服务器需要保存大量会话数据,增加了服务器的负担。
    • 如果用户很多,服务器会存储大量的Session,消耗大量的内存。

6.2 无连接性

定义

HTTP协议的无连接性指的是每次连接只处理一个请求,服务端处理完客户端一次请求,等到客户端作出回应之后便断开连接。这种无连接性可以节省服务器资源,但也会增加每个请求的延迟,因为需要重新建立连接。

发展

  • HTTP/1.0:提出了持久连接(Keep-Alive)的概念,允许一个TCP连接处理多个HTTP请求,减少了建立和断开连接的次数。
  • HTTP/1.1:将持久连接作为默认连接方式,进一步提高了传输效率。同时,提出了pipelining的概念,允许客户端在收到前一个请求的响应之前发送多个请求,但服务器仍需按照请求的顺序返回响应。
  • HTTP/2:引入了多路复用(multiplexing)技术,允许多个请求和响应的传输完全混杂在一起进行,通过streamID来互相区别,极大地提高了传输效率。

注意:互联网上的服务器可能采用不同版本的HTTP协议,各版本对长连接的支持技术不同,可能存在兼容性问题。因此在客户端首次访问服务器时,通信双方交换HTTP协议的版本(请求行和状态行),通过协商确定通信双方是否都支持长连接技术,之后才能正常进行长连接通信。

总结

HTTP协议的无状态性和无连接性是其设计之初就确定的基本特性。无状态性简化了服务器的设计,提高了服务器的处理效率,但也带来了状态管理的问题;无连接性则通过不断的发展和改进,从最初的每次连接只处理一个请求,到持久连接、pipelining,再到HTTP/2的多路复用技术,逐步提高了传输效率和用户体验。

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芥末虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值