Java-网络编程

这篇具有很好参考价值的文章主要介绍了Java-网络编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


☁️ 网络的概念


  • 网络是指通过电缆、无线电波或者其他方法连接在一起的一系列节点的集合。在计算机科学和信息技术领域,网络特指计算机网络,它是一组相互连接的、自治的计算机系统。
    Java-网络编程,Java-基础,java,网络,php

📐 结构

  • 🏢 边缘部分

    • 连接网络的计算机、手机、服务器等
  • 🔗 核心部分

    • 路由器、交换机等设备
    • 负责数据传输和路由
  • 🌐 接入网络

    • 将用户设备连接到核心网络
    • 包括家庭网络、企业网络等
  • 🔗 网络拓扑

    • 星形、环形、总线形等节点布局
  • 📶 协议层次

    • 遵循 OSI 模型或 TCP/IP 模型

🔬 原理

  • 📦 数据封装和分层传输

    • 遵循 TCP/IP 协议栈
    • 数据封装成特定格式的数据包
  • 🔄 路由和转发

    • 路由器决定数据包路径
    • 交换机在局部环境中转发
  • 🌐 地址和标识

    • 网络设备有唯一的 IP 地址
  • 🛠️ 错误控制和流量控制

    • 错误检测和纠正
    • 控制数据传输速率,避免拥塞
  • 🔄 交互协议

    • HTTPFTP 等定义客户端与服务器交互规则
  • 🔒 网络安全

    • 加密、身份验证、访问控制

⚠️ 注意: 网络的安全性是一个持续发展的领域,随着技术的进步,新的安全措施和协议不断被开发出来以应对新的挑战。


💻 网络通信协议及接口

  • 网络通信协议和接口是计算机网络中数据传输的基础,它们规定了如何在不同设备和服务之间传递信息。
    Java-网络编程,Java-基础,java,网络,phpJava-网络编程,Java-基础,java,网络,php

🔗 网络通信协议

  • 🌐 应用层

    • HTTP:用于浏览网页。
    • HTTPS:安全的网页浏览。
    • FTP:文件传输。
    • SMTP:发送邮件。
    • POP3/IMAP:接收邮件。
  • 🛰️ 传输层

    • TCP:可靠的连接。
    • UDP:快速传输。
  • 🌍 网络层

    • IP:寻址和路由。
    • ICMP:网络诊断。
  • 🔌 链路层

    • Ethernet:局域网数据传输。
    • PPP:点对点连接。

🔌 网络接口

  • 🌐 物理接口

    • RJ45:有线连接。
    • 无线网卡:无线连接。
  • 🖧 软件接口

    • 网络 API:如 Winsock
    • SDK:开发网络服务。
  • 🛠️ 设备接口

    • 交换机和路由器管理。
    • 设备间通信:如 SNMP

⚠️ 注意: 网络协议和接口的选择取决于应用需求、网络环境和安全考虑。随着技术的发展,这些协议和接口也在不断进化。


📡 IP 协议

  • IPInternet Protocol)是一种用于在网络中发送数据包的协议,是互联网的基础通信协议之一。它定义了数据包的地址标签、传输机制和路由选择。
    Java-网络编程,Java-基础,java,网络,php

🚩 IP 协议的特点

  • 📌 地址分配

    • 每个设备分配一个唯一的 IP 地址
    • 地址用于识别网络中的设备
  • 🔄 数据包传输

    • 数据分成小块,称为数据包
    • 每个数据包包含源和目的 IP 地址
  • 🌍 路由

    • IP 路由器将数据包从源传送到目的地
    • 路由器使用路由表来确定最佳路径
  • 🛠️ 不可靠性

    • IP 不保证数据包的可靠传输
    • 不保证数据包的顺序、完整性或不重复

📐 IP 协议的版本

  • IPv4

    • 32位地址,形式如 192.168.0.1
    • 地址空间限制,最多约 43 亿个地址
  • IPv6

    • 128位地址,形式如 2001:0db8:85a3:0000:0000:8a2e:0370:7334
    • 提供几乎无限的地址空间

