【TCP/IP协议栈】【传输层】端口号、套接字、多路复用/分解、网络字节序

news2025/3/7 3:46:57

参考资料:

前言:

总结:

【计算机网络】套接字(应用层和传输层之间的接口)

  1. 套接字是一个通用的通信接口抽象
  2. 不仅限于TCP/IP协议族
  3. 作为应用层和传输层之间的桥梁
  4. 支持多种通信方式和协议族

套接字定义

在 TCP 或者 UDP 发送具体的报文信息前,需要先经过一扇 ,这个门就是套接字(socket),套接字向上连接着应用层,向下连接着网络层。在操作系统中,操作系统分别为应用和硬件提供了接口(Application Programming Interface)。而在计算机网络中,套接字同样是一种接口,它也是有接口 API 的。

使用 TCP 或 UDP 通信时,会广泛用到套接字的 API,使用这套 API 设置 IP 地址、端口号,实现数据的发送和接收。

                套接字在OSI和TCP/IP模型中的位置对比
                
                OSI七层模型                TCP/IP四层模型
                +---------------+          +---------------+
                |    应用层     |          |               |
                |   表示层      |  ------> |    应用层      |
                |   会话层      |          |               |
                +---------------+          +---------------+
                        ↑                         ↑
                        |                         |
                   Socket接口                 Socket接口
                        |                         |
                        ↓                         ↓
                +---------------+          +---------------+
                |   传输层      |  ------> |    传输层      |
                +---------------+          +---------------+
                |   网络层      |  ------> |    网络层      |
                +---------------+          +---------------+
                |   数据链路层   |          |               |
                |   物理层      |  ------> |   网络接口层   |
                +---------------+          +---------------+

套接字类型

套接字的主要类型有三种,下面我们分别介绍一下

  • 数据报套接字(Datagram sockets):数据报套接字提供一种无连接的服务,而且并不能保证数据传输的可靠性。数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
  • 流套接字(Stream sockets):流套接字用于提供面向连接、可靠的数据传输服务。能够保证数据的可靠性、顺序性。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即 TCP(The Transmission Control Protocol)协议
  • 原始套接字(Raw sockets): 原始套接字允许直接发送和接收 IP 数据包,而无需任何特定于协议的传输层格式,原始套接字可以读写内核没有处理过的 IP 数据包。

套接字使用

现在我们知道了, Socket 和 TCP/IP 没有必然联系,Socket 的出现只是方便了 TCP/IP 的使用,如何方便使用呢?你可以直接使用下面 Socket API 的这些方法。

方法

描述

create()

创建一个 socket

bind()

套接字标识,一般用于绑定端口号

listen()

准备接收连接

connect()

准备充当发送者

accept()

准备作为接收者

write()

发送数据

read()

接收数据

close()

关闭连接

套接字处理过程

虽然套接字 API 位于应⽤程序层和传输层之间的通信模型中,但是套接字 API 不属于通信模型。套接字 API 允许应⽤程序与传输层和⽹络层进⾏交互。

在往下继续聊之前,我们先播放⼀个⼩插曲,简单聊⼀聊 IP。

【补充】聊聊 IP

【传输层】端口号

网络编程套接字(Socket)_scoket编程中ipv4长度宏-CSDN博客

端口(port)是伴随着传输层诞生的概念。它可以将网络层的IP通信分送到各个通信通道。UDP协议和TCP协议尽管在工作方式上有很大的不同,但它们都建立了从一个端口到另一个端口的通信。

端口号定义:

  • 端口号是传输层的概念
  • 端口号是一个2字节/16位的整数
  • 端口号用来标识主机上唯一一个网络进程,公网IP标识互联网上唯一的主机。
    • 端口号用来标识一个进程,用来告诉OS,将数据交给哪一个进程
  • 端口号+IP地址可以标识互联网上唯一一个网络进程
    • IP地址+端口号可以唯一的表示网络中一个主机的某一个进程
  • 一个端口号只能被一个进程占用

PS:

  • 一台主机与另一台主机通信是进程间通信的另一种方式。

端口号和进程 ID:

一个进程PID也可以唯一的标识一个进程,那为什么还需要使用端口号来标识一个主机中的进程呢?

  • 当一个进程退出时,在次启动进程时,它的PID已经变化。所以要将进程和端口号绑定来标识这个进程
  • 一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定

源端口号和目标端口号:

