目录
一、WWW的相关概念
1.1 WWW的定义
1.2 超文本标记语言HTML
1.3 统一资源定位符URL
1.4 超文本传输协议HTTP
二、HTTP协议工作过程
2.1 DNS解析
2.2 TCP连接过程
2.3 HTTP 请求与响应
2.4 TCP连接断开
三、HTTP请求报文格式
3.1 请求行
3.2 请求头
3.3 空行
3.4 请求体
四、HTTP响应报文格式
4.1 状态行
4.2 响应头
4.3 响应体
一、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 响应体
对于对成功请求的响应,响应体包含客户端请求的资源,或有关客户端请求的操作状态的某些信息。 对于对不成功请求的响应,响应体可能提供有关错误原因的进一步信息,或有关客户端为了成功完成请求需要执行的某些操作的进一步信息。