🔬 IP 协议的原理

  • 📦 数据封装

    • IP 数据包包含头部和数据部分
    • 头部包含控制信息,如版本、长度、IP 地址等
  • 🔄 分片和重组

    • 大数据包在传输时可能被分成更小的片段
    • 接收端将这些片段重组为原始数据包
  • 🛠️ 错误检测

    • IP 头部包含校验和,用于错误检测
    • 不提供错误修正机制

⚠️ 注意: IPv4 地址的耗尽导致了 IPv6 的开发,后者提供了更先进的特性,如自动配置、端到端连接、改进的安全性等。随着互联网的发展,IPv6 正在逐渐取代 IPv4


🌐 TCP (TCP(Transmission Control Protocol))

TCP 是一种在计算机网络中用于可靠数据传输的协议。它是一种面向连接的协议,确保数据在发送和接收之间的可靠性和有序性。

  • 🔗 建立连接:

    • 🅰️ 第一次握手(SYN): 客户端发送一个请求,称为SYN(同步序列号)包,指示其想要建立连接。这个包包含一个初始的序列号。
    • 🅱️ 第二次握手(SYN-ACK): 服务器收到客户端的请求后,确认并发送一个SYN-ACK包作为响应。这个包表示服务器同意建立连接,并包含服务器的初始序列号。
    • 🅾️ 第三次握手(ACK): 客户端收到服务器的SYN-ACK包后,发送一个ACK(确认)包,表示连接已建立。此时,双方都知道彼此已准备好发送数据。
  • 🔄 数据传输:

    • 一旦连接建立,数据传输就可以开始。数据被分割成小的数据段(segment),每个数据段都有一个序列号,以便接收端能够按正确的顺序重新组装数据。
    • TCP 还提供流量控制和拥塞控制,以确保网络上的性能和稳定性。
  • 数据确认和重传:

    • 一旦接收端收到数据段,它会发送一个确认(ACK)给发送端,指示已成功接收。如果发送端在一定时间内未收到确认,它会认为数据丢失,然后重新发送该数据段。
  • 🚫 连接终止:

    • 🅰️ 第一次挥手(FIN): 一方发送一个FIN包,表示它不再发送数据。
    • 🅱️ 第二次挥手(ACK): 另一方收到FIN后,发送一个ACK包作为确认。
    • 🅾️ 第三次挥手(FIN): 另一方也发送一个FIN包,表示它的数据发送已完成。
    • 第四次挥手(ACK): 第一方收到FIN后,发送最后一个ACK包作为确认。连接现在已经终止。
      Java-网络编程,Java-基础,java,网络,php
      Java-网络编程,Java-基础,java,网络,php
      Java-网络编程,Java-基础,java,网络,php

⚠️ 注意: TCP 在网络上确保了数据的可靠性和完整性。


⚡️ UDP (UDP(User Datagram Protocol))

UDP 是一种在计算机网络中用于数据传输的简单协议。与 TCP 相比,UDP 的特点是无连接性、无序性和不可靠性,这使其更加轻量级。


🚀 UDP 传输过程:
UDP 的数据传输过程相对简单,不涉及复杂的握手或连接终止过程。

  1. 📝 构建数据报: 发送端根据需要构建UDP数据报。
  2. 📩 发送数据报: 数据报被直接发送到目的IP地址。
  3. 📥 接收数据报: 接收端收到数据报,并根据需要进行处理。
  4. 无确认: 接收端不会发送任何确认。

⚠️ 注意: 由于没有确认机制,发送端无法知道数据报是否已成功到达接收端。


📢 特点:

  • 📭 无连接性:

    • 📌 UDP 不需要建立连接。
    • 📌 数据报可以独立发送。
    • 📌 发送端可以随时发送数据报到接收端。
  • 📝 数据报格式:

    • 🔴 源端口号: 标识数据报来源。
    • 🔴 目标端口号: 标识数据报的目的地。
    • 🔴 长度: 指示数据报的大小。
    • 🔴 校验和: 用于检测传输错误。
    • 🔴 数据: 实际要传输的内容。
  • 🔄 无序性:

    • 📌 数据报的传输没有固定顺序。
    • 📌 数据报可以以任意顺序到达。
  • 不可靠性:

    • 📌 UDP 不发送确认消息。
    • 📌 丢失的数据报不会被重传。
  • 🎮 应用场景:

    • 📌 实时音频和视频流。
    • 📌 在线游戏。
    • 📌 VoIP 通话等。