传输层协议TCP/UDP数据段中,也存在两个字段,一个是源端口号,一个是目的端口号,它用来表示这个数据是哪一个进程发的,要发给哪一个进程,也就是谁发的要发给谁

学习传输层协议之前,再谈端口号:

在网络编程套接字(Socket)_scoket编程中ipv4长度宏-CSDN博客中谈到端口号标识了一个主机上进行通信的不同应用程序

TCP/IP协议中, 用"源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信。

可以通过 netstat -n查看,协议号指的是那个使用协议

一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定。

  • TCP 如何判断是哪个端口的呢?

端口号范围划分:

端⼝号是 16 位的⾮负整数,它的范围是 0 - 65535 之间,这个范围会分为三种不同的端⼝号段,由 Internet 号码分配机构 IANA 进⾏分配

  • 0 - 1023: 知名端口号,HTTP、FTP、 SSH等这些广为使用的应用层协议他们的端口号都是固定的,自己写的程序中,不能随意绑定知名端口号。
  • 1024 - 65535:操作系统动态分配的端口号。 客户端程序的端口号,就是由操作系统从这个范围分配的。
    • 注册端⼝号,范围是 1024 - 49151
    • 私有端⼝号,范围是 49152 - 6553

常见的知名端口号

  • ssh服务器:22端口
  • ftp服务器:21端口
  • http服务器:80端口
  • telnet服务器:23端口
  • https服务器:443端口
  • MYSQL服务器:3306端口

PS:

  • 在Linux操作系统中使用命令cat /etc/services可以看到所有的知名端口。

应用程序&&端口号:

⼀台计算机上可以运⾏多个应⽤程序,当⼀个报⽂段到达主机后,应该传输给哪个应⽤程序呢?你怎么知道这个报⽂段就是传递给 HTTP 服务器⽽不是 SSH 服务器的呢?

是凭借端⼝号吗?当报⽂到达服务器时,是端⼝号来区分不同应⽤程序的,所以应该借助端⼝号来区分。

举个例⼦反驳⼀下 cxuan,假如到达服务器的两条数据都是由 80 端⼝发出的你该如何区分呢?或者说到达服务器的两条数据端⼝⼀样,协议不同,该如何区分呢?

所以仅凭端⼝号来确定某⼀条报⽂显然是不够的。

互联⽹上⼀般使⽤ 源 IP 地址、⽬标 IP 地址、源端⼝号、⽬标端⼝号、协议类型 这个五元组来进⾏区分。如果其中的某⼀项不同,就被认为是不同的报⽂段。这些也是多路分解和多路复⽤的基础。

确定端口号:

在实际通信之前,需要先确定⼀下端⼝号,确定端⼝号的⽅法分为两种:

  • 标准既定的端⼝号

标准既定的端⼝号是静态分配的,每个程序都会有⾃⼰的端⼝号,每个端⼝号都有不同的⽤途。端⼝号是⼀个 16⽐特的数,其⼤⼩在 0 - 65535 之间, 0 - 1023 范围内的端⼝号都是动态分配的既定端⼝号,例如 HTTP 使⽤ 80端⼝来标识, FTP 使⽤ 21 端⼝来标识, SSH 使⽤ 22 来标识。这类端⼝号有⼀个特殊的名字,叫做 周知端⼝号(Well-Known Port Number) 。

  • 时序分配的端⼝号

时序分配是⼀种动态分配的⽅式,它是由操作系统来进⾏分配端⼝号,能够保证不同应⽤程序使⽤不同的端⼝号。它的范围是从 1024 - 65535。

【补充】网络状态、进程查看工具:

netstat工具: 用来查看网络状态。

  • n 拒绝显示别名,能显示数字的全部转化成数字
  • l 仅列出有在Listen (监听)的服务状态
  • p 显示正在使用Socket的程序识别码和程序名称
  • t (tcp)仅显示tcp相关选项
  • u u (udp)仅显示udp相关选项
  • a (all)显示所有选项,默认不显示LISTEN相关

pidof [进程名]: 可以根据进程名直接查看服务器的进程id。例如:pidof sshd

【通信系统】多路复用和多路分解

多路复用(Multiplexing)

多路复用是一种技术,允许同时传输多个信号或数据流通过同一条通信信道。它通过不同的方法将多个信号合并成一个复合信号,以便在传输过程中共享资源。
主要方法:

  1. 频分复用(FDM):将不同的信号分配到不同的频率带宽上。
  2. 时分复用(TDM):按时间分割信道,每个信号占用不同的时间片。
  3. 码分复用(CDM):使用不同的编码区分信号。
  4. 波分复用(WDM):在光纤通信中,利用不同波长的光信号传输多个数据流。

