计算机网络 - HTTP 协议和万维网

基本概念

  1. 万维网 (World Wide Web, WWW)
    • 定义:一个大规模的分布式信息系统,由全球范围内无数个网络站点和网页组成
    • 特点:基于超文本技术,支持多媒体内容的展示和交互
  2. URL (Uniform Resource Locator)
    • 定义:统一资源定位符,用于标识和定位互联网上的资源,不区分大小写
    • 基本格式:<协议>:// <主机>[:<端口号>]/<路径>
      • 协议:如 http、https、ftp 等
      • 主机:域名或 IP 地址
      • 端口号:(可选)默认 HTTP 为 80,HTTPS 为 443
  3. URI (Uniform Resource Identifier)
    • 定义:统一资源标识符,是一个用于标识抽象或物理资源的字符串
    • 组成
      • 命名机制:用于访问资源的协议
      • 主机名:存放资源的服务器标识
      • 资源名:资源在服务器上的具体位置和名称
    • 说明:URL 是 URI 的一个子集,URI 包含 URL 和 URN
  4. HTTP 协议
    • 定义:超文本传输协议 (Hypertext Transfer Protocol),用于在客户端和服务器之间传输数据,默认端口 80
    • 请求方式:规定了客户端向服务器请求数据的标准方法(如 GET、POST)
    • 响应方式:定义了服务器向客户端返回数据的标准格式
  5. HTTPS 协议
    • 定义:超文本传输安全协议 (Hypertext Transfer Protocol Secure),是 HTTP 的安全版本,默认端口 443
    • 工作原理:通过 SSL/TLS 协议对数据进行加密传输,确保数据安全性
    • 特点
      • 加密:对传输的数据进行加密,防止数据被窃取
      • 认证:通过数字证书验证服务器身份,防止钓鱼网站(中间人攻击)
      • 完整性:确保数据传输过程中不被篡改
  6. Cookie
    • 定义:存储在用户浏览器中的小型文本文件
    • 功能:用于记录一段时间内用户的会话状态和偏好设置,实现用户认证、会话跟踪和个性化服务
    • 特点:具有域名限制和有效期,可以被用户清除或禁用

通信过程

  1. 用户输入:用户在浏览器地址栏输入 URL 或点击链接
  2. 获取 IP:浏览器向 DNS 服务器发送域名查询请求,获取目标服务器的 IP 地址
  3. 返回 IP:DNS 服务器通过递归/迭代查询,解析出域名对应的 IP 地址并返回给浏览器
  4. 建立连接:浏览器与目标服务器通过三次握手建立 TCP 连接,确保可靠的数据传输
  5. 发送请求:浏览器构造 HTTP 请求报文(包含请求行、请求头、请求体),发送给服务器
  6. 处理请求:服务器接收并处理 HTTP 请求,根据请求内容生成响应报文返回给浏览器
  7. 接收响应:浏览器接收服务器响应,解析响应内容(如 HTML、CSS、JavaScript)并渲染页面
  8. 断开连接:数据传输完成后,浏览器与服务器通过四次挥手断开 TCP 连接,释放网络资源

连接方式

  1. 持久连接 (Persistent Connection)
    • 定义:HTTP/1.1 默认采用持久连接,在一个 TCP 连接上可以传送多个 HTTP 请求和响应
    • 优点:减少了 TCP 连接建立和关闭的开销,提高了传输效率
    • 特点:使用 Connection: keep-alive 头部来维持连接
  2. 非持久连接 (Non-Persistent Connection)
    • 定义:每个 HTTP 请求/响应都需要建立一个新的 TCP 连接,完成后立即关闭
    • 缺点:频繁建立和关闭连接会增加网络开销和延迟
    • 特点:HTTP/1.0 默认使用非持久连接,使用 Connection: close 头部

HTTP 协议