⚠️ 注意: 由于 UDP 的不可靠性,某些应用可能需要在应用层实现自己的确认和重传机制。


🔄 TCP 和 UDP 的区别
TCP 和 UDP 是两种不同的传输层协议,具有不同的特点和用途。

  • 🔄 连接性:

    • TCP: 是一种面向连接的协议。
    • UDP: 是一种无连接的协议。
  • 可靠性:

    • TCP: 提供了可靠的数据传输。
    • UDP: 数据的可靠性较低。
  • 🔄 有序性:

    • TCP: 确保数据有序。
    • UDP: 数据报可以以任意顺序到达接收端。
  • 🚀 开销和效率:

    • TCP: 提供可靠性和有序性,但有较高的开销。
    • UDP: 是一种轻量级的协议,没有连接的建立和断开过程。

⚠️ 注意: 选择使用 TCP 还是 UDP 取决于应用程序的需求和优先级。


🌌 HTTP & HTTPS

🔗 这两种协议都用于计算机网络间的数据传输。它们主要应用于客户端(如Web浏览器)与服务器之间,传输超文本(如网页)和其他资源,从而使用户能够全球范围地浏览互联网内容。以下是它们的特点和工作流程:


🔄 HTTP & HTTPS 特点

  1. 🛡️ 安全性:

    • HTTP: 数据以明文形式发送,不安全。
    • HTTPS: 数据经过加密,安全,基于SSL/TLS实现。
  2. 📜 证书和身份验证:

    • HTTP: 不需要身份验证。
    • HTTPS: 使用数字证书来验证服务器的身份。
  3. 🚪 通信端口:

    • HTTP: 默认使用端口80。
    • HTTPS: 默认使用端口443。
  4. 🚀 性能:

    • HTTP: 无加密,传输快速。
    • HTTPS: 数据传输有加密过程,相对稍慢。
  5. 🔍 搜索引擎排名:

    • HTTP: 在SEO中可能排名较低。
    • HTTPS: 更受搜索引擎青睐。

⚠️ 注意: 大多数现代网站已转向使用HTTPS,因为它提供更高的数据保护。


🔄 HTTP & HTTPS 请求到服务器的过程

🔗 无论是HTTP还是HTTPS,请求到服务器的基本过程都相似,但HTTPS有额外的加密和身份验证步骤:

  1. 🌐 DNS解析: 通过DNS将服务器域名转为IP地址。
  2. 🤝 建立TCP连接: 使用TCP与服务器建立连接。
  3. 🛡️ TLS握手 (仅HTTPS): 安全握手过程,包括身份验证和密钥交换。
  4. 🚀 构建HTTP请求: 客户端创建请求。
  5. 📩 发送请求: 使用HTTP或加密的HTTPS发送到服务器。
  6. 🖥️ 服务器处理请求: 服务器解析并处理请求。
  7. 📤 发送响应: 服务器发送响应给客户端。
  8. 🖱️ 客户端接收和处理响应: 客户端解析响应内容。
  9. 🔌 关闭连接: 双方关闭连接。

⚠️ 注意: 实际请求可能受到缓存、负载均衡和其他因素的影响,使得过程变得更加复杂。


📧 SMTP (Simple Mail Transfer Protocol)

  • 🔹 SMTP是电子邮件的主要发送协议。

  • 🔹 它工作在应用层,与TCP层协同工作,通常使用端口25

  • 🔹 主要特点:

    • 🔸 快速: 能够快速地传递消息。
    • 🔸 可靠: 确保邮件送达。
    • 🔸 方向性: 仅用于发送邮件,不涉及接收。
  • 🔹 SMTP的工作过程涉及多个步骤:

    1. 连接建立:

      • 🔸 客户端建立与SMTP服务器的TCP连接。

      • 🔸 服务器返回一个220状态码,表示服务就绪。

    2. 握手:

      • 🔸 客户端发送HELO命令,介绍自己。

      • 🔸 服务器确认握手。

    3. 邮件传输:

      • 🔸 客户端使用MAIL FROM命令指定发件人。

      • 🔸 使用RCPT TO命令指定收件人。

      • 🔸 使用DATA命令发送邮件正文。

    4. 结束:

      • 🔸 使用QUIT命令结束会话。

