【计算机网络】网络通信中的端口号

文章目录

  • 一、引入端口号
  • 二、端口号的作用
  • 三、端口号的确定

在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播或对细节控制要求不高的应用传输。

为了确保传输层协议能够正确地将接收到的数据交给相应的应用程序,TCP和UDP都引入了端口号的概念,用来识别目标应用。

一、引入端口号

可以用寄送包裹来类比这个过程。邮递员(对应网络层的IP协议)根据收件地址(目标IP地址)将包裹(数据包)送到目标计算机。包裹抵达后,传输层协议会根据附带的端口号决定最终交给哪个应用程序。

我们举一个更具体的例子来说明:假设快递单上只写了家庭住址和一个姓氏,那么就无法准确判断包裹应该交给家庭中的哪位成员。同样,如果寄送到学校或公司,只写了一个姓氏而没有明确部门或接收人的全名,快递员也会遇到困难。在实际生活中,为了避免这些问题,邮政系统也通常要求详细的地址和全名,甚至在某些情况下还需要附上联系电话,以便区分重名的收件人。

类似地,在网络传输中,端口号相当于应用程序的“全名”,确保数据能够准确地交付给正确的应用。因此我们就可以根据端口号识别在传输层上一层的应用层中所需要处理的具体程序(一个程序可以使用多个端口)。

数据链路和IP中的地址,分别指的是MAC地址和IP地址。前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互连的主机和路由器。在传输层中也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。


二、端口号的作用

TCP/IP的众多应用协议大多以客户端/服务端的形式运行。客户端(客户端(Client)具有客户的意思。在计算机网络中是提供服务和使用服务的一方。) 类似于客户的意思,是请求的发起端。而服务端(服务端(Server)在计算机网络中则意味着提供服务的程序或计算机。) 则表示提供服务的意思,是请求的处理端。另外,作为服务端的程序有必要提前启动,准备接收客户端的请求。否则即使有客户端的请求发过来,也无法做到相应的处理。

在这里插入图片描述
确认一个请求究竟发给的是哪个服务端,可以通过所收到数据包的目标端口号轻松识别。当收到TCP的建立连接请求时,如果目标端口为22,则转给sshd,如果是80则转给httpd。然后,这些守护进程会继续对该连接上的通信传输进行处理。上图是把传输协议的数据将被传递给HTTP应用层协议。

传输层协议通过端口号来识别这些正在通信的应用程序,并确保数据准确地传递给相应的程序。

在这里插入图片描述

每个运行的程序都会被分配一个唯一的端口号,TCP和UDP协议通过这些端口号来区分不同的应用。例如,Web浏览器使用HTTP服务时通常使用端口80,而SSH客户端通常使用端口22。传输层协议根据目标端口号,确保数据包能准确地到达运行该端口的应用程序,使得同一台计算机能够同时进行多种网络通信而不会发生混淆。

但是仅凭借端口号识别某一个通信是不够的。

在这里插入图片描述

上图中的通信是在①和②的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。

例如打开两个Web浏览器,同时访问两个服务器上不同的页面,就会在这个浏览器跟服务器之间产生类似前面的两个通信。在这种情况下也必须严格区分这两个通信。因此可以根据源端口号加以区分。

而中③跟①的目标端口号和源端口号完全相同,但是它们各自的源IP地址不同。

此外,还有一种情况上图中并未列出,那就是IP地址和端口全都一样,只是协议号(表示上层是TCP或UDP的一种编号)不同。这种情况下,也会认为是两个不同的通信。

因此TCP/IP或UDP/IP通信中可以采用一个五元组来识别一个通信。它通常包括以下信息:

  1. 源IP地址: 数据报的发送者的IP地址。
  2. 源端口号: 发送者的端口号,用于标识源主机上的具体应用。
  3. 目的IP地址: 数据报的接收者的IP地址。
  4. 目的端口号: 接收者的端口号,用于标识目标主机上的具体应用。
  5. 协议号: 使用的传输协议(如TCP、UDP等)的标识符。

只要其中某一项不同,就被认为是其他通信。即这些信息共同定义了网络中的一个会话或连接。通过 netstat -n 命令,可以查看当前系统上的网络连接信息,包括IP地址和端口号等。

例如,运行 netstat -n 可能会显示如下内容:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 192.168.1.10:54321      192.168.1.20:80         ESTABLISHED
udp        0      0 192.168.1.10:12345      192.168.1.20:53         ESTABLISHED

在这个例子中:

  • 源IP地址是 192.168.1.10
  • 源端口号是 5432112345
  • 目的IP地址是 192.168.1.20
  • 目的端口号是 80(HTTP)或 53(DNS)

Linux下cat /etc/services命令可以用于查看知名端口号。


三、端口号的确定

在实际进行网络通信时,要事先确定端口号。确定端口号的方法分为两种:

  1. 已知的标准端口号(Well-known Ports)

这些端口号通常是由特定的网络服务或协议所使用的,并且已被标准化。它们的范围为0到1023,例如:

  • HTTP 使用端口 80
  • HTTPS 使用端口 443
  • FTP 使用端口 21
  • SSH 使用端口 22

