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

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

文章目录

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

在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是无连接的,但数据报的发送和接收依然依赖于端口号来正确地路由到相应的进程。

相关文章:

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

文章目录 一、引入端口号二、端口号的作用三、端口号的确定 在TCP/IP协议中,传输层有两个重要的协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP用于提供可靠的数据传输,而UDP则适合用于广播…...

Python 解析 JSON 数据

1、有如下 JSON 数据,存放在 data.json 文件: [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…...

利用LlamaIndex构建ARG本地知识库

文章目录 1. 环境准备2. 启用诊断日志3. 配置本地模型4. 配置本地向量模型5. LlamaIndex全局配置6. 创建 PGVectorStore7. 从数据库加载数据8. 文本分割器: SpacyTextSplitter9. 配置管道10. 创建向量存储索引11 .指定响应模式,以及启用流式响应 在现代的人工智能应…...

PCM的缺点

PCM的主要缺点包括需要较大的‌数据传输带宽和‌存储空间,导致无法实现‌高压缩比,相对较低的‌数据压缩效率。‌‌ PCM(脉冲编码调制)作为一种无损编码技术,虽然能够保留原始信号的完整性,适用于需要高保…...

【C语言】(指针系列四)回调函数+qsort函数

一、回调函数 回调函数就是通过函数指针调用的函数 如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编…...

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度,它的矩阵乘法都只能作用于最后两个维度。 例如: import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…...

【Kubernetes】常见面试题汇总(十)

目录 29.简述 Kubernetes 自动扩容机制? 30.简述 Kubernetes Service 类型? 31.简述 Kubernetes Service 分发后端的策略? 32.简述 Kubernetes Headless Service ? 29.简述 Kubernetes 自动扩容机制? (…...

CSS —— 界面布局

flexbox - 弹性盒子布局(弹性布局) 一维方向,横纵向排列。 采用flex布局的元素,称为 Flex 容器(flex container),简称"容器" flex-direction 用于设置主轴方向;子元素默…...

SpringBoot万级并发-jemeter-Address already in use: connect

一、场景 用Jmeter压力单测接口的时候,发现报 Response code:Non HTTP response code: java.net.BindException Response message:Non HTTP response message: Address already in use: connect 然后我这边是wondows的电脑操作压测的,操作系统win10&…...

P1228 地毯填补问题

![](地毯填补问题 - 洛谷) #include<bits/stdc.h> using namespace std; #define qw dfs(zxl-1,zyl-1,zx,zy,l); #define we dfs(zxl-1,zyl,zx,zyl,l); #define er dfs(zxl,zyl-1,zxl,zy,l); #define rt dfs(zxl,zyl,zxl,zyl,l);void dfs(int x,int y,int zx,int zy,int…...

【计算机网络】UDP TCP介绍

UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…...

JDBC初相识

文章目录 JDBC的由来JDBC的好处 JDBC核心API的介绍JDBC会用到的包JDBC四个核心对象JDBC访问数据库的步骤 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL&#xff1a;SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库&#xff0c;今天要学习…...

Go语言现代web开发07 map字典

Maps are complex data types used to store key-value pairs. Each key can appear only once on the map and can be used to find the value paired with that key. The default value for the map is nil. A nil map has no keys and keys cannot be added. 映射是用于存储…...

AI工具一键制作爆火的“汉语新解“卡片!

最近出现了一种很火的新玩法“汉语新解”。 AI把一个词汇&#xff0c;以一种特殊的视角&#xff0c;用幽默、讽刺等方式重新定义&#xff0c;然后生成一张精美的卡片。 这个玩法和之前我发的的吐槽工具玩法类似&#xff0c;主打的就是一个新颖、情绪释放。 今天教大家怎么快速…...

windows检查端口占用并关闭应用

要在Windows CMD中找到占用8888端口的应用并关闭该应用&#xff0c;你可以按照以下步骤操作&#xff1a; 打开命令提示符&#xff08;CMD&#xff09;。你可以通过在搜索栏输入 cmd 或使用 Win R 快捷键&#xff0c;然后输入 cmd 并回车来打开。 查找占用8888端口的进程。在C…...

机器学习-聚类算法

机器学习-聚类算法 1.AHC2. K-means3. SC4.MCL 仅个人笔记&#xff0c;感谢点赞关注&#xff01; 1.AHC 2. K-means 3. SC 传统谱聚类&#xff1a;个人对谱聚类算法的理解以及改进 4.MCL 目前仅专注于NLP的技术学习和分享 感谢大家的关注与支持&#xff01;...

keil 中 printf重定向

int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (void*)&ch, 1, 1000);return ch;} 同时勾选&#xff0c;使用微库...

yum下载软件失败:‘Could not resolve host: mirrorlist .centos .org; Unknowm error

Loaded plugins: fastestmirror, ovl Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infracontainer error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; Unknow…...

云轴科技ZStack 获鲲鹏应用创新大赛2024上海赛区决赛一等奖

9月13日&#xff0c;鲲鹏应用创新大赛2024上海赛区决赛成功举办。经评委专家从方案创新性、技术领先性、商业前景以及社会价值四个维度严格评审&#xff0c;云轴科技ZStack参赛作品《ZStack鲲鹏原生开发方案》荣获上海赛区企业赛——原生开发赛道&#xff08;互联网&#xff09…...

沉浸式体验Stability AI最新超强AI图片生成模型Ultra

2024年9月4日&#xff0c;亚马逊云科技在Amazon Bedrock上新了Stability AI最新的的三款文本图像生成模型&#xff1a;他们分别是Stable Image Ultra、Stable Diffusion 3 Large 和 Stable Image Core。全新的模型在处理多主题提示词、图像质量和图片排版上较上一代模型有显著提…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...