多路分解(Demultiplexing)

多路分解是多路复用的逆过程,即接收端将复合信号分离回原来的各个独立信号。
主要方法:

  1. 频分多路分解:通过滤波器分离不同频率的信号。
  2. 时分多路分解:根据时间片分离信号。
  3. 码分多路分解:使用解码技术分离信号。
  4. 波分多路分解:通过分光器分离不同波长的光信号。

多路复用和多路分解在计算机网络中的应用

传输层通过多路复用和多路分解,利用端口号管理数据流,确保多个应用同时高效通信。这不仅提高了带宽利用率,还简化了网络结构,支持复杂的网络应用场景,如视频会议、在线游戏等,保障数据的准确传输。

  • 传输层&&多路复用

其实就是本来就只有一条传输通道(在同一个 IP),但是一条通道的带宽是不完全占用满的,所以加入了端口号的概念(对数据包进行分组),实现多进程/通道数据传输;

  • 传输层&&多路分解

其实就是把上面的端口号+IP 解包,给到不同的进程

多路复用(Multiplexing)在传输层的作用

  1. 定义:多路复用允许同时传输多个数据流,通过单一的物理或逻辑连接,提升带宽利用率。
  2. 实现方式
    • 端口号:传输层使用端口号区分不同应用的数据流。例如,HTTP使用80端口,FTP使用20和21端口。
    • TCP和UDP:这两种协议处理多路复用,TCP通过端口号管理可靠连接,UDP则快速传输数据包,同样依赖端口号区分。
  1. 应用场景:当设备同时运行多个程序(如浏览器、邮件客户端、FTP客户端)时,传输层利用端口号封装数据包,确保各应用的数据不会混淆。

多路分解(Demultiplexing)在传输层的作用

  1. 定义:多路分解是接收端根据特定标识符(如端口号)将复合数据流分离到正确应用的过程。
  2. 实现方式
    • 端口号匹配:接收方传输层检查数据包的端口号,将其分配给对应的进程或应用。
    • 套接字管理:每个连接由套接字(IP地址+端口号)唯一标识,确保数据正确分发。
  1. 应用场景:接收方的传输层拆分复合数据流,确保每个数据包到达正确的目的进程,如HTTP请求分发到Web服务器,FTP数据分发到文件传输应用。

传输层多路复用与分解的优势

  • 高效带宽利用:允许多个应用共享网络连接,提升效率。
  • 简化网络结构:无需为每个应用单独建立物理连接,减少网络复杂性。
  • 支持并发处理:服务器可同时处理多个客户端连接,每个连接由唯一的端口号管理。

【计算机网络】多路复用和多路分解

我们上面聊到了在主机上的每个套接字都会分配一个端口号,当报文段到达主机时,运输层会检查报文段中的目的端口号,并将其定向到相应的套接字,然后报文段中的数据通过套接字进入其所连接的进程。

下面我们来聊一下什么是多路复用和多路分解的概念。

多路复用和多路分解分为两种,即无连接的多路复用/多路分解和面向连接的多路复用/多路分解

多路复用和多路分解是通信系统中的两个基本概念,用于提高资源利用效率和信号传输的灵活性。

无连接的多路复用和多路分解

开发人员会编写代码确定端口号是周知端口号还是时序分配的端口号。

假如主机 A 中的一个 10637 端口要向主机 B 中的 45438 端口发送数据,运输层采用的是 UDP 协议,数据在应用层产生后,会在运输层中加工处理,然后在网络层将数据封装得到 IP 数据报,IP 数据包通过链路层交付给主机 B,主机 B 会检查报文段中的端口号判断是哪个套接字的,这一系列的过程如下所示

UDP 套接字就是一个二元组,二元组包含目的 IP 地址和目的端口号。

所以,如果两个 UDP 报文段有不同的源 IP 地址和/或相同的源端口号,但是具有相同的目的 IP 地址和目的端口号,那么这两个报文会通过套接字定位到相同的目的进程。

这里思考一个问题,主机 A 给主机 B 发送一个消息,为什么还需要知道源端口号呢?

比如我给妹子表达出我对你有点意思的信息,妹子还需要知道这个信息是从我的哪个器官发出的吗?知道是我这个人对你有点意思不就完了?实际上是需要的,因为妹子如果要表达出她对你也有点意思,她是不是可能会亲你一口,那她得知道往哪亲吧?

