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

端口到底是个什么鬼?回答我!

目录

日常中听到的端口

TCP封包的端口 与 UPD的端口

UDP与TCP使用相当的端口号时,是否是同一个端口

 端口的验证

服务有多种协议,不同协议端口一般配置相同

日常中听到的端口

        当我们谈论端口时,经常会通说什么的服务会是什么端口号。例如安全外壳协议(SSH,端口22)、 FTP (端 口20和21)、 Telnet远程终端协议(端口23)、电子邮件/简单邮件传输协议(SMTP,端 口25)、域名系统(DNS,端口53)、超文本传输协议或Web(HTTP和HTTPS,端口80 和443)、交互式邮件访问协议(IMAP和IMAPS,端口43和993)、简单网络管理协议 (SNMP,端口161和162)、轻量级目录访问协议(LDAP,端口389),以及其他几种服务。

        这是什么东西?好像是有叫服务的东西,它具有特有的端口号。

        下图是TCP/IP的协议族(TCP/IP协议族是里面有很多协议,不是仅仅只有TCP协议与IP协议,这些协议构成了Internet使用的协议。),在图中可以看到,端口号分解出现在传输层指向应用层,也就是端口用于应用服务的区分。

        注:1)这个图容易引起误解,TCP有端口分解,UDP没有端口分解,但实际上是除了(ICMP、IGMP)之外,(UDP、TCP、STCP、DCCP)都是有端口的。 

        在下图可以看到如果按照ISO七层模型划分,ICMP与ICMP在划分时是在网络层与传输层之间,它是3.5层。而在TCP/IP四层里面,它被划分为网络层。

        为什么,在上图ICMP、IGMP与TCP它们放在同一层?因为它们的报文内容被IPv4 与IPv6的数据部分,在IPv4存在协议字段(在IPv6中称为下一个头部字段),以决定接下来调用哪个协议来处理。常见的值包括1 (ICMP)、 2 (IGMP)、 4 (IPv4)、 6 (TCP)和17 (UDP)。为了方便理解数据的流向,出现了上图。

TCP封包的端口 与 UPD的端口

        图中所示,TCP 16位,UDP2字节,因为1字节 = 8位,因此UDP的2字节,也就是16位。

可以看到无论TCP的端口号还是UDP的端口号数量都是一样的。

UDP与TCP使用相当的端口号时,是否是同一个端口

        我们也经常听到这样的话,端口号只有65536个。这句话听起来的感觉就像是,哎呀,65536个端口,那么UDP与TCP的端口一共有65536端口一样。

        在讨论这个之前,先回到TCP/IP协议族中,可以看到 IPv4协议中,在头部字段会有不同协议的标记。然后用来标识ICMP 、UDP、TCP、IGMP,SCTP、DCCP... 不同类型的协议。

在IPv4中,会有8位标记是什么类型的协议

 最常见的是TCP的值6与UDP的值17

 完整列表见IANA维护的协议号标准。

        因为IP层根据IPv4头部中的协议字段或IPv6头部中的下一个头部字段的值将进人的IP数
据报分离到特定的传输协议,这意味着端口号在不同的传输协议之间是独立的。

        正确的的是:TCP有65536个端口号,UDP也有65536个端口号!!!它们是独立的资源

 注:STCP 与DCCP也有16位的端口号,它们分别有65535个端口号

 

 

 端口的验证

         采用node.js验证。

server.js

// server.js
const net = require('net');
const dgram = require('dgram');const PORT = 8080;// 创建 TCP 服务器
const tcpServer = net.createServer((socket) => {console.log('TCP 客户端连接');socket.on('data', (data) => {console.log(`TCP 收到: ${data}`);socket.write(`TCP 回复: ${data}`);});
});tcpServer.listen(PORT, '127.0.0.1', () => {console.log(`TCP 服务器监听 ${PORT} 端口`);
});// 创建 UDP 服务器
const udpServer = dgram.createSocket('udp4');udpServer.on('message', (msg, rinfo) => {console.log(`UDP 收到 ${rinfo.address}:${rinfo.port}: ${msg}`);udpServer.send(`UDP 回复: ${msg}`, rinfo.port, rinfo.address);
});udpServer.bind(PORT, '127.0.0.1', () => {console.log(`UDP 服务器监听 ${PORT} 端口`);
});// 错误处理
tcpServer.on('error', (err) => console.error('TCP 错误:', err));
udpServer.on('error', (err) => console.error('UDP 错误:', err));

       在服务端,创建一个TCP服务,同时也创建一个UDP服务,它们的端口都是8080;当它们收到信息,将信息打印出来,并且将信息回传给客户端。

