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

计算机网络基础 - 传输层(1)

计算机网络基础

  • 传输层
    • 概述
    • 多路复用与解复用
      • 概述
      • 解复用的工作原理
      • 无连接多路解复用
      • 面向连接的多路复用
    • 无连接运输:UDP
      • 概述
      • UDP 主要应用
      • UDP 报文段结构
    • 可靠数据传输的原理
      • 概述
      • 构建可靠数据传输协议
        • 经完全可靠信道的可靠数据传输:rdt1.0
        • 经具有比特差错信道的可靠数据传输:rdt2.x
        • 经具有比特差错的丢包信道的可靠数据传输:rdt3.0


大家好呀!我是小笙,本章我主要分享计算机网络基础 - 传输层(1)学习总结,希望内容对你有所帮助!!

传输层

概述

为运行在不同主机上的应用进程提供逻辑通信(有两个传输层协议可供应用选择:TCP/UDP)

传输协议运行在端系统

  • 发送方:将应用层的报文分成报文段,然后传递给网络层
  • 接收方:将报文段重组成报文,然后传递给应用层

运输层和网络层的关系

  • 网络层服务:主机间的逻辑通信

  • 传输层服务:进程间的逻辑通信

    • 依赖于网络层的服务(延时、带宽)
    • 并对网络层的服务进行增强(数据丢失、顺序混乱、加密)

    注意:有些服务是可以加强的:可靠性、安全性;但有些服务是不可以被加强的:带宽、延迟

传输层协议

可靠的、保序的传输: TCP

  • 多路复用、解复用
  • 拥塞控制
  • 流量控制
  • 建立连接

不可靠、不保序的传输:UDP

  • 多路复用、解复用
  • 没有为尽力而为的 IP 服务添加更多的其它额外服务

都不提供的服务: 延时保证 、带宽保证


多路复用与解复用

概述

在发送方主机多路复用

从多个套接字接收来自多个进程的报文,根据套接字对应的 IP 地址和端口号等信息对报文段用头部加以封装

注意: 该头部信息用于以后的解复用

在接收方主机多路解复用

根据报文段的头部信息中的 IP 地址和端口号将接收到的报文段发给正确的套接字(和对应的应用进程)

image-20240922155825988

解复用的工作原理

作用:TCP或者UDP实体采用哪些信息,将报文段的数据部分交给正确的socket,从而交给正确的进程

当主机收到 IP 数据报,主机联合使用IP地址端口号将报文段发送给合适的套接字

  • 每个数据报有源 IP 地址和目标 IP 地址
  • 每个报文段有一个源端口号和目标端口号
  • 每个数据报承载一个传输层报文段

image-20240922161023920

无连接多路解复用

创建套接字

服务器端

serverSocket = socket(PF_INET,SOCK_DGRAM,0);
bind(serverSocket,&sad,sizeof(sad)); // (serverSocket 和 sad 指定的端口号捆绑)

客户端

ClientSocket=socket(PF_INET,SOCK_DGRAM,0);
// 不需要 bind 指定的端口号(客户端使用什么端口号无所谓,客户端主动找服务器)

在接收端,UDP套接字用二元组标识 (目标IP地址、目标端口号)

当主机收到 UDP 报文段

  • 检查报文段的目标端口号
  • 用该端口号将报文段定位给套接字

注意:如果两个不同源 IP 地址/源端口号的数据报,但是有相同的目标 IP 地址和端口号,则被定位到相同的套接字

image-20240923132449093

面向连接的多路复用

TCP套接字:四元组本地标识(源 IP地址、源端口号、目的 IP地址、目的端口号)

  • 解复用:接收主机用这四个值来将数据报定位到套接字
  • 服务器能够在一个 TCP 端口上同时支持多个TCP套接字
  • Web服务器对每个连接客户端有不同的套接字(非持久对每个请求有不同的套接字)
image-20240924131737222

无连接运输:UDP

概述

使用UDP时,在发送报文段之前,发送方和接收方的运输层实体之间没有握手。正因为如此,UDP被称为是无连接的(“尽力而为”的服务,报文段可能丢失、送到应用进程的报文段乱序)