这些端口号是预先定义好的,客户端在与服务器通信时,通常不需要明确指定端口号,因为大家对这些标准端口已广泛了解。

  1. 动态或私有端口号(Dynamic/Private Ports)

这些端口号由应用程序或操作系统动态分配,通常用于客户端与服务器之间的临时通信。它们的范围为1024到65535**。服务端有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。**例如,当一个客户端启动连接时,操作系统可能会随机为它分配一个未使用的端口号,这样可以避免与其他应用程序产生冲突。这些端口号通常用于短期通信,在通信完成后可以重新分配。

在这种方法下,客户端应用程序可以完全不用自己设置端口号,而全权交给操作系统进行分配。操作系统可以为每个应用程序分配互不冲突的端口号。例如,每需要一个新的端口号时,就在之前分配号码的基础上加1。这样,操作系统就可以动态地管理端口号了。

根据这种动态分配端口号的机制,即使是同一个客户端程序发起的多个TCP连接,识别这些通信连接的五元组也不会全部相同。

端口号由其使用的传输层协议决定。因此,不同的传输协议可以使用相同的端口号。例如,TCP与UDP使用同一个端口号,但使用目的各不相同。这是因为端口号上的处理是根据每个传输协议的不同而进行的。

当数据从传输层进入IP层时,首先会检查IP首部中的协议号,再根据该协议号将数据传递给相应的协议模块。例如,如果协议号指示为TCP,数据将被传递给TCP模块进行处理;如果协议号指示为UDP,则数据会交给UDP模块进行处理。因此,即使相同的端口号被TCP和UDP同时使用,数据处理仍然是各自独立的,不会产生冲突或干扰。

那么操作系统是如何根据端口号,把数据发送给对应的客户端进程呢?

操作系统将数据发送给客户端进程的过程涉及以下几个步骤:

  1. 数据到达网络接口
    当数据报到达服务器的网络接口时,网络接口卡(NIC)会通过硬件中断通知CPU。

  2. 数据报被内核处理

    • 接收数据报:操作系统内核的网络栈会接收数据报,并从链路层开始逐层处理,直到传输层。
    • 解析数据报:在传输层,内核会解析数据报的头部信息,包括源端口号、目的端口号、协议类型等。
  3. 根据端口号找到对应的进程:以下是操作系统如何根据端口号将数据发送给正确的客户端进程:

    • 查找端口号:内核会根据数据报的目的端口号在内部维护的一个查找表(哈希表)中查找。这个查找表通常称为socket tableport table,它记录了当前系统中所有正在监听的端口号以及它们对应的套接字描述符。
    • 套接字描述符:每个套接字都有一个唯一的描述符,它是由内核在创建套接字时分配的。这个描述符用于内核与进程之间的交互。
    • 绑定关系:当一个进程通过bind系统调用绑定一个端口号时,内核会在这个查找表中为该端口号创建一个条目,并将该端口号与进程的套接字描述符关联起来。
    • 数据传递:当内核找到了对应端口号的套接字描述符后,它会将数据报的内容复制到该套接字的接收缓冲区中。
  4. 通知客户端进程

    • 唤醒进程:如果客户端进程正在等待接收数据(例如,调用了recvrecvfrom或类似的系统调用),内核会将数据放入进程的缓冲区,并唤醒该进程。
    • 设置文件描述符为可读:如果客户端进程没有阻塞在接收调用上,内核会将对应的文件描述符标记为“可读”,这样当进程下次进行轮询(例如使用selectpollepoll)或阻塞在读取操作上时,可以读取到数据。
  5. 客户端进程读取数据
    客户端进程通过系统调用(如readrecvrecvfrom等)从其套接字的接收缓冲区中读取数据。

这个过程确保了数据能够根据端口号准确地发送到正确的进程。值得注意的是,这一机制适用于TCP和UDP协议,尽管UDP是无连接的,但数据报的发送和接收依然依赖于端口号来正确地路由到相应的进程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打造下一个AI拥抱视频热潮:从CloneAI的成功中汲取灵感

在科技与创意的交汇点,CloneAI以其敏锐的洞察力和高效的执行力,在短时间内迅速崛起,成为App Store的明星应用。其成功不仅在于抓住了AI技术的浪潮,更在于精准地利用了社交媒体的趋势,创造了一个独特的用户体验。对于希望复刻这一成功的开发者们来说,CloneAI的经验无疑是一…

QT多线程编程(基础概念以及示例)

QT多线程编程 前言:基础夯实:一:多线程概述二:QT多线程的使用1. 继承QThread类2. 继承QObject类3. QtConcurrent模块 三:线程同步与通信四:线程安全五:线程管理六:总结 效果展示:实现功能:核心代码:mainwindow.hmythre…

网络穿透:TCP 打洞、UDP 打洞与 UPnP

