目录
一、WWW的相关概念
1.1 WWW的定义
WWW(World Wide Web),即万维网或全球信息网,是集文字、图像、声音和视频等超媒体为一体的分布式信息服务系统,也称为3W、Web。
WWW的表现形式是存储在互联网计算机上的数量巨大的文档的集合,这些文档称为Web页面,它通过超文本标记语言(Hyper Text Markup Language,HTML)把信息组织成图文并茂的超文本,用来描述超媒体。Web页面通过”超链接“从一个页面跳转到另一个页面。
1.2 超文本标记语言HTML
HTML是标准通用标记语言下的一个应用,是一种对文档进行格式化的标记语言。HTML文档的扩展名为.html或.htm,包含大量的标签,用以对网页内容进行格式化和布局,定义页面在浏览器中查看时的外观。
HTML的源文件由一个纯文本文件组成,代码中由许多元素组成,通过浏览器解释这些元素,从而显示各式各样的页面。
例如,下面是一个用户注册表单页面的HTML代码。
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="./css/ex21.css">
<title>用户注册</title>
</head>
<body>
<form method="post" action="register.php" onsubmit="return checkForm()" >
<table class="reg">
<tr><td class="title" colspan="2">欢迎注册新用户</td></tr>
<tr><th>用户名:</th><td><input type="text" name="username"></td></tr>
<tr><th>密码:</th><td><input type="password" name="password" /></td></tr>
<tr><th>确认密码:</th><td><input type="password" /></td></tr>
<tr><td colspan="2" class="td-btn">
<input type="submit" value="提交注册" class="button" />
<input type="reset" value="重新填写" class="button" />
</td></tr>
</table>
</form>
</body>
</html>
经过浏览器解释后,得到下图所示的页面。
1.3 统一资源定位符URL
1、定义
统一资源定位符(Uniform Resource Locator,URL)是因特网的万维网服务上用于指定资源位置的访问和表示方法。简单地说,URL就是web地址,俗称“网址”。例如:http://www.example.com/info/1285/128521.htm。
2、URL的格式
URL 的完整格式如下:
协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
经常见到的URL并不是完整的,因为 URL 中的有些参数是可以省略的。下表是URL中各参数含义:
参数 | 含义 |
---|---|
协议类型 | 指定访问资源的方式,常见的有http、https、ftp等 |
访问资源需要的凭证信息 | 访问时的登录信息(用户名、密码等),例如:ftp://user:123@1.2.3.4 |
服务器地址 | IP 地址或域名 |
端口号 | 表示特定进程或服务,如 http 协议默认是80端口,https 协议默认是443端口 |
资源层级 UNIX 文件路径 | 表示服务器上资源的路径,如:http://www.example.com/info/1285/test.htm |
查询字符串 | 一些键值对,格式:键=值,键值对之间用 & 分割,如 http://www.example.com/ex22/artical.php?id=9&page=12 |
片段标识符 | 锚链接,用于页面内跳转 |
1.4 超文本传输协议HTTP
超文本传输协议(HyperText Transfer Protocol,HTTP),一种应用层协议,用于Web 服务器传输超文本到本地浏览器的传输协议。
目前HTTP协议的版本主要包括HTTP1.0、HTTP1.1、HTTP2.0 和HTTP3.0。HTTP3.0 基于 UDP 实现,其他基于 TCP 实现,Web服务器需要监听在80/TCP端口。
HTTP是基于C/S架构进行通信的,而HTTP的服务器端实现程序有httpd、nginx、IIS等,其客户端的实现程序主要是Web浏览器,例如Firefox、Internet Explorer、Google Chrome、Safari等。
二、HTTP协议工作过程
为便于介绍HTTP协议工作过程,本人模拟了一个实验环境,环境中包括一台Web服务器,一台DNS服务器和一台客户端计算机,配置信息如图所示。假设客户端在浏览器地址栏中输入:http://php.example.com:8888/ex20-finish,访问Web服务器上的页面,下面我们通过使用Wireshark嗅探器,解析此访问过程,来理解HTTP协议的工作过程。
2.1 DNS解析
当用户在浏览器中输入http://php.example.com:8888/ex20-finish,客户端联系DNS服务器,查询Web服务器php.example.com的IP地址,如下图所示。
DNS服务器收到查询请求后,将查询结果返回给客户端,如下图:
2.2 TCP连接过程
HTTP协议是承载在TCP协议之上的,在实验中用到的Web服务器,使用的是TCP的8888端口。当客户端通过DNS查询到Web服务器的IP地址后,便通过TCP三次握手,与Web服务器建立TCP连接。TCP连接建立之后,开始HTTP通信,数据传输结束,双方断开TCP连接。整个通信过程如下图:
其中三次握手捕获的数据包如下图所示:
2.3 HTTP 请求与响应
HTTP由请求和响应构成,是一个标准的客户端服务器模型。HTTP协议都是客户端发起请求,服务器回送响应。本例中,客户端请求访问服务器的http://php.example.com:8888/ex20-finish页面,同时可以看到此页面还加载了其他资源,都是以请求、响应的方式来通信的。
2.4 TCP连接断开
通信结束,首先由服务器申请断开TCP连接,客户端确认,客户端通信结束,向服务器申请断开TCP连接,服务器确认,最终完成通信。
三、HTTP请求报文格式
客户端发送给服务器的请求报文包括请求行、请求头、空行和请求体四个部分组成。
3.1 请求行
请求行包括请求方法、URI和协议版本三个部分,中间用空格分隔。
1、请求方法
请求方法 | 作用 |
---|---|
GET | 用于请求指定资源。GET请求通常用于数据检索,请求的参数通常附加在URL后面。 |
POST | 用于向指定资源提交数据以创建或更新资源。POST请求通常包含在请求体中的数据,适用于提交表单或上传文件。 |
HEAD | 与GET方法相似,但HEAD不返回消息体,仅返回状态行和消息头。HEAD方法主要用于获取响应的元数据。 |
PUT | 用于将数据发送到服务器以创建或更新资源。PUT方法用上传的内容替换目标资源中的所有当前内容。 |
DELETE | 用于请求服务器删除指定的资源。DELETE请求会导致服务器删除URI指定的目标资源的所有当前内容。 |
OPTIONS | 用于获取当前URL支持的方法列表。OPTIONS请求返回服务器支持的方法列表 |
CONNECT | 用于建立到给定URI标识的服务器的隧道,通常用于实现HTTPS连接。 |
TRACE | 用于回显服务器收到的请求,主要用于测试或诊断。 |
2、URI
URL就是HTTP请求资源的地址,它配合消息头的 host 属性共同工作。
3、协议版本
HTTP 有多个版本,目前广泛使用的是 HTTP/1.1 和 HTTP/2,以及正在逐步推广的 HTTP/3。
-
HTTP/1.1:支持持久连接,允许多个请求/响应通过同一个 TCP 连接传输,减少了建立和关闭连接的消耗。
-
HTTP/2:基于二进制分帧,支持多路复用,允许同时通过单一的 HTTP/2 连接发起多重的、独立的、双向的交流。
-
HTTP/3:基于 QUIC 协议,旨在减少网络延迟,提高传输速度和安全性。
3.2 请求头
在HTTP请求报文中,请求头字段是发送 HTTP 请求时使用的首部字段,用于补充请求的额外信息,便于服务器理解请求的内容。如图所示:
1、Host
用于指定被请求资源的服务器和端口号,它通常从HTTP URL中提取出来的。如
Host:php.example.com:8888
2、Connection
keep-alive :当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。如
Connection: keep-alive
close :代表一个请求t完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送请求,需要重新建立TCP连接。
3、User-Agent
通知HTTP服务器,客户端使用的操作系统和浏览器的名称和版本,如
user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0
4、Accept
浏览器端可以接受的媒体类型,例如text/html 代表浏览器可以接受服务器回发的类型为 text/html、*/* 代表浏览器可以处理所有类型,使用 q= 权重值指定媒体类型的权重,默认权重为 q=1.0,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n
5、Content-Type
说明了请求体内对象的媒体类型,如:下面表示的是请求体内容是表单数据。
Content-Type: application/x-www-form-urlencoded
常见的媒体类型有:
媒体类型(值) | 格式 | 媒体类型(值) | 格式 |
---|---|---|---|
text/html | HTML格式 | text/plain | 纯文本格式 |
text/xml | XML格式 | image/gif | gif图片格式 |
image/jpeg | jpg图片格式 | image/png | png图片格式 |
application/xhtml+xml | XHTML格式 | application/xml | xML数据格式 |
application/ison | JSON数据格式 | application/pdf | pdf格式 |
application/msword | Word格式 | application/octet-stream | 二进制流数据 |
application/x-www-form-urlencoded | 表单提交 | application/atom +xml | Atom xML格式 |
6、Accept-Encoding
浏览器声明自己接收的编码方法,通常指定压缩方法,作用:是否支持压缩,支持什么压缩方法。如:
Accept-Encoding: gzip, deflate
7、Accept-Language
浏览器声明自己接收的语言。如:
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
8、Uprade-Insecure-Request
表示客户端对HTTPS加密和认证响应良好,可以请求所属网站所有的HTTPS资源。如:
Upgrade-Insecure-Requests: 1
9、Referer
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器是从哪个页面链接过来的。如:
Referer:http://php.example.com:8888/ex20-finish/
3.3 空行
请求头后面的空行是必须的,空行后面是请求体
3.4 请求体
在HTTP请求报文中,请求体用于向服务器传递数据。与HTTP请求头不同,HTTP请求体通常只在POST、PUT等方法中使用,而在GET等方法中不使用请求体。
HTTP请求体的格式与请求头有所不同,它通常是一个字符串或二进制流,可以携带各种类型的数据,携带的媒体类型不一样,请求体的内容则不相同。 例如,当请求体媒体内容为表单数据时(Content-Type: application/x-www-form-urlencoded),请求体的内容是表单提交数据,如:
username:testuser
password:mypasswd
四、HTTP响应报文格式
HTTP 的响应报文是服务器返回的数据,必须先有请求体再有响应报文。HTTP响应报文包括状态行、响应头、空行和响应体四个部分组成。
4.1 状态行
状态行包括协议版本、状态码和有总结代码含义的原因短语三个部分,中间用空格分隔。
1、状态码
HTTP状态码是服务器对客户端请求的响应。HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,分为五类。
状态码编号 | 状态码类型 | 状态码含义 |
---|---|---|
1XX | 信息性状态码 | 属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。 |
2XX | 成功状态码 | 表示服务器成功处理了客户端的请求。 |
3XX | 重定向状态码 | 表示客户端请求的资源发送了变动,需要客户端⽤新的 URL 新发送请求获取资源,也就是重定向。 |
4XX | 客户端错误状态码 | 表示客户端发送的报⽂有误,服务器⽆法处理。 |
5XX | 服务器错误状态码 | 表示客户端请求报⽂正确,但是服务器处理时内部发⽣了错误。 |
HTTP协议共包括42个状态码,其中常见的状态码如下表。
状态码 | 状态码的英文名称 | 中文描述 |
---|---|---|
200 | OK | 请求成功。一般用于GET与POST请求。 |
204 | No Content | 与 200OK 基本相同,但响应头没有 body 数据。 |
206 | Partial Content | 应⽤于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,⽽是其中的⼀部分。 |
301 | Moved Permanently | 表示永久定向,说明请求的资源已经不存在了,需改⽤新的 URL 再次访问。响应头⾥使⽤字段 Location ,指明后续要跳转的 URL,浏览器会⾃动定向新的 URL。 |
302 | Found | 表示临时定向,说明请求的资源还在,但暂时需要⽤另⼀个 URL 来访问。响应头⾥使⽤字段 Location ,指明后续要跳转的 URL,浏览器会⾃动定向新的 URL。 |
304 | Not Modified | 不具有跳转的含义,表示资源未修改,定向已存在的缓冲⽂件,也称缓存定向,⽤于缓存控制。 |
400 | Bad Request | 表示客户端请求的报⽂有错误,但只是个笼统的错误。 |
403 | Forbidden | 表示服务器禁⽌访问资源,并不是客户端的请求出错。 |
404 | Not Found | 表示请求的资源在服务器上不存在或未找到,所以⽆法提供给客户端。 |
500 | Internal Server Error | 笼统通⽤的错误码,服务器发⽣了什么错误,并不知道。 |
501 | Not Implemented | 表示客户端请求的功能还不⽀持。 |
502 | Bad Gateway | 通常是服务器作为⽹关或代理时返回的错误码,表示服务器⾃身⼯作正常,访问后端服务器发⽣了错误。 |
503 | Service Unavailable | 表示服务器当前很忙,暂时⽆法响应服务器。 |
504 | GetWay timeout | 表示网关超时。 |
505 | HTTP version not support | 表示的HTTP协议不支持。 |
2、原因短语
原因短语,也称为状态文本,它是人类可以阅读的文本,总结了状态码的含义。
4.2 响应头
HTTP 响应头信息是服务器在响应客户端的HTTP请求时发送的一系列头字段,它们提供了关于响应的附加信息和服务器的指令。在实际的 HTTP 响应中可能会有所不同,具体值取决于服务器的配置和处理逻辑。
响应消息中的 HTTP 头系列后放了一个空行,以将响应头与响应体分隔开。
1、Date:响应生成的日期和时间。例如:Date: Sat, 20 Apr 2024 04:44:47 GMT
2、Server:服务器软件的名称和版本。例如:Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9
3、Content-Type:响应体的媒体类型(MIME类型)。例如:Content-Type: text/html
4、Content-Length:响应体的大小,单位是字节。例如:689
5、Content-Encoding:响应体的压缩编码。例如:gzip,deflate等。
6、Content-Language:响应体的语言。例如:zh-CN
7、Content-Location:响应体的 URI。例如:/index.html
8、Content-Range:响应体的字节范围,用于分块传输。例如:bytes 0-999/8000
9、Connection:管理连接的选项,如keep-alive或close,keep-alive 表示连接不会在传输后关闭。
10、Set-Cookie:设置客户端的 cookie。
11、Expires:响应体的过期日期和时间。
12、Last-Modified:资源最后被修改的日期和时间。
13、Location:用于重定向的 URI。
4.3 响应体
对于对成功请求的响应,响应体包含客户端请求的资源,或有关客户端请求的操作状态的某些信息。 对于对不成功请求的响应,响应体可能提供有关错误原因的进一步信息,或有关客户端为了成功完成请求需要执行的某些操作的进一步信息。