计算机网络 - HTTP 协议和万维网
基本概念
万维网 (World Wide Web, WWW)
- 定义:一个大规模的分布式信息系统,由全球范围内无数个网络站点和网页组成
- 特点:基于超文本技术,支持多媒体内容的展示和交互
URL (Uniform Resource Locator)
- 定义:统一资源定位符,用于标识和定位互联网上的资源,不区分大小写
- 基本格式:<协议>:// <主机>[:<端口号>]/<路径>
- 协议:如 http、https、ftp 等
- 主机:域名或 IP 地址
- 端口号:(可选)默认 HTTP 为 80,HTTPS 为 443
URI (Uniform Resource Identifier)
- 定义:统一资源标识符,是一个用于标识抽象或物理资源的字符串
- 组成
- 命名机制:用于访问资源的协议
- 主机名:存放资源的服务器标识
- 资源名:资源在服务器上的具体位置和名称
- 说明:URL 是 URI 的一个子集,URI 包含 URL 和 URN
HTTP 协议
- 定义:超文本传输协议 (Hypertext Transfer Protocol),用于在客户端和服务器之间传输数据,默认端口 80
- 请求方式:规定了客户端向服务器请求数据的标准方法(如 GET、POST)
- 响应方式:定义了服务器向客户端返回数据的标准格式
HTTPS 协议
- 定义:超文本传输安全协议 (Hypertext Transfer Protocol Secure),是 HTTP 的安全版本,默认端口 443
- 工作原理:通过 SSL/TLS 协议对数据进行加密传输,确保数据安全性
- 特点
- 加密:对传输的数据进行加密,防止数据被窃取
- 认证:通过数字证书验证服务器身份,防止钓鱼网站(中间人攻击)
- 完整性:确保数据传输过程中不被篡改
Cookie
- 定义:存储在用户浏览器中的小型文本文件
- 功能:用于记录一段时间内用户的会话状态和偏好设置,实现用户认证、会话跟踪和个性化服务
- 特点:具有域名限制和有效期,可以被用户清除或禁用
通信过程
- 用户输入:用户在浏览器地址栏输入 URL 或点击链接
- 获取 IP:浏览器向 DNS 服务器发送域名查询请求,获取目标服务器的 IP 地址
- 返回 IP:DNS 服务器通过递归/迭代查询,解析出域名对应的 IP 地址并返回给浏览器
- 建立连接:浏览器与目标服务器通过三次握手建立 TCP 连接,确保可靠的数据传输
- 发送请求:浏览器构造 HTTP 请求报文(包含请求行、请求头、请求体),发送给服务器
- 处理请求:服务器接收并处理 HTTP 请求,根据请求内容生成响应报文返回给浏览器
- 接收响应:浏览器接收服务器响应,解析响应内容(如 HTML、CSS、JavaScript)并渲染页面
- 断开连接:数据传输完成后,浏览器与服务器通过四次挥手断开 TCP 连接,释放网络资源
连接方式
持久连接 (Persistent Connection)
- 定义:HTTP/1.1 默认采用持久连接,在一个 TCP 连接上可以传送多个 HTTP 请求和响应
- 优点:减少了 TCP 连接建立和关闭的开销,提高了传输效率
- 特点:使用 Connection: keep-alive 头部来维持连接
非持久连接 (Non-Persistent Connection)
- 定义:每个 HTTP 请求/响应都需要建立一个新的 TCP 连接,完成后立即关闭
- 缺点:频繁建立和关闭连接会增加网络开销和延迟
- 特点:HTTP/1.0 默认使用非持久连接,使用 Connection: close 头部
HTTP 协议
一、概述
定义
:HTTP是一种应用层协议,用于规范浏览器和服务器之间的数据传输规则特点
- 可靠传输:基于 TCP 协议,确保数据传输的可靠性和完整性
- 请求-响应:采用 request-response 模型,一次请求严格对应一次响应
- 无状态协议:服务器不保存客户端的状态信息,每次请求-响应都是独立的
- 简单灵活:协议简单易于实现,支持多种数据类型传输
缺点
- 无状态导致多次请求间不能共享数据,需要额外机制(如Cookie)维护会话
- 明文传输可能存在安全隐患(可以通过HTTPS改进)
优点
- 处理速度快,服务器不需要保存状态信息
- 服务器压力小,适合处理大量并发请求
二、Request 结构
-
请求行
(request line)- 请求方式:GET / POST / DELETE / UPDATE
- 资源路径:IP / port / resource
- 协议 : 使用的 HTTP 协议版本,例如:HTTP/1.1
-
请求头
(request heads)属性 解释 功能 User-Agent 我是谁? 浏览器版本 Referer 来自哪里? 跳转到此界面的网页(防盗链功能、统计功能) Host 发往哪里? 当前请求发往的主机名 Content-Type 我带了什么东西? 请求主体的数据类型 Content-Length 我带了多少东西? 请求主体的大小 (单位 : 字节) Accpet 我希望收到什么? 浏览器能接收的资源类型 Accpet-Language 我能看懂什么? 浏览器支持的语言类型 Accept-Encoding 我能解压什么? 浏览器支持的压缩类型 -
请求体
(request body)- 定义:POST 和 PUT 请求特有的部分
- 功能:包含客户端需要传输的数据,存放被请求头所描述的请求参数 (传送的数据)
-
示例
GET /hello.txt HTTP/1.1 User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Host: www.example.com Accept-Language: en, mi
三、Response 结构
-
响应行
(Status Line)属性 功能 协议 & 协议版本 使用的 HTTP 协议版本,例如:HTTP/1.1 状态码 响应状态信息,例如:200 / 404 / 500 状态码描述 响应状态信息的说明,由后端自定义返回内容 -
响应头
(Response Headers)属性 功能 Content-Type 响应内容的类型 Content-Length 响应内容的长度 Content-Encoding 响应内容的编码方式 Cache-Control 客户端缓存的方式 Set-Cookie 告诉浏览器为当前页面所在的域设置 cookie -
响应体
(Response Body):客户端请求的 “实际数据”,即客户端需要的内容 -
示例
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
四、解析协议
目标
: 解析 HTTP 请求,并返回结果实现
: 直接使用 Tomcat 封装好的方法即可
五、请求方法
GET
功能
:请求指定的页面信息,并返回 ResponseBody(即 HTTP 请求的主体内容,可以是任何类型数据,但是 JSON 是主流)- JSON 优点
- 可读性好、跨语言兼容性好
- 结构灵活,可以表示简单数据类型 / 数组 / 对象,可以用来传递复杂的数据结构
- Web 标准兼容,大多数Web API和 RESTful 服务采用JSON作为数据交换格式
适用场景
- 数据检索操作
- 请求可以被缓存,不涉及敏感信息的简单数据传输
POST
功能
- 提交请求体(RequestBody)中的数据并请求服务器处理,例如提交表单或上传文件
- 实现新的资源的建立或已有资源的修改
适用场景
- 提交表单数据或上传文件,创建或修改服务器上的资源
- 需要传输大量数据或敏感信息的场景
GET v.s. POST
GET | POST | |
---|---|---|
数据传输方式 | 附加在 URL 后 | 附加在 RequestBody 中 |
安全性 | 不安全 (URL 可见) | 相对安全 (RequestBody 中) |
数据大小限制 | URL 长度有限,适合小数据传输 | 适合传输大量数据,没有大小限制 |
缓存和历史记录 | 可以被缓存,会留在浏览器历史记录中 | 不会被缓存,也不会留在浏览器历史记录中 |
幂等性 | 幂等,多次发起相同的GET请求应该得到相同的结果 | 非幂等,多次请求可能有不同结果 |
HEAD
- 功能:与 GET 类似,但仅返回响应头部(Header),不包括响应体(ResponseBody)
- 适用场景:用于获取资源的元信息(如文件大小、最后修改时间),而无需下载整个内容
Servlet & HttpServletRequest & HttpServletResponse
参考资料:
- Servlet超详解+流程图_servlet请求处理过程图-CSDN博客
- 【JavaWeb】Servlet系列——HttpServletRequest接口详解 - 掘金 (juejin.cn)
定义
- Servlet:javax.servlet 包中定义的接口,声明了 Servlet 生命周期的三个基本方法:init()、service() 和 destroy()
- HttpServletRequest & HttpServletResponse
- 定义:Java EE 中的一个接口,定义在 javax.servlet.http 包中,用于表示 “HTTP 请求” 和 “HTTP 响应”
- 创建时间:由 Servlet 容器(如 Tomcat、Jetty)在接收 HTTP 请求之后、调用 service() 方法之前创建
功能
- HttpServletRequest :保存请求中所有的信息
工作流程
-
发送请求:“浏览器” 向 “Web服务器” 发送 HTTP 请求
-
接收请求 & 创建对象:“Web服务器” 根据接收的 HTTP 请求,创建 HttpServletRequest 和 HttpServletResponse 对象
-
转发请求
- “Web 服务器” 将 Requset 和 Response 对象转发到 “Servlet容器”
- “Servlet 容器” 将 Requset 和 Response 对象转发给对应 Servlet (如果对应的 Servlet 不在容器中,则创建加载到容器的地址空间中)
-
初始化 Servlet:“Servlet容器” 调用 init() 方法进行初始化(仅在第一次加载 Servlet 时调用一次)
-
处理请求:“Servlet容器” 调用 service() 方法处理 HTTP 请求,即读取请求中的数据并构建响应
-
暂存 Servlet:Servlet 将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求
-
返回结果:“Web服务器” 将动态生成的结果返回到 “浏览器”
常用方法
类别 | 命令 | 功能 |
---|---|---|
获取请求行信息 | getMethod() | 获取请求方法(GET / POST) |
getRequestURI() | 获取请求的资源名称(位于 URL 的主机和端口之后,参数部分之前的部分) | |
getQueryString() | 获取请求行中的参数部分(URL 中"?"以后的所有内容) | |
getProtocol() | 获取协议和版本信息 | |
获取请求头信息 | getHeader(String name) | 获取指定名称的请求头 |
getHeaders(String name) | 获取指定名称的所有请求头 | |
getHeaderNames() | 获取所有请求头的名称 | |
获取请求体信息 | getInputStream() | 获取请求体的输入流,用于读取请求体的数据 |
getReader() | 获取请求体的字符读取器,用于读取请求体的数据 | |
获取请求参数 | getParameter(String name) | 获取指定名称的请求参数 |
getParameterMap() | 获取所有请求参数及其值 | |
其他常用方法 | getSession() | 获取与请求关联的会话(session) |
getCookies() | 获取请求中包含的所有 cookie |
HttpSession
-
定义:一个接口,客户端第一次请求服务器时,服务器在内存中为当前用户创建的一个 “HttpSession 对象”
-
功能:一个 “HttpSession对象” 负责维护 “一个客户端的会话状态”,用于同一用户在多个 HTTP 请求之间保存用户状态信息
-
生命周期
- 创建:第一次调用
request.getSession()
时,服务器会为该客户端创建一个新的HttpSession
对象,存入内存 - 维持:会话期间调用
request.getSession()
时,服务器通过 sessionId 返回与之关联的HttpSession
对象,用于维持用户状态信息 - 销毁:会话结束调用
request.getSession().invalidate()
时,服务器会销毁该客户端对应的HttpSession
对象
- 创建:第一次调用
-
常用方法
方法 功能 1. setAttribute(”attributeName”, attributeValue); 设置(添加)属性 2. getAttribute(”attributeName”, attributeValue); 获取属性 3. removeAttribute("attributeName"); 移除属性 4. String getId() 获取会话 ID 5. setMaxInactiveInterval(30 * 60) 设置最大不活动间隔 6. invalidate() 使会话无效