这就是,在 A 到 B 的报文段中,源端口号会作为返回地址的一部分,即当 B 需要回发一个报文段给 A 时,B 需要从 A 到 B 中的源端口号取值,如下图所示

面向连接的多路复用与多路分解

如果说无连接的多路复用和多路分解指的是 UDP 的话,那么面向连接的多路复用与多路分解指的是 TCP 了,TCP 和 UDP 在报文结构上的差别是,UDP 是一个二元组而 TCP 是一个四元组,即源 IP 地址、目标 IP 地址、源端口号、目标端口号 ,这个我们上面也提到了。当一个 TCP 报文段从网络到达一台主机时,这个主机会根据这四个值拆解到对应的套接字上。

上图显示了面向连接的多路复用和多路分解的过程,图中主机 C 向主机 B 发起了两个 HTTP 请求,主机 A 向主机 C 发起了一个 HTTP 请求,主机 A、B、C 都有自己唯一的 IP 地址,当主机 C 发出 HTTP 请求后,主机 B 能够分解这两个 HTTP 连接,因为主机 C 发出请求的两个源端口号不同,所以对于主机 B 来说,这是两条请求,主机 B 能够进行分解。对于主机 A 和主机 C 来说,这两个主机有不同的 IP 地址,所以对于主机 B 来说,也能够进行分解。

【计算机网络】网络字节序(大小端)

内存中大于1个字节的数据相对于内存地址存在大小端之分,磁盘文件中多字节数据相对于偏移地址也存在大小端之分,网络中的数据流也存在大小端之分。

什么是大小端之分?

单独总结我的另一篇博客:数据存储大小端解析-CSDN博客

网络字节流的大小端:

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。
  • 网络数据流的地址规定,先发出的数据是低地址,后发出的数据是高地址。
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据。如果当前发送主机是小端, 就需要先将数据转成大端, 否则就忽略, 直接发送。

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数对网络字节序和主机字节序的转换:

#include <arpa/inet.h>
//h--host主机,n--net网络,l--long长整型32位,s--short短整型16位
uint32_t htonl(uint32_t hostlong);//主机-->网络(32位)
uint16_t htons(uint16_t hostshort);//主机-->网络(16位)
uint32_t ntohl(uint32_t netlong);//网络-->主机(32位)
uint16_t ntohs(uint16_t netshort);//网络-->主机(16位)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漫话机器学习系列】120.参数化建模(Parametric Modeling)

参数化建模&#xff08;Parametric Modeling&#xff09;详解 1. 引言 在数据建模和机器学习中&#xff0c;参数化建模&#xff08;Parametric Modeling&#xff09;是一种广泛应用的建模方法。它通过假设一个函数形式来表达变量之间的关系&#xff0c;并估算该函数的参数&am…

Web3 的未来:去中心化如何重塑互联网

Web3 的未来&#xff1a;去中心化如何重塑互联网 在这个信息爆炸的时代&#xff0c;我们正站在一个新的技术革命的门槛上——Web3。Web3 不仅仅是一个技术术语&#xff0c;它代表了一种全新的互联网理念&#xff0c;即去中心化。这种理念正在逐步改变我们对互联网的使用方式和…

DApp开发从入门到精通:以太坊/Solana公链生态实战解析

在区块链技术的推动下&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐摆脱传统中心化后台的依赖&#xff0c;转向以智能合约为核心的全合约化开发模式。这种模式通过区块链网络的分布式特性&#xff0c;实现了数据存储、业务逻辑与用户交互的完全去中心化。 一、全合…

【计算机网络入门】TCP拥塞控制

目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞&#xff1f; 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…

【Maven】入门介绍 与 安装、配置

文章目录 一、Maven简介1. Maven介绍2. Maven软件工作原理模型图 二、Maven安装和配置1. Maven安装2. Maven环境配置3. Maven功能配置4. IDEA配置本地Maven软件 一、Maven简介 1. Maven介绍 https://maven.apache.org/what-is-maven.html Maven 是一款为 Java 项目管理构建、…

springbootWeb入门--创建springbootweb项目

步骤&#xff1a; 1.建立空工程 2.选择项目的jdk版本 3.在工程中建立模块&#xff0c;选择“spring initilazer”,类型勾选“maven” 4.勾选“spring web”之后&#xff0c;就无需再自行写dependcy了。 5.等待联网下载 6.生成的工程文件&#xff0c;如下绿色框中文件&…