⚠️ 注意: SMTP仅用于发送邮件。为接收邮件,通常使用IMAPPOP3


📁 FTP (File Transfer Protocol)

  • 🔹 FTP是用于在计算机网络上进行文件传输的协议。

  • 🔹 它可以用于上传和下载文件,以及管理远程文件和目录。

  • 🔹 主要特点:

    • 🔸 双向传输: 可以上传和下载文件。
    • 🔸 明文传输: 默认情况下不加密,可能存在安全隐患。
    • 🔸 目录访问: 允许浏览和管理远程文件和目录。
  • 🔹 FTP的工作过程涉及多个步骤:

    1. 连接建立:

      • 🔸 客户端建立与FTP服务器的TCP连接。

      • 🔸 通常使用端口21

    2. 登录:

      • 🔸 客户端提供用户名和密码登录。

      • 🔸 匿名登录也是可能的。

    3. 命令交互:

      • 🔸 客户端和服务器交换命令和响应。

      • 🔸 包括文件上传、下载、列表获取等。

    4. 数据传输:

      • 🔸 文件数据在不同的TCP连接上进行传输。
    5. 断开连接:

      • 🔸 一旦文件传输完成,连接会断开。

⚠️ 注意: FTP是明文协议,存在安全隐患。使用SFTPFTPS增加安全性。


🔒 SSH (Secure Shell)

  • 🔹 SSH是一个用于安全地进行远程登录和数据传输的协议。

  • 🔹 通过加密技术,SSH确保数据在传输过程中的隐私和完整性。

  • 🔹 主要特点:

    • 🔸 加密: 使用强加密技术保护数据。
    • 🔸 身份验证: 支持多种身份验证方法。
    • 🔸 通用性: 除了命令执行,还支持文件传输等功能。
  • 🔹 SSH的工作过程涉及多个步骤:

    1. 连接建立:

      • 🔸 客户端建立与SSH服务器的TCP连接。

      • 🔸 通常使用端口22

    2. 握手:

      • 🔸 客户端和服务器交换初始化消息。

      • 🔸 开始密钥交换和认证。

    3. 身份验证:

      • 🔸 客户端提供密钥、密码或其他方法进行身份验证。
    4. 命令执行:

      • 🔸 用户在远程主机上执行命令。

      • 🔸 所有操作都在加密通道中进行。

    5. 断开连接:

      • 🔸 一旦任务完成,连接会断开。

⚠️ 注意: SSH提供了一个安全的方式来执行远程命令和文件传输。


📋 DNS (Domain Name System)

  • 🔹 DNS是互联网的电话簿。

  • 🔹 它将人类可读的域名转换为机器可读的IP地址。

  • 🔹 主要特点:

    • 🔸 快速: 通过缓存技术实现快速的域名解析。
    • 🔸 分层: 使用分层的查询系统。
    • 🔸 分布式: 全球有多个DNS服务器。
  • 🔹 DNS的工作过程涉及多个步骤:

    1. 用户请求:

      • 🔸 用户在浏览器中输入域名。

      • 🔸 电脑会询问本地DNS缓存。

    2. 本地DNS服务器查询:

      • 🔸 如果本地缓存中没有结果,查询将转发到本地DNS服务器。
    3. 根服务器查询:

      • 🔸 如果本地DNS服务器没有记录,它会查询根服务器。
    4. 顶级域名服务器查询:

      • 🔸 根服务器将指向相关的顶级域名服务器。
    5. 权威名称服务器查询:

      • 🔸 顶级域名服务器将指向权威名称服务器,它知道确切的IP地址。
    6. 获取IP地址:

      • 🔸 权威名称服务器返回IP地址给本地DNS服务器,然后返回给用户的计算机。
    7. 浏览器请求:

      • 🔸 浏览器使用IP地址请求网站内容。