client.js

// client.js
const net = require('net');
const dgram = require('dgram');const PORT = 8080;
const HOST = '127.0.0.1';// 测试 TCP 客户端
const tcpClient = net.connect(PORT, HOST, () => {console.log('TCP 已连接服务器');tcpClient.write('Hello TCP!');
});tcpClient.on('data', (data) => {console.log(`TCP 收到回复: ${data}`);tcpClient.end();
});tcpClient.on('end', () => console.log('TCP 连接关闭'));// 测试 UDP 客户端
const udpClient = dgram.createSocket('udp4');
const udpMessage = Buffer.from('Hello UDP!');udpClient.send(udpMessage, PORT, HOST, (err) => {if (err) console.error('UDP 发送错误:', err);else console.log('UDP 消息已发送');
});udpClient.on('message', (msg) => {console.log(`UDP 收到回复: ${msg}`);udpClient.close();
});udpClient.on('close', () => console.log('UDP 客户端关闭'));

         在客户端,创建两个客户端,一个是TCP客户端,一个是UDP客户端,当它们连接成功是分别发送“Hello TCP”与“Hello,UDP”,

服务端

UDP 服务器监听 8080 端口
TCP 服务器监听 8080 端口
TCP 客户端连接
UDP 收到 127.0.0.1:56157: Hello UDP!
TCP 收到: Hello TCP!

客户端

UDP 消息已发送
TCP 已连接服务器
UDP 收到回复: UDP 回复: Hello UDP!
UDP 客户端关闭
TCP 收到回复: TCP 回复: Hello TCP!
TCP 连接关闭

        虽然它们都是使用了8080端口号,但是因为它们的协议不一样,并不会将UDP的数据发送给TCP。

服务有多种协议,不同协议端口一般配置相同

        尽管有这种独立性,但是如果某个众所周知的服务可同时由TCP和UDP提供(或者可信服地提供),那么这两个传输协议的端口号通常被分配成一样的。关于如何规范地分配端口号,详见[IPORT]。

        例如在ftp服务使用到的三种协议TCP,UDP,SCTP,使用的端口都被配置成为21

http://www.xdnf.cn/news/15135.html

相关文章:

  • pyQt基础4(对话框)
  • softmax回归的从零开始实现
  • php的原生类
  • 《棒球规则介绍》领队和主教练谁说了算·棒球1号位
  • Express实现定时任务
  • PBR渲染
  • 软件开发那些基础事儿:需求、模型与生命周期
  • 大模型在卵巢癌预测及诊疗方案制定中的应用研究
  • 河南专升本2026年练习题、真题和2000题每日一节
  • 分割网络Segformer
  • 【B题解题思路】2025APMCM亚太杯中文赛B题解题思路+可运行代码参考(无偿分享)
  • 设计模式(结构型)-适配器模式
  • c++——浅拷贝和深拷贝、浅赋值和深赋值
  • 基于强化学习的智能推荐系统优化实践
  • c/c++拷贝函数
  • 字节豆包又一个新功能,超级实用,4 种玩法,你肯定用得上!(建议收藏)
  • 力扣_二叉搜索树_python版本
  • 聚焦数据资源建设与应用,浙江省质科院赴景联文科技调研交流
  • 【龙泽科技】新能源汽车维护与动力蓄电池检测仿真教学软件【吉利几何G6】
  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • DIDCTF-蓝帽杯
  • 【经典面经】C++新特性 TCP完整收发数据 TLS1.2 TLS1.3
  • 【C++】全套数据结构算法-线性表讲解(1)
  • Anaconda及Conda介绍及使用
  • 注意力机制十问
  • 简单记录一下Debug的折磨历程
  • 汽车级MCU选型新方向:eVTOL垂桨控制监控芯片的替代选型技术分析
  • 巨人网络持续加强AI工业化管线,Lovart国内版有望协同互补
  • UI前端大数据可视化实战技巧:如何利用数据故事化提升用户参与度?
  • 云暴露面分析完整指南