在现代网络中,很多设备都处于 NAT(网络地址转换)或防火墙后面,这使得直接访问这些设备变得困难。在这种情况下,网络穿透技术就显得非常重要。本文将介绍三种常用的网络穿透技术:TCP 打洞、UDP 打洞和 UPnP。…

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库,并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …

什么是API网关(API Gateway)?

1. 什么是API网关(API Gateway)? 在微服务体系结构中,客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理,将来自客户端的请求路由到服务。 它还可以执行各种横切任务,例…

GHOST重装后DEF盘丢失:深度解析与高效数据恢复方案

在数字信息爆炸的时代,数据安全与恢复成为了每个计算机用户必须面对的重要课题。GHOST作为系统备份与恢复领域的佼佼者,以其快速、便捷的特点赢得了广泛的用户基础。然而,在使用GHOST进行系统重装的过程中,不少用户遭遇了DEF盘&am…

【信创】Linux上图形化多ping工具--gping的编译安装与打包 _ 统信 _ 麒麟 _ 方德

原文链接:【信创】图形化多ping工具gping的编译安装与打包 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天给大家带来一篇关于在Linux操作系统上使用gping的文章。gping是一款非常实用的命令行工具,它将传统的ping命令进行了可视化改进…

【大数据方案】智慧大数据平台总体建设方案书(word原件)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障体系 4.1 政策…

Java设计模式—面向对象设计原则(五) ----->迪米特法则(DP) (完整详解,附有代码+案例)

文章目录 3.5 迪米特法则(DP)3.5.1 概述3.5.2 案例 3.5 迪米特法则(DP) 迪米特法则:Demeter Principle,简称DP 3.5.1 概述 只和你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to stranger…

【开放词汇检测】MM-Grounding-DINO论文翻译

摘要 Grounding-DINO 是一种先进的开放式检测模型,能够处理包括开放词汇检测(Open-Vocabulary Detection,OVD)、短语定位(Phrase Grounding,PG)和指代表达理解(Referring Expressio…

人脸防伪检测系统源码分享

人脸防伪检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

(c++)用取模符%、除运算判断是否是某个数的倍数,判断个位十位是否有某个数

结果易懂&#xff0c;但凡和7有关&#xff0c;都输出相应的关系。关系分为三种&#xff0c;7的倍数&#xff0c;十位是7&#xff0c;个位是7 #include<iostream>using namespace std;int main() {for (int num 1; num < 100; num){if (num % 7 0)//是7的倍数{cout …

Android 13 固定systemUI的状态栏为黑底白字,不能被系统应用或者三方应用修改

目录 一.背景 二.思路 三.代码流程 1.colos.xml自定义颜色 2.设置状态栏的背景颜色 3.对View进行操作 ①.对Clock(状态栏左侧的数字时钟)进行操作 ②.对电池(BatteryMeterView)进行操作 4.锁屏状态栏 5.patch汇总 一.背景 客户需求将状态栏固定成黑底白字,并且不能让系…

Unity教程(十五)敌人战斗状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

Pytest配置文件pytest.ini如何编写生成日志文件?

1、新建pytest.ini文件 [pytest] log_clitrue log_leveLNOTSET log_format %(asctime)s %(levelname)s %(message)s %(filename)s %(funcName)s %(lineno)d log_date_format %Y-%m-%d %H:%M:%Slog_file ./logdata/log.log log_file_level info log_file_format %(asctime…

【6大设计原则】迪米特法则:解密软件设计中的“最少知识原则”

引言 在软件设计中&#xff0c;设计原则是指导我们构建高质量、可维护系统的基石。迪米特法则&#xff08;Law of Demeter&#xff0c;LoD&#xff09;&#xff0c;也被称为“最少知识原则”&#xff0c;是六大设计原则之一。它强调对象之间的松耦合&#xff0c;确保系统的各个…

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代&#xff0c;网络爬虫已经成为收集和分析数据的重要工具。然而&#xff0c;频繁的请求会导致IP被封禁&#xff0c;这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用&#xff0c;帮助你更高效地进行数据抓取。 什么是爬虫代理AP…

注解(Java程序的一种特殊“注释”,用于工具处理的标注)

1.使用注解 a.含义 i.注解是放在类&#xff0c;字段&#xff0c;方法&#xff0c;参数前的一种特殊“注释”。 ii.注释会被编译器直接忽略&#xff0c;注解则可以被编译器打包带进class文件&#xff0c;因此&#xff0c;注解是一种用于标注的“元数据”。 iii…

设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例&#xff1a;1&#xff09;实现要求2&#xff09;UML图3)实现步骤&#xff1a;1&#xff09;创建一个表示食物条目和食物包装的接口2&#xff09;创建实现Packing接口的实体类3&a…

NeMo Curator 整理用于 LLM 参数高效微调的自定义数据集

目录 概述 预备知识 定义自定义文档构建器 下载数据集 解析和迭代数据集 将数据集写入 JSONL 格式 使用文档构建器加载数据集 使用现有工具统一 Unicode 格式 设计自定义数据集过滤器 编辑所有个人识别信息 添加指令提示 整合管线 概述 出于演示目的&#xff0c;本…