为什么许多应用适用于 UDP?

  • 实时应用通常要求最小的发送速率,不希望过分地延迟报文段的传送,且能容忍一些数据丢失,TCP 服务模型并不是特别适合这些应用的需要
  • 无须连接建立,这可能是 DNS 运行在 UDP 之上而不是运行在TCP之上的主要原因(如果运行在 TCP 上,则 DNS 会慢得多)
  • 无连接状态,某些专门用于某种特定应用的服务器当应用程序运行在 UDP 之上而不是运行在 TCP 上时,一般都能支持更多的活跃客户
  • 分组首部开销小。每个 TCP 报文段都有20字节的首部开销,而 UDP 仅有8字节的开销

UDP 主要应用

  • 流媒体(丢失不敏感,速率敏感、应用可控制传输速率)
  • DNS
  • SNMP

UDP 报文段结构

  • 通过端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程
  • 长度字段指示了在UDP报文段中的字节数(首部加数据)
  • 接收方使用检验和来检查在该报文段中是否出现了差错
image-20240924205520001

校验和

目标: 检验和用于确定当UDP报文段从源到达目的地移动时,其中的比特是否发生了改变

发送方的UDP:对报文段中的所有 16 比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在UDP报文段中的检验和字段

// 假定我们有下面3个16比特的字
0110011001100000
0101010101010101
1000111100001100// 求和得: 0100101011000010 (求和时遇到的任何溢出都被回卷)
// 反码运算就是将所有的0换成1,所有的1转换成0。因此反码运算结果是1011010100111101

接收方:计算接收到的报文段的校验和检查计算出的校验和与校验和字段的内容是否相等

  • 不相等 - 检测到差错
  • 相等 - 没有检测到差错,但也许还是有差错 (残存错误)

说明:虽然UDP提供差错检测,但它对差错恢复无能为力


可靠数据传输的原理

概述

实现这种服务抽象是可靠数据传输协议的责任。由于可靠数据传输协议的下层协议也许是不可靠的,因此这是一项困难的任务。(例如,TCP是在不可靠的(IP)端到端网络层之上实现的可靠数据传输协议)

image-20241022194200420

构建可靠数据传输协议

经完全可靠信道的可靠数据传输:rdt1.0

底层信道是完全可靠的,称该协议为 rdt1.0 即发送与接收只做传输操作

  • 没有比特出错
  • 没有分组丢失

有限状态机是一种数学模型,用于表示和控制系统的状态变化,如下图发送端和接收端的状态在发送/接收到分组的时候发生变化

  • FSM 的初始状态用虚线表示
  • 引起变迁的事件显示在表示变迁的横线上方
  • 事件发生时所采取的动作显示在横线下方

image-20241022195336768 image-20241022195349405

注意:如果对一个事件没有动作或没有就事件发生而采取了一个动作,我们将在横线上方或下方使用符号 ∧,以分别明确地表示缺少动作或事件

经具有比特差错信道的可靠数据传输:rdt2.x

底层信道更为实际的模型是分组中的比特可能受损的模型。在分组的传输、传播或缓存的过程中,这种比特差错通常会出现在网络的物理部件中

控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求(ARQ)协议

ARQ 协议中还需要另外三种协议功能来处理存在比特差错的情况

  • 差错检测
  • 接收方反馈(ACK 肯定确认,NAK 否定确认)
  • 重传

rdt2.0

数据传输过程

  1. 发送端协议正等待来自上层传下来的数据
  2. 当 rdt_send(data) 事件出现时,发送方将产生一个包含待发送数据的分组,带有检验和,然后经由 udt_send(sndpkt) 操作发送该分组
  3. 发送方协议等待来自接收方的 ACK 或 NAK 分组
    • 如果收到一个 ACK 分组,则发送方知道最近发送的分组已被正确接收,因此协议返回到等待来自上层的数据的状态
    • 如果收到一个 NAK 分组,该协议重传上一个分组并等待接收方为响应重传分组而回送的 ACK 和 NAK

注意:当发送方处于等待 ACK 或 NAK 的状态时,它不能从上层获得更多的数据,这就是说 rdt send() 事件不可能出现;仅当接收到 ACK 并离开该状态时才能发生这样的事件。因此发送方将不会发送块新数据,除非发送方确信接收方已正确接收当前分组。由于这种行为,这样的协议被称为停等协议

image-20241023132346651 image-20241023132416637

