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

文章目录

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

在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.mzph.cn/pingmian/53920.shtml

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

相关文章

电子电气架构 --- 基于ISO 26262的车载电子软件开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…

《ImageNet Classification with Deep Convolutional Neural Networks》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl《ImageNet Classification with Deep Convolutional Neural Networks》是一篇在深度学习领域具有重要影响力的论文,由Alex Krizhevsky、Ilya Sutskever和Geoffrey E. Hinton等人撰写。该论文主要…

golang实现正向代理http_proxy和https_proxy

package mainimport ("bytes""fmt""io""log""net""net/url""strings" )func main() {// tcp 连接,监听 8080 端口l, err : net.Listen("tcp", ":8080")if err ! nil {l…

FTP、SFTP安装,整合Springboot教程

文章目录 前言一、FTP、SFTP是什么?1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP1、 创建用户2、配置ssh和权限3、建立目录并赋予权限4、启动…

Wophp靶场寻找漏洞练习

1.命令执行漏洞 打开网站划到最下,此处的输入框存在任意命令执行漏洞 输入命令whoami 2.SQL注入 搜索框存在SQL注入,类型为整数型 最终结果可以找到管理员账户和密码 3.任意文件上传漏洞 在进入管理员后台后,上传木马文件 访问该文件&…

博客系统测试报告

当我们至少完成了一次项目的功能测试后,我们可以写一篇测试报告出来。在这里,我先完成了功能测试,自动化测试,又进行了弱网测试,我们把它们都编入测试报告,来写出一篇简单的博客系统测试报告 Gitee源码&am…

树莓派5上手

1 安装系统 Raspberry Pi OS 是基于 Debian 的免费操作系统,针对 Raspberry Pi 硬件进行了优化。Raspberry Pi OS 支持超过 35,000 个 Debian 软件包。树莓派 5 可以安装各种系统,但是如果对于系统没有特殊的要求,还是安装 Raspberry Pi OS …

uniapp登录页面( 适配:pc、小程序、h5)

<!-- 简洁登录页面 --> <template><view class"login-bg"><image class"img-a" src"https://zhoukaiwen.com/img/loginImg/2.png"></image><image class"img-b" src"https://zhoukaiwen.com/im…

KAN 学习 Day4 —— MultKAN 正向传播代码解读及测试

在KAN学习Day1——模型框架解析及HelloKAN中&#xff0c;我对KAN模型的基本原理进行了简单说明&#xff0c;并将作者团队给出的入门教程hellokan跑了一遍&#xff1b; 在KAN 学习 Day2 —— utils.py及spline.py 代码解读及测试中&#xff0c;我对项目的基本模块代码进行了解释…

『功能项目』怪物的有限状态机【42】

本章项目成果展示 我们打开上一篇41项目优化 - 框架加载资源的项目&#xff0c; 本章要做的事情是按照框架的思想构建项目并完成怪物的自动巡逻状态&#xff0c;当主角靠近怪物时&#xff0c;怪物会朝向主角释放技能 首先新建脚本&#xff1a;BossCtrl.cs (通常把xxxCtrl.cs脚…

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)

文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道&#xff0c;用ResponseBody注解标注的接口&#xff0c;默认返回给页面的是json数据。 其实&#xff0c;也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…

深入理解数据分析的使用流程:从数据准备到洞察挖掘

数据分析是企业和技术团队实现价值的核心。 5 秒内你能否让数据帮你做出决策&#xff1f; 通过本文&#xff0c;我们将深入探讨如何将原始数据转化为有意义的洞察&#xff0c;帮助你快速掌握数据分析的关键流程。 目录 数据分析的五个核心步骤1. 数据获取常用数据获取方式 2. 数…

【CS110L】Rust语言 Lecture3-4 笔记

文章目录 第三讲 所有权:移动与借用&例1例2例3 错误处理&#xff08;开头&#xff09;为什么空指针如此危险&#xff0c;我们能做什么以应对&#xff1f;— 引出Optionis_none()函数unwrap_or()函数常见用法 第四讲 代码实践:链表Box节点和链表的定义节点和链表的构造函数判…

charls基于夜神模拟器抓取安卓7.0应用程序https请求

charls基于夜神模拟器抓取安卓7.0应用程序https请求 1、安装charls(安装步骤这里就不详细说了)2、下载证书(证书后缀名 xx.pem)3、使用git bash生成证书hash4、上传证书到安卓的系统证书目录下(夜神模拟器方案)5、验证抓包1、安装charls(安装步骤这里就不详细说了) 2、…

【Vue】2

1 Vue 生命周期 Vue生命周期&#xff1a;一个 Vue 实例从 创建 到 销毁 的整个过程 创建(create)阶段&#xff1a;组件实例化时&#xff0c;初始化数据、事件、计算属性等挂载(mount)阶段&#xff1a;将模板渲染并挂载到 DOM 上更新(update)阶段&#xff1a;当数据发生变化时…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分&#xff1a;离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理&#xff0c;以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

第十一周:机器学习

目录 摘要 Abstract 一、字符级的RNN进行名字分类 1、准备数据 2、构造神经网络 3、训练 4、评价结果 5、预测 二、字符级的RNN生成名字 1、准备数据 2、构造神经网络 3、训练 4、网络采样&#xff08;预测&#xff09; 三、batch normalization 1、 feature n…

Bootstrap 警告信息(Alerts)使用介绍

本章将讲解警告&#xff08;Alerts&#xff09;以及 Bootstrap 所提供的用于警告的 class。警告&#xff08;Alerts&#xff09;向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可…