⚠️ 注意: DNS查询可能涉及多个服务器,但通常非常快速,因为许多结果都被缓存。


📨 IMAP (Internet Message Access Protocol)

  • 🔹 IMAP是一种电子邮件获取协议。

  • 🔹 它允许用户在多个设备上查看和管理同一邮箱。

  • 🔹 主要特点:

    • 🔸 同步: 允许在多个设备上同步邮件。
    • 🔸 保留邮件: 服务器上的邮件不会被自动删除。
    • 🔸 灵活性: 支持邮件的部分下载,如仅获取邮件头。
  • 🔹 IMAP的工作过程涉及多个步骤:

    1. 连接建立:

      • 🔸 客户端建立与IMAP服务器的TCP连接。

      • 🔸 通常使用端口143993(SSL/TLS)。

    2. 身份验证:

      • 🔸 客户端提供用户名和密码登录。
    3. 选择邮箱:

      • 🔸 客户端选择要查看的邮箱,如收件箱。
    4. 获取邮件:

      • 🔸 客户端获取邮件列表或邮件内容。
    5. 断开连接:

      • 🔸 一旦邮件获取完成,连接会断开。

⚠️ 注意: 与POP3相比,IMAP更适合在多个设备上访问邮件。


📬 POP3 (Post Office Protocol 3)

  • 🔹 POP3是一种电子邮件获取协议。

  • 🔹 它将邮件下载到本地并可能从服务器上删除它们。

  • 🔹 主要特点:

    • 🔸 简单: 设计简单,易于实现。
    • 🔸 本地存储: 下载邮件后,通常从服务器上删除。
    • 🔸 单一设备: 更适合单一设备上的邮件访问。
  • 🔹 POP3的工作过程涉及多个步骤:

    1. 连接建立:

      • 🔸 客户端建立与POP3服务器的TCP连接。

      • 🔸 通常使用端口110995(SSL/TLS)。

    2. 身份验证:

      • 🔸 客户端提供用户名和密码登录。
    3. 获取邮件:

      • 🔸 客户端获取邮件列表或邮件内容。
    4. 断开连接:

      • 🔸 一旦邮件获取完成,连接会断开。

⚠️ 注意: 与IMAP相比,POP3是一种更简单的邮件获取协议,但可能不适合多设备使用。


🏮 AJAX (Asynchronous JavaScript and XML)

  • 🔹 AJAX是一种在不重新加载整个页面的情况下与服务器交换数据并更新部分网页的技术。

  • 🔹 主要特点:

    • 🔸 异步: 允许后台与服务器通信,不干扰页面的当前状态。
    • 🔸 轻量: 只更新部分页面,而不是整个页面。
    • 🔸 无刷新: 页面无需刷新即可获取新数据。
  • 🔹 AJAX的工作过程涉及多个步骤:

    1. 发起请求:

      • 🔸 通过JavaScript发起异步请求。
    2. 服务器处理:

      • 🔸 服务器处理收到的请求。
    3. 服务器响应:

      • 🔸 服务器返回数据(通常是XMLJSON格式)。
    4. 更新网页:

      • 🔸 使用JavaScript和DOM更新网页部分。

⚠️ 注意: AJAX使网页可以快速、平滑地更新,提高用户体验。文章来源地址https://www.toymoban.com/news/detail-645052.html