一、概述

  1. 定义:HTTP是一种应用层协议,用于规范浏览器和服务器之间的数据传输规则
  2. 特点
    1. 可靠传输:基于 TCP 协议,确保数据传输的可靠性和完整性
    2. 请求-响应:采用 request-response 模型,一次请求严格对应一次响应
    3. 无状态协议:服务器不保存客户端的状态信息,每次请求-响应都是独立的
    4. 简单灵活:协议简单易于实现,支持多种数据类型传输
  3. 缺点
    1. 无状态导致多次请求间不能共享数据,需要额外机制(如Cookie)维护会话
    2. 明文传输可能存在安全隐患(可以通过HTTPS改进)
  4. 优点
    1. 处理速度快,服务器不需要保存状态信息
    2. 服务器压力小,适合处理大量并发请求

二、Request 结构

  1. 请求行 (request line)

    1. 请求方式:GET / POST / DELETE / UPDATE
    2. 资源路径:IP / port / resource
    3. 协议 : 使用的 HTTP 协议版本,例如:HTTP/1.1
  2. 请求头 (request heads)

    属性 解释 功能
    User-Agent 我是谁? 浏览器版本
    Referer 来自哪里? 跳转到此界面的网页(防盗链功能、统计功能)
    Host 发往哪里? 当前请求发往的主机名
    Content-Type 我带了什么东西? 请求主体的数据类型
    Content-Length 我带了多少东西? 请求主体的大小 (单位 : 字节)
    Accpet 我希望收到什么? 浏览器能接收的资源类型
    Accpet-Language 我能看懂什么? 浏览器支持的语言类型
    Accept-Encoding 我能解压什么? 浏览器支持的压缩类型
  3. 请求体 (request body)

    1. 定义:POST 和 PUT 请求特有的部分
    2. 功能:包含客户端需要传输的数据,存放被请求头所描述的请求参数 (传送的数据)
  4. 示例

    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 结构

  1. 响应行 (Status Line)

    属性 功能
    协议 & 协议版本 使用的 HTTP 协议版本,例如:HTTP/1.1
    状态码 响应状态信息,例如:200 / 404 / 500
    状态码描述 响应状态信息的说明,由后端自定义返回内容
  2. 响应头 (Response Headers)

    属性 功能
    Content-Type 响应内容的类型
    Content-Length 响应内容的长度
    Content-Encoding 响应内容的编码方式
    Cache-Control 客户端缓存的方式
    Set-Cookie 告诉浏览器为当前页面所在的域设置 cookie
  3. 响应体 (Response Body):客户端请求的 "实际数据",即客户端需要的内容

  4. 示例

    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
    

四、解析协议

  1. 目标 : 解析 HTTP 请求,并返回结果
  2. 实现 : 直接使用 Tomcat 封装好的方法即可

五、请求方法

GET

  1. 功能:请求指定的页面信息,并返回 ResponseBody(即 HTTP 请求的主体内容,可以是任何类型数据,但是 JSON 是主流)
  2. JSON 优点
    1. 可读性好、跨语言兼容性好
    2. 结构灵活,可以表示简单数据类型 / 数组 / 对象,可以用来传递复杂的数据结构
    3. Web 标准兼容,大多数Web API和 RESTful 服务采用JSON作为数据交换格式
  3. 适用场景
    1. 数据检索操作
    2. 请求可以被缓存,不涉及敏感信息的简单数据传输

POST

  1. 功能
    1. 提交请求体(RequestBody)中的数据并请求服务器处理,例如提交表单或上传文件
    2. 实现新的资源的建立或已有资源的修改
  2. 适用场景
    1. 提交表单数据或上传文件,创建或修改服务器上的资源
    2. 需要传输大量数据或敏感信息的场景

GET v.s. POST

GET POST
数据传输方式 附加在 URL 后 附加在 RequestBody 中
安全性 不安全 (URL 可见) 相对安全 (RequestBody 中)
数据大小限制 URL 长度有限,适合小数据传输 适合传输大量数据,没有大小限制
缓存和历史记录 可以被缓存,会留在浏览器历史记录中 不会被缓存,也不会留在浏览器历史记录中
幂等性 幂等,多次发起相同的GET请求应该得到相同的结果 非幂等,多次请求可能有不同结果
  1. 功能:与 GET 类似,但仅返回响应头部(Header),不包括响应体(ResponseBody)
  2. 适用场景:用于获取资源的元信息(如文件大小、最后修改时间),而无需下载整个内容