vtk 3D坐标标尺应用 3D 刻度尺

2d刻度尺 : vtk 2D 刻度尺 2D 比例尺-CSDN博客 简介&#xff1a; 3D 刻度尺&#xff0c;也是常用功能&#xff0c;功能强大 3D 刻度尺 CubeAxesActor vtkCubeAxes调整坐标轴的刻度、原点和显示效果&#xff0c;包括关闭小标尺、固定坐标轴原点&#xff0c;以及设置FlyMode模…

Kylin麒麟操作系统服务部署 | NFS服务部署

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、 NFS服务概述 NFS&#xff08;Network File System&#xff09;&#xff0c;即网络文件系统。是一种使用于…

涨薪技术|持续集成Git使用详解

Git介绍 Git 是一个开源的分布式版本控制系统&#xff0c;用以有效、高速的处理从很小到非常大的项目版本管理。 Git 的特点&#xff1a; 分支更快、更容易。 支持离线工作;本地提交可以稍后提交到服务器上。 Git 提交都是原子的&#xff0c;且是整个项目范围的&#xff0c;…

批量对 Word 优化与压缩,减少 Word 文件大小

在编辑 Word 文档的时候&#xff0c;我们通常会插入一些图片或者一些样式&#xff0c;这可能会导致 Word 文档的体积变得非常的庞大&#xff0c;不利于我们对 Word 文档进行分享、传输或者存档等操作&#xff0c;因此我们通常会碰到需要优化或者压缩 Word 文档的需求。那如何才…

CSS定位详解上

1. 相对定位 1.1 如何设置相对定位&#xff1f; 给元素设置 position:relative 即可实现相对定位。 可以使用 left 、 right 、 top 、 bottom 四个属性调整位置。 1.2 相对定位的参考点在哪里&#xff1f; 相对自己原来的位置 1.3 相对定位的特点&#xff1…

DeepSeek、Grok 和 ChatGPT 对比分析:从技术与应用场景的角度深入探讨

文章目录 一、DeepSeek&#xff1a;知识图谱与高效信息检索1. 核心技术2. 主要特点3. 应用场景4. 实际案例 二、Grok&#xff1a;通用人工智能框架1. 核心技术2. 主要特点3. 应用场景4. 实际案例 三、ChatGPT&#xff1a;聊天机器人与通用对话系统1. 核心技术2. 主要特点3. 应用…

【万字长文】基于大模型的数据合成(增强)及标注

写在前面 由于合成数据目前是一个热门的研究方向&#xff0c;越来越多的研究者开始通过大模型合成数据来丰富训练集&#xff0c;为了能够从一个系统的角度去理解这个方向和目前的研究方法便写了这篇播客&#xff0c;希望能对这个领域感兴趣的同学有帮助&#xff01; 欢迎点赞&…

MacBook上API调⽤⼯具推荐

在当今的软件开发中&#xff0c;API调用工具已经成为了开发者不可或缺的助手。无论是前端、后端还是全栈开发&#xff0c;API的调试、测试和管理都是日常工作中的重要环节。想象一下&#xff0c;如果没有这些工具&#xff0c;开发者可能需要手动编写复杂的CURL命令&#xff0c;…

【数据结构】LRUCache|并查集

目录 一、LRUCache 1.概念 2.实现:哈希表双向链表 3.JDK中类似LRUCahe的数据结构LinkedHashMap &#x1f525;4.OJ练习 二、并查集 1. 并查集原理 2.并查集代码实现 3.并查集OJ 一、LRUCache 1.概念 最近最少使用的&#xff0c;一直Cache替换算法 LRU是Least Recent…

初识Qt · 信号与槽 · 基础知识

目录 前言&#xff1a; 信号和槽初识 两个问题 前言&#xff1a; 本文我们正式开始介绍信号与槽这个概念&#xff0c;在谈及Qt中的信号与槽这个概念之前&#xff0c;我们不妨回顾一下Linux中的信号&#xff0c;比如发生了除0错误&#xff0c;OS就会给该进程发送一个信号&am…

Java高频面试之集合-03

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)

背景&#xff1a; 已经用这个脚本的记得设置Wifi时候&#xff0c;关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开&#xff0c;一天要重新连接&#xff0c;点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本&#xff0c;那样我就可以解放双手&…

计算机毕业设计SpringBoot+Vue.js电商平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…