但是存在很多问题(概括的来说就是分组丢失或者乱码

  1. 发送方发送的分组丢失,接收方并没有接收到分组
  2. 接收方接收到的分组受损(乱码)
  3. 接收方发送了 ACK 或 NAK 分组,但是发送方没有接收到分组
  4. 发送方接收的 ACK 或 NAK 分组受损(乱码)

注意:丢失问题主要在 rdt3.0 解决,乱码问题主要在 rdt2.x 解决


升级版:rdt2.1

接收方发送的 ACK 或 NAK 分组受损(乱码),接收方可以通过重传之前的分组(冗余分组)的形式,但是接收方无法知道接收到的分组是新的还是一次重传!

解决方法:在数据分组中添加新的字段,让发送方对其数据分组编号(即将发送数据分组的序号),接收方只需要检查序号即可确定收分组是否是一次重传(如果发送方每次发送一个分组的话,就可以通过 1bit 来表示序号,也就是 1、0)

image-20241023220300432 image-20241023220323191


无NAK的可靠数据传输协议:rdt2.2

前提条件

当接收方每次接收一个分组的话(就可以通过 1bit 来表示序号,也就是 1、0),发送一个是对上次正确接收的分组的 ACK,来表示本次接收到分租有误(即ACK1 表示 NAK0,ACK0 表示 NAK1)

image-20241023220411615 image-20241023220426699

经具有比特差错的丢包信道的可靠数据传输:rdt3.0

协议现在必须处理另外两个关注的问题:怎样检测丢包以及发生丢包后该做些什么

超时重传

从发送方的观点来看,发送方不知道是一个发送的数据分组丢失,还是一个ACK丢失或者只是该分组或ACK过度延时。在所有这些情况下,动作是同样的:重传

为了实现基于时间的重传机制,需要一个倒计数定时器,在一个给定的时间量过期后,可中断发送方

  1. 每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器
  2. 响应定时器中断(采取适当的动作)
  3. 终止定时器(比如接收到接收方的确认分组)

发送方需要等待多久才能确定已丢失了某些东西呢?

  • 发送方与接收方之间的一个往返时延,可能会包括在中间路由器的缓冲时延
  • 等待一个最坏情况的时延可能意味着要等待一段较长的时间,直到启动差错恢复为止。因此实践中采取的方法是发送方明智地选择一个时间值,以判定可能发生了丢包。如果在这个时间内没有收到ACK,则重传该分组
  • 如果一个分组经历了一个特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就在发送方到接收方的信道中引入了冗余数据分组的可能性。幸运的是,rdt2.x 协议已经有足够的功能(即序号)来处理冗余分组情况

以下分别是分组丢失、丢失 ACK 以及过早超时等情况

image-20241023222127532 image-20241023222142888image-20241023222154376

虽然 rdt3.0 协议下网络可以开始工作,但链路容量比较大的情况下,性能很差(一次只发送一个PDU 分组不能够充分利用链路的传输能力)网络协议限制了物理资源的利用!(本质就是 rdt3.0 协议 采用了停止等待的方式,发送的分组和接收的分组只能有一个,因此接下来引入流水线的方式提高性能)

image-20241023222843839 image-20241023222858651
流水线形式的工作原理,且听下回分析!

相关文章:

计算机网络基础 - 传输层(1)

计算机网络基础 传输层概述多路复用与解复用概述解复用的工作原理无连接多路解复用面向连接的多路复用 无连接运输:UDP概述UDP 主要应用UDP 报文段结构 可靠数据传输的原理概述构建可靠数据传输协议经完全可靠信道的可靠数据传输:rdt1.0经具有比特差错信…...

Chrome DevTools:Console Performance 汇总篇

Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具,直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题,最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…...

【Spark | Spark-Core篇】RDD行动算子action

使用转换算子是产生一个新的rdd,此时在driver端会生成一个逻辑上的执行计划,但任务还没有执行。但所谓的行动算子,其实就是触发作业执行的方法(runJob)。底层代码调用的是环境对象的runJob方法。 1. reduce 函数源码&…...

23.Redis核心数据结构

一、String(k-v) 字符串常规操作 备注 应用场景 SET key value 存入字符转键值对 单值缓存、对象缓存 MSET [key value, key value] 批量存储字符串键值对 对象缓存 SETNX key value 存入一个不存在的键值对 分布式锁 GET KEY 获取一个字符串键值 MGET [key,key,…...

免费送源码:Node.JS+Express+MySQL Express 流浪动物救助系统 计算机毕业设计原创定制

摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,流浪动物救助系…...

基于Java+Springboot+Vue开发的旅游景区管理系统

项目简介 该项目是基于JavaSpringbootVue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅…...

Python 实现的风控系统(使用了kafka、Faust、模拟drools、redis、分布式数据库)

以下是一个使用 Python 实现的风控系统示例,涵盖以下技术组件: Kafka 消息中间件:用于实时接收支付业务系统传递的交易数据。Faust(Kafka Streams 的 Python 等价):用于流式处理 Kafka 中的消息。规则引擎…...

Linux运维_Rocky8 安装配置Zabbix

Zabbix 是一个开源的监控解决方案,用于监控网络、服务器、应用程序和服务的性能。它提供实时监控、数据收集、告警通知以及图形化界面,方便用户查看和分析监控数据。Zabbix 支持多种数据收集方式,包括 SNMP、IPMI、JMX 和自定义脚本&#xff…...

jQuery Mobile 滚屏事件

jQuery Mobile 滚屏事件 在移动开发中,滚屏事件是一个非常重要的交互方式,它可以让用户通过滚动屏幕来浏览内容。jQuery Mobile 是一个流行的移动框架,它提供了一套丰富的组件和事件,使得在移动设备上实现滚屏效果变得简单。本文将详细介绍 jQuery Mobile 中的滚屏事件,包…...

3.1.1ReactOS系统中搜索给定长度的空间地址区间函数的实现

系列文章目录 //搜索给定长度的空间地址区间 MmFindGap(); PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,//寻找的空间间隔大小 ULONG_PTR Granularity,//粒度位,表明空间起点的对齐要求,注意是起…...

arm64系统不支持32位的解决armel armhf

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

【毕业设计】工具大礼包之『Maven3.6.3安装与配置』

系统版本 电脑系统:Windows 10 一.Maven下载 🎯 统一版本 apache-maven-3.6.3,下面两种下载方式2选1即可 1.官网直下 官网下载地址 https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 找到apache-maven-3.6.3-bin.zip 云盘…...

gin入门教程(9):路由分组与路由版本控制

在使用 Gin 框架构建 RESTful API 时,路由分组与版本控制是一种常见的实践,可以帮助你更好地管理不同版本的 API。下面是如何在 Gin 中实现路由分组和版本控制的示例。 目录结构 /hello-gin │ ├── cmd/ │ └── main.go ├── api/ │ ├── v1/ │ │ └─…...

rt-thread移植SystemView中遇到的问题

源代码地址dujunqiu/SystemView 我使用的rt-thread版本是5.2.0,应该是rt-thread适配的还有点问题 报错处理 1:warning: #223-D: function “typeof” declared implicitly 如下 typedef 的warning是C99规范没有typedef的定义,需要在keii中…...

【C++STL】list的模拟实现

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 一、三个类与成员函数接口 在list.…...

以30个面试问题和案例为导向:全面解析 Java Servlet是什么?基本概念、实现原理、生命周期、类结构、请求与响应的处理机制,以及性能优化和安全性管理

Servlet 是 Java Web 开发的核心组件之一,负责处理客户端请求并生成动态响应。本文将深入探讨 Servlet 的基本概念、实现原理、生命周期、类结构、请求与响应的处理机制,以及性能优化和安全性管理,帮助开发者从多方面掌握 Servlet。 文章目录…...

MFC小游戏设计

框架: 各个界面: 用户: 登录注册:账号和密码(昵称) 主菜单:各种游戏,查看自己信息(积分,装备【游戏数据】),退出 游戏界面&#…...

[漏洞挖掘与防护] 04.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析

这是作者新开的一个专栏——“漏洞挖掘与防护”,前期会复现各种经典和最新漏洞,并总结防护技巧;后期尝试从零学习漏洞挖掘技术,包括Web漏洞和二进制及IOT相关漏洞,以及Fuzzing技术。新的征程,新的开启,漫漫长征路,偏向虎山行。享受过程,感谢您的陪伴,一起加油~ 欢迎关…...

​手机极简待办app哪款好用?

在快节奏的现代生活中,我们常常需要处理大量的任务和信息,这时候一款好用的极简待办软件就显得尤为重要。它们不仅能帮助我们记录和管理待办事项,还能提高我们的工作效率和生活质量。 在众多的待办软件中,敬业签是一款非常受欢迎…...

SpringBoot高级-底层原理

目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-Configuration配置注解 04-SpringBoot2高级-底层原理-Import注解使用1 05-SpringBoot2高级-底层原理-Import注解使用2 06-S…...

LabVIEW提高开发效率技巧----插入式架构

随着LabVIEW项目规模的扩大和系统复杂性的增加,传统的单一代码架构难以应对后期维护和功能扩展的需求。插入式架构(Plug-In Architecture)作为一种模块化设计方式,通过动态加载和运行子VI,使系统功能更加灵活、模块化&…...

MySQL COUNT(*)、COUNT(1)、COUNT(id)、COUNT(字段)效果及性能

文章目录 前言COUNT(exper)COUNT(*)优化COUNT(*) 与COUNT(1) COUNT(1)COUNT(id)COUNT(字段)总结参考 前言 业务开发中,我们经常要使用count做一些数据统计。今天根据MySQL5.7官方文档及丁奇老师的MySQL45讲,介绍一下COUNT(*)、COUNT(1)、COUNT(id)、COU…...

webpack4 - 动态导入文件 dynamic-import 报错的解决方法

介绍 webpack4动态导入文件报错,按照错误提示安装了插件,但未果。。 最后查到一个可行方案,记录如下。 1.通过懒加载的方式动态引入文件 const router new Router({routes: [{path: /home,name: Home,component: () >import(./views/h…...

【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用

本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序&#xff0…...

springboot061基于B2B平台的医疗病历交互系统(论文+源码)_kaic

摘 要 进入21世纪,计算机技术迅速向着网络化的、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息的新一代网络版应用软件,形成了信息化的社会。信息化社会的形成和微电子技术日新月异的发展&…...

基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型

往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...

JAVA开发环境:IntelliJ IDEA、Java JDK、Maven 安装配置

一、安装IntelliJ IDEA 准备安装包 通过百度网盘分享的文件:idea2023.2U**.zip 链接:https://pan.baidu.com/s/1NB04A-jMXhZKsewYshGt-Q 提取码:oeft 安装 IntelliJ IDEA (1)、解压,安装文件如下&#…...

鸿蒙软件开发中常见的如何快速自动生成二维码?QRCode组件

QRCode 用于显示单个二维码的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 二维码组件的像素点数量与内容有关,当组件尺寸过小时,可能出现无法展示内容的情况&…...

鸿蒙HarmonyOS NEXT 5.0开发(2)—— ArkUI布局组件

文章目录 布局Column:从上往下的布局Row:从左往右的布局Stack:堆叠布局Flex:自动换行或列 组件Swiper各种选择组件 华为官方教程B站视频教程 布局 主轴和交叉轴的概念: 对于Column布局而言,主轴是垂直方…...

【openGauss】OPENGAUSS/POSTGRESQL 中float类型到int类型的隐式转换

下面这条sql在oracle和POSTGRESQL/OPENGAUSS中的查询结果不一致 select cast(cast(0.5 as float) as integer);在oracle中返回1,在openGauss中返回0,咋一看好像是openGauss中使用了截断的方式,但是如果执行 select cast(cast(1.5 as float) as integ…...

建设网站的技术手段/哈尔滨网络推广优化

在子类继承父类中,一般有一行super的语句,需要记住三种使用方法: 1、super.变量/对象名; 使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作 2、super.方法名(); 直接访问并调用父类中的…...

网站功能列表/网络客服

已解决 4G内存条,显示只有2.99G 1、用readyfor 4G,破解后在系统属性和任务管理器可看到物理内存总数已经识别到4G。至于有没有用,各有说法。有人说稳定,破解后可以运行更多程序,有人说用了之后蓝屏.........鉴于有不稳定因素&…...

网站制作策划建设大纲/搜索引擎入口google

文章目录一、概念1.1、事务1.2、手动提交:autocommit01.3、自动提交:autocommit1二、设置 autocommit 的开启和关闭:2.1、查看当前自动提交状态:2.2、临时设置方法:2.3、永久设置方法:三、spring 底层对自动…...

在线做数据图的网站有哪些/郴州seo外包

a、第一步,找环中相汇点。分别用fast,slow指向链表头部,slow每次走一步,fast每次走二步,直到fastslow找到在环中的相汇点。 b、第二步,找环的入口。接上步,当fastslow时,fast所经过节…...

乐山北京网站建设/seo手机端优化

移动、联通、电信版P6均可成功的EMUI3.0开发版/稳定版 ROOT... - P6/P6s 花粉俱乐部 http://cn.club.vmall.com/forum.php?modviewthread&tid1710032&extrapage%3D4%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline 华为 Ascend P6 联通版首个真正意义的…...

服装网站建设论文范文/谷歌广告投放教程

点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!作者:鸟窝来源:https://colobu.com/依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),最大值是\uffff(65535…...