到了这里,关于Java-网络编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java基础面试题04(网络编程)

    什么是网络编程?它的作用是什么? 网络编程是一种用于在计算机网络中进行数据交换和通信的编程技术。它涉及到使用网络协议和相关工具来实现程序之间的通信。网络编程的目标是允许不同设备或应用程序之间进行数据传输、共享资源和进行远程控制。 网络编程的作用

    2024年02月15日
    浏览(41)
  • 快速入门java网络编程基础------Nio

    哔哩哔哩黑马程序员 netty实战视频 NIO(New I/O)是Java中提供的一种基于通道和缓冲区的I/O(Input/Output)模型。它是相对于传统的IO(InputStream和OutputStream)模型而言的新型I/O模型。NIO的主要特点包括: 1.通道与缓冲区: 2.NIO引入了通道(Channel)和缓冲区(Buffer)的概念。通道

    2024年01月20日
    浏览(52)
  • 《Java SE》网络编程基础知识归纳。

    目录 一、网络基本介绍 1、什么是网络通信? 2、网络 3、IP地址 4、域名 5、网络通信协议 6、Socket 二、TCP网络通信编程  1、应用实例1(字节流) 2、应用实例2(字节流) 3、应用实例3(字符流) 4、netstat 指令 三、UDP网络通信编程  1、基本介绍 2、基本流程 3、应用实例  

    2024年01月20日
    浏览(51)
  • 【Java 基础篇】Java网络编程实战:P2P文件共享详解

    Java网络编程是现代软件开发中不可或缺的一部分,因为它允许不同计算机之间的数据传输和通信。在本篇博客中,我们将深入探讨Java中的P2P文件共享,包括什么是P2P文件共享、如何实现它以及一些相关的重要概念。 P2P(Peer-to-Peer)文件共享是一种分布式计算模型,其中每个

    2024年02月07日
    浏览(39)
  • Java-Java基础学习(2)-网络编程-TCP-UDP

    2.1. 通信协议 TCP、UDP对比 TCP 打电话 连接,稳定 三次握手,四次挥手 客户端、服务端 传输完成,释放连接,效率低 UDP 发短信 不连接,不稳定 客户端,服务端,没有明确的界限 不管有没有准备好,都可以发给你 导弹 DDOS:洪水供给!(饱和攻击) 2.2. Tcp上传测试 总结:

    2024年04月09日
    浏览(44)
  • 计算机网络技术与JAVA网络编程手写Socket聊天室-----JAVA入门基础教程-----计算机网络经典

    import java.io.*; import java.net.Socket; import java.util.Scanner; public class ChatClient { public static void main(String[] args) { try { Socket socket = new Socket(\\\"127.0.0.1\\\",9090); new Thread(new Runnable() { @Override public void run() { InputStream inputStream = null; while(true) { try { inputStream = socket.getInputStream(); } catch (IOException e)

    2024年02月15日
    浏览(57)
  • Java网络编程基础:TCP Socket套接字编程 IntAddress UDP等...

    目录 一,网络基础 1.IP地址 2.端口 3.TCP/UDP协议 4.网络编程开发模式  二,基于套接字的Java网络编程 1.Socket  2.InetAddress 三.基于TCP的Socket网络编程 1.单服务器端与单Socket客户端一次通讯 2.单服务器端接收多次通讯  3.TCP网络通讯补充 四,基于UDP的网络编程 1. DatagramSocket:收发

    2024年04月29日
    浏览(43)
  • 计算机网络-基础编程实验(JAVA\Python3)

            通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。 学习套接字编程,完成以下的网络数据收发程序。 1.采用TCP进行数据发送的简单程序 2.采用UDP进行数据发送的简单程序 3.多线程/线程池对比 4.简

    2024年02月01日
    浏览(37)
  • 【Java基础教程】(四十七)网络编程篇:网络通讯概念,TCP、UDP协议,Socket与ServerSocket类使用实践与应用场景~

    了解多线程与网络编程的操作关系; 了解网络程序开发的主要模式; 了解 TCP 程序的基本实现; 在Java中,网络编程的核心意义是实现不同电脑主机之间的数据交互。Java采用了一种简化的概念,将这个过程进一步抽象为JVM(Java虚拟机)进程之间的通信。可以在同一台电脑上

    2024年02月15日
    浏览(63)
  • Java网络编程 - 网络编程介绍 - 网络通信三要素

    什么是网络编程 ? 网络编程可以让程序与网络上的其他设备中的程序进行数据交互。 网络编程基本模式 : 常见的通信模式有如下2种形式:Client-Server( CS: 客户端与服务器模式 ) 、 Browser/Server( BS: 浏览器与服务器模式 ) Client-Server(CS)模式 Browser/Server(BS)模式 实现网络编程关键的三

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包