当前位置: 首页 > article >正文

计算机网络 - 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

GETPOST
数据传输方式附加在 URL 后附加在 RequestBody 中
安全性不安全 (URL 可见)相对安全 (RequestBody 中)
数据大小限制URL 长度有限,适合小数据传输适合传输大量数据,没有大小限制
缓存和历史记录可以被缓存,会留在浏览器历史记录中不会被缓存,也不会留在浏览器历史记录中
幂等性幂等,多次发起相同的GET请求应该得到相同的结果非幂等,多次请求可能有不同结果

HEAD

  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()使会话无效


http://www.kler.cn/a/445586.html

相关文章:

  • java集合基础
  • C++中如何处理对象的状态变化
  • WebGL入门到进阶教程 - 系统学习Web3D技术
  • 鸿蒙项目云捐助第十五讲云数据库的初步使用
  • 基于Spring Boot的数码产品抢购系统
  • 0101多级nginx代理websocket配置-nginx-web服务器
  • 【操作系统】基于信号量与PV操作解决东西向汽车过独木桥问题
  • GMSSL的不同python版本
  • Chapter 18 CMOS Processing Technology
  • HTML 有效 DOCTYPES
  • 算法题(10):好数
  • STM32-- keil -常用功能
  • Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
  • 并发修改导致MVCC脏写问题
  • 【后端面试总结】什么是CAP原理
  • 常用es命令
  • 网络协议栈学习(一)socket通信实例
  • 王佩丰24节Excel学习笔记——第十四讲:日期函数
  • 我的性能优化经验
  • 中间件 mysql安装
  • SpringCloud 集成 Eureka服务,本机测试
  • 如何快速提升网站的Google SEO流量?
  • 微信小程序:获取,修改data中的数据(直接取出,通过变量取出)
  • 阿里云Maven库地址、查看各个版本的jar包
  • Python球球大作战
  • petalinux 错误汇总