Servlet & HttpServletRequest & HttpServletResponse

参考资料:

  1. Servlet超详解+流程图_servlet请求处理过程图-CSDN博客
  2. 【JavaWeb】Servlet系列------HttpServletRequest接口详解 - 掘金 (juejin.cn)

定义

  1. Servlet:javax.servlet 包中定义的接口,声明了 Servlet 生命周期的三个基本方法:init()、service() 和 destroy()
  2. HttpServletRequest & HttpServletResponse
    1. 定义:Java EE 中的一个接口,定义在 javax.servlet.http 包中,用于表示 "HTTP 请求" 和 "HTTP 响应"
    2. 创建时间:由 Servlet 容器(如 Tomcat、Jetty)在接收 HTTP 请求之后、调用 service() 方法之前创建

功能

  1. HttpServletRequest :保存请求中所有的信息

工作流程

  1. 发送请求:"浏览器" 向 "Web服务器" 发送 HTTP 请求

  2. 接收请求 & 创建对象:"Web服务器" 根据接收的 HTTP 请求,创建 HttpServletRequest 和 HttpServletResponse 对象

  3. 转发请求

    1. "Web 服务器" 将 Requset 和 Response 对象转发到 "Servlet容器"
    2. "Servlet 容器" 将 Requset 和 Response 对象转发给对应 Servlet (如果对应的 Servlet 不在容器中,则创建加载到容器的地址空间中)
  4. 初始化 Servlet:"Servlet容器" 调用 init() 方法进行初始化(仅在第一次加载 Servlet 时调用一次)

  5. 处理请求:"Servlet容器" 调用 service() 方法处理 HTTP 请求,即读取请求中的数据并构建响应

  6. 暂存 Servlet:Servlet 将暂时保留在容器的地址空间中,可以继续处理其它 HTTP 请求

  7. 返回结果:"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

  1. 定义:一个接口,客户端第一次请求服务器时,服务器在内存中为当前用户创建的一个 "HttpSession 对象"

  2. 功能:一个 "HttpSession对象" 负责维护 "一个客户端的会话状态",用于同一用户在多个 HTTP 请求之间保存用户状态信息

  3. 生命周期

    1. 创建:第一次调用request.getSession()时,服务器会为该客户端创建一个新的HttpSession对象,存入内存
    2. 维持:会话期间调用request.getSession()时,服务器通过 sessionId 返回与之关联的HttpSession对象,用于维持用户状态信息
    3. 销毁:会话结束调用request.getSession().invalidate()时,服务器会销毁该客户端对应的HttpSession对象
  4. 常用方法

    方法 功能
    1. setAttribute("attributeName", attributeValue); 设置(添加)属性
    2. getAttribute("attributeName", attributeValue); 获取属性
    3. removeAttribute("attributeName"); 移除属性
    4. String getId() 获取会话 ID
    5. setMaxInactiveInterval(30 * 60) 设置最大不活动间隔
    6. invalidate() 使会话无效
相关推荐
咩咩觉主13 分钟前
Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
java·unity·游戏引擎
Q_192849990619 分钟前
基于Spring Boot的房屋租赁管理系统
java·spring boot·后端
天天进步201522 分钟前
Java全栈项目 - 学生档案管理系统
java·开发语言
清弦墨客28 分钟前
【蓝桥杯】43696.小数第n位
java·c语言·c++·python·蓝桥杯
Best_Me071 小时前
最短路径C++
java·c++·算法
我叫啥都行1 小时前
计算机基础知识复习12.20
java·jvm·笔记·后端·sql
Adellle1 小时前
docker容器镜像拉取失败解决方案
java·docker·容器
zfoo-framework1 小时前
【SpringBoot中SpringMVC服务之处理post请求】
java·spring boot·spring
小码哥说测试1 小时前
Charles简单压力测试
自动化测试·软件测试·网络协议·selenium·接口测试·压力测试·postman
陈大爷(有低保)2 小时前
mybatisPlus使用步骤详解
java·后端·mybatis