网络协议端口完全解读:从分类原理到排查实战,一文搞懂端口知识
做网络、运维、开发的朋友,几乎都遇到过这类场面:服务起不来,日志里写着“Address already in use”;连远程主机端口超时,排查了半天发现防火墙没放行;又或者配置文件里端口写错,一个服务连着另一个服务的旧端口,数据看起来通,实际全串了。这些问题的根源,基本都落在同一个概念上——网络协议端口。
端口这东西,说难不难,但它牵扯的面特别广:TCP/UDP、防火墙、NAT、容器、云安全组,哪一层都绕不开。尤其现在搞前后端分离、微服务、容器化,一个服务动辄暴露三五个端口,而对端口分类和分配机制没彻底理解的人,排查问题时往往只能靠试,效率极低。这篇文章我想把自己这些年积累的端口理解、排查套路和踩坑记录整理出来,尽量用能直接落地的经验说话,适合刚入门的新手,也适合天天跟端口打交道的运维和开发。
1. 端口到底是什么?从门牌号到四元组
1.1 一次网络请求里,端口到底干了什么
把网络通信比作寄快递,最容易说清楚。IP地址是小区地址,光有小区地址不够,快递员到了小区门口还得知道你是几栋几单元几号房,这个“几号房”就是端口号。数据包到达一台主机后,操作系统靠端口号把数据交给对应的进程,而不是随便乱塞。
一次典型的HTTP请求,比如你在浏览器输入网址,整个过程是这样的:先通过DNS把域名解析成IP,然后浏览器发起一条到目标IP的TCP连接,目的端口是80或者443,源端口是操作系统临时分配的一个高位端口。数据包到了服务器,服务器一看目的端口是80,就把数据丢给监听在80端口的Nginx或Apache,整个通信闭环就完成了。
所以判断一台服务器某端口是否正常工作,本质上是在问两个问题:这个端口是否有人在监听(LISTEN)?这个端口从外部能不能到达(防火墙/安全组是否放行)? 这两个条件,缺一个都会表现为“连不上”。
1.2 TCP端口和UDP端口:同名不同命
端口号范围是0到65535,但这里有个新手最容易踩的误区:TCP端口和UDP端口是两套独立的空间。TCP 53和UDP 53虽然端口号一样,但完全是两码事。
TCP是面向连接的协议,先三次握手建立可靠通道,数据丢了会重传,所以HTTP、数据库连接这类要求数据完整性的服务都跑在TCP上。UDP是“发出去就不管”的协议,不保证送达,但延迟低、开销小,所以DNS查询、音视频通话、游戏同步这类能容忍少量丢失但要求速度的场景,常用UDP。
这意味着什么?监听在UDP 53上的DNS服务挂了,不影响TCP 53上的其他服务;同理,你用netstat查TCP端口时看不到UDP监听项,必须加不同的参数。看端口状态时,先确认自己在看哪个协议,否则会把“UDP端口没监听”误判成“服务挂了”。
1.3 端口号体系:65536个门牌号的分工
端口号总共65536个(0-65535),国际互联网地址分配机构IANA把它们划成了三大段。理解这个划分,很多选端口的纠结就迎刃而解。
- 知名端口(0-1023):也叫特权端口,通常是系统服务或知名公共服务使用,比如80、443、22、53都在这一段。在Linux上,绑定小于1024的端口需要root权限,这个设计用心良苦:防止普通用户随便起一个假冒的SSH或HTTP服务,拦截合法的系统流量。
- 注册端口(1024-49151):这一段是“企业应用重点地段”,你公司里的MySQL、Redis、Tomcat、各种中间件,默认端口大多落在这段里。这些端口不需要特权就能绑定,所以部署方便,但也正因为如此,这段端口是冲突和攻击的高发区。
- 动态端口(49152-65535):一般不由人工指定,是客户端发起出站连接时由操作系统临时分配的“临时牌照”,用完就回收,所以也叫临时端口。
2. 三大端口段逐个拆解
2.1 知名端口:系统服务的“固定工位”
知名端口段是网络上约定俗成的公共服务端口,大家默认遵守,目的就是让客户端不用配端口也能找到服务。下面这些是几乎每天都要打交道的:
| 端口 | 协议 | 服务 | 常见用途 |
|---|---|---|---|
| 20/21 | TCP | FTP | 文件传输,20是主动模式数据端口,21是控制端口 |
| 22 | TCP | SSH | Linux远程管理、SFTP |
| 23 | TCP | Telnet | 老的明文远程终端,不加密,现在不建议用 |
| 25 | TCP | SMTP | 发邮件 |
| 53 | TCP/UDP | DNS | 域名解析,UDP为主,大响应走TCP |
| 67/68 | UDP | DHCP | 自动分配IP |
| 80 | TCP | HTTP | 网站访问 |
| 110 | TCP | POP3 | 收邮件 |
| 143 | TCP |
相关推荐
基于Python+Open CV的手势识别算法设计
伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。
ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像
ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)
计算机视觉图像处理-CV2与图像插值算法
用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int
基于水平集CV模型的图像分割(Matlab代码)
基于水平集CV模型的图像分割(Matlab代码),全套代码
导向滤波(guide_filter)的python实现
导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

