【计算机网络】认识端口号 认识传输层协议 认识网络字节序 认识socket套接字

news2024/12/27 2:08:07

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、端口号
      • 1.1 概念
      • 1.2 端口号 vs 进程pid
  • 二、传输层协议
  • 三、网络字节序
  • 四、socket套接字
      • 2.1 常见API
      • 2.2 sockaddr结构

一、端口号

1.1 概念

首先我们需要明确的是,两台主机之间的通信不仅仅是数据的传输,更重要的是实现了对端主机上的具体服务的访问。比方说我们用户在用抖音刷视频时,不仅仅是想将我们的请求发送给对端服务器,更是访问和利用对端服务器上运行的特定服务——视频服务。

也就是说,网络通信本质上就是两个进程之间在进行通信,只不过这里是跨网络的进程间通信。比如手机上的淘宝和抖音应用进程通过网络与对端服务器上的淘宝服务进程和抖音服务进程进行交互,完成从请求到响应的完整通信流程。这个过程涉及了多个层次的协议和技术,但其基本的通信模式仍然是进程间通信的一个扩展。

因此,进程间通信的方式除了管道、消息队列、信号量、共享内存等方式外,还有套接字socket,只不过前者是不跨网络的(基于单主机的),而后者是跨网络的。

在这里插入图片描述
通过网络协议栈来利用网络资源,让两个不同的进程看到同一个资源


那以上说的这些和端口号有什么关系呢?

在网络通信中,尤其是涉及多个进程的情况下,每台主机上可能有多个应用程序(进程)同时进行网络通信。例如,一台主机上可能同时使用HTTP协议与Web服务器通信和FTP协议进行文件传输。那如何确保数据能够准确地从一个主机上的进程传输到另一个主机上的正确进程,并在通信结束后,确保响应数据能够准确地返回到原始的发起进程。

因此,端口号port的作用实际就是标识一台主机上的一个网络应用层的进程,其作用就是让数据能够准确地从发送进程传递到目标进程,并确保响应数据能够正确地返回。 那就必须要有源端口号目标端口号

  • 源端口号:当客户端进程向服务器发送请求时,会在数据包中包含一个源端口号。这是客户端进程使用的端口号。
  • 目标端口号:数据包中还包含一个目标端口号,用于指示服务器上哪个进程应该处理这个数据包。

其它说明:

  • 端口号是一个2字节16位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程
  • 一个端口号只能被一个进程占用

网络通信本质就是进程间通信,而进程间通信需要标识哪两个进程在通信,由于IP地址能够唯一标识公网内的一台主机,而端口号能够唯一标识一台主机上的一个进程。因此,用 IP地址+端口号就可以标识公网环境下的唯一的网络进程。

当数据在传输层进行封装时,就会添加上对应源端口号和目的端口号的信息。这时通过源IP地址+源端口号就能够在网络上唯一标识发送数据的进程,通过目的IP地址+目的端口号就能够在网络上唯一标识接收数据的进程,此时就实现了跨网络的进程间通信。

而这种基于IP地址+端口号的通信方式,我们称为socketsocket在英文上有插座的意思,插座上有不同规格的插孔,我们将插头插入到对应的插孔当中就能够实现电流的传输。因此,那些老外可能就想表达:在进行网络通信时,客户端就相当于插头,服务端就相当于一个插座,但服务端上可能会有多个不同的服务进程(多个插孔),因此当我们在访问服务时需要指明服务进程的端口号(对应规格的插孔),才能享受对应服务进程的服务。

一个进程可以绑定多个 端口号 吗?一个 端口号 可以被多个进程绑定吗?

端口号是隶属于某台主机的,所以端口号可以在两台不同的主机当中重复,但是在同一台主机上进行网络通信的进程的端口号不能重复,不然就无法区别要把数据发给哪个进程。

而如果一个进程绑定多个 端口号,依然可以保证唯一性,因为无论使用哪个端口号,数据始终只会交给一个进程;但如果一个端口号被多个进程绑定了,在信息递达时,是无法分辨该信息的最终目的进程的,存在二义性。端口号的作用是配合IP地址标识网络世界中进程的唯一性!!!

底层如何通过端口号找到对应进程的?

当接收方的传输层接收到数据包后,它需要确定数据包应该交给哪个应用程序(进程)处理。而端口号本身只是在网络协议中使用的标识,不能直接与应用层进程通信。因此,操作系统会维护一个端口号和进程pid的映射表(类似于哈希表),当底层拿到端口号时就可以直接执行对应的哈希算法,然后就能够找到该端口号对应的进程,最后就可以进行通信了。

1.2 端口号 vs 进程pid

端口号port的作用唯一标识一台主机上的某个进程,进程pid的作用也是唯一标识一台主机上的某个进程,那在进行网络通信时为什么不直接用pid来代替port呢?

首先需要明确的是:

  • 进程pid是用来标识系统内所有进程的唯一性的,它是属于系统级的概念。
  • 而端口号port是用来标识需要对外进行网络数据请求的进程的唯一性的,它是属于网络的概念。

一台机器上可能会有大量的进程,每个进程都必须要有自己的pid。但并不是所有的进程都要进行网络通信,可能有很大一部分的进程是不需要进行网络通信的本地进程(如守护进程),好像统一使用pid区分不开。

并且如果在网络中使用pid,会导致网络标准中被迫中引入进程管理相关概念,那么就会导致进程管理与网络强耦合,而网络本身就很复杂,再将pid与网络标准结合会增加系统的复杂度,可能影响网络协议的可维护性。而端口号的引入就是为了实现系统和网络解耦。

就比如每个人都有自己的身份证号,身份证号已经可以标识我们的唯一性了,但是当我们到了学校还是会有学号,到了公司还是会有工号。这是为什么呢?为什么不直接用身份证号来代替学号和工号呢?

因为身份证号是国家用于管理人民时用的编号,而学号是学校用于管理学生时用的编号,工号是公司用于管理员工时用的编号。但并不是全中国人都在某所学校或某家公司,因此在学校或公司当中,没必要用身份证号来标识每个人的唯一性。此时就出现了学号和工号,在学号和工号当中还可以包含一些便于管理的信息,比如入学(入职)年份、性别等信息。

也就是说,不同的场景,使用不同的编号来标识某种事物的唯一性可能更加合适 ~

二、传输层协议

主流的传输层协议有两个:TCPUDP。两个协议各有优缺点,可以采用不同的协议,实现截然不同的网络程序,关于TCPUDP的详细信息将会放到后面的博客中详谈,先对这两种协议有一个直观的认识:

  • TCP协议:传输控制协议(Transmission Control Protocol

    • 面向连接(建立连接)
    • 可靠传输
    • 面向字节流(字节流就像水龙头,用户可以根据自己的需求获取水流量)
  • UDP协议:用户数据报协议(User Datagram Protocol

    • 无连接
    • 不可靠传输
    • 面向数据报(数据报相当于包裹,用户每次获取的都是一个或多个完整的包裹)

关于可靠性

  • TCP的可靠传输并不意味着它可以将数据百分百递达,而是说它在数据传输过程中,如果发生了传输失败的情况,它会通过自己独特的机制来保证可靠(做更多的事),比如重新发送数据等方式。因此TCP协议底层的实现是比较复杂的。我们不能只看到TCP协议面向连接可靠这一个特点,也要能看到TCP协议对应的缺点。

  • UDP虽然是一种不可靠的传输协议,但这一定意味着UDP协议在底层不需要做过多的工作,只管发就完事了,出现丢包、乱序啥的也不关我的事。所以传输速度很快。因此,UDP协议底层的实现一定比TCP协议要简单。

TCPUDP的使用场景

编写网络通信代码时,虽然TCP协议具有可靠性,但也不能无脑选择TCP,如果真是这样的话,UDP就不会出现在教科书上了。因此,具体采用TCP协议还是UDP协议,完全取决于上层的应用场景。

  • 如果应用场景严格要求数据在传输过程中的可靠性,即需要保证数据完整性和顺序的场景。此时我们就必须采用TCP协议。比如金融交易、网页请求、文件传输等。
  • 如果应用场景允许数据在传输出现少量丢包,或者对传输速度要求较高的领域(对实时性要求高)。那么我们肯定优先选择UDP协议。比如短视频、直播等。

注意: 一些优秀的网站在设计网络通信算法时,会同时采用TCP协议和UDP协议,当网络流畅时就使用UDP协议进行数据传输,而当网速不好时就使用TCP协议进行数据传输,此时就可以动态的调整后台数据通信的算法。

三、网络字节序

回顾大小端

数据拥有高权值位和低权值位,比如在32位操作系统中,十六进制数0x11223344,其中的11称为最高权值位,44称为 最低权值位

计算机在存储数据时是有大小端的概念的:

  • 大端字节序(大端模式): 将数据的高权值存放在内存的低地址处,低权值存放在高地址处。
  • 小端字节序(小端模式): 将数据的高权值存放在内存的高地址处,低权值存放在低地址处。

如果编写的程序只在本地机器上运行,那么是不需要考虑大小端问题的,因为同一台机器上的数据采用的存储方式都是一样的。但如果涉及网络通信,那就必须考虑大小端的问题,否则对端主机识别出来的数据可能与发送端想要发送的数据是不一致的。

在这里插入图片描述

由于我们不能保证通信双方存储数据的方式是一样的。因此,网络当中传输的数据必须考虑大小端问题。必须要有一个标准。因此,TCP/IP协议规定:网络中传输的数据,统一采用大端存储方案,即低地址高字节,也就称为网络字节序。而现在大端/小端称为主机字节序。无论是大端机还是小端机,都必须按照TCP/IP协议规定的网络字节序来发送和接收数据。

  • 发送方:如果当前发送主机是小端,就需要先将数据转成大端。否则就忽略,直接发送即可。
  • 接收方:接收方需要将接收到的数据从网络字节序转换为主机字节序,以便应用程序可以正确地解释和处理这些数据。

系统提供了四个函数,可以通过调用以下库函数实现网络字节序和主机字节序之间的转换。

#include <arpa/inet.h>

// 将32位整数转换为网络字节序
uint32_t htonl(uint32_t hostlong);
// 将16位整数转换为网络字节序 
uint16_t htons(uint16_t hostshort);
// 将32位网络字节序整数转换为主机字节序 
uint32_t ntohl(uint32_t netlong);
// 将16位网络字节序整数转换为主机字节序
uint16_t ntohs(uint16_t netshort);

// l 表示32位长整数
// s 表示16位短整数

四、socket套接字

2.1 常见API

#include <sys/types.h>
#include <sys/socket.h>

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);

// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr* address, socklen_t address_len);

// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);

// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);

// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);

2.2 sockaddr结构

套接字编程的种类:

  1. 域间套接字(本地的进程间通信)
  2. 原始套接字
  3. 网络套接字编程

套接字不仅支持跨网络的进程间通信,还支持本地的进程间通信;原始套接字主要是用来编写网络工具。域间套接字和原始套接字我们不详谈。我们重点谈网络套接字编程,它主要是利用传输层协议(如TCPUDP)来实现进程间通信。

在进行跨网络通信时,需要我们传递端口号和IP地址,而本地通信则不需要。因此套接字提供了 sockaddr_in结构体sockaddr_un结构体

  • sockaddr_in结构体是用于跨网络通信
  • sockaddr_un结构体是用于本地通信

为了让套接字的网络通信和本地通信能够使用同一套函数接口,于是就出现了sockeaddr结构体,该结构体与sockaddr_insockaddr_un的结构都不相同,但这三个结构体头部的16个比特位都是一样的,这个字段叫做协议家族。

  • 可以根据16位地址类型,判断是网络通信,还是本地通信
  • 在进行网络通信时,需要提供IP地址、端口号等网络通信必备项。而本地通信只需要提供一个路径名,通过文件读写的方式进行通信(类似于管道)

注意: 实际我们在进行网络通信时,还是要定义sockaddr_insockaddr_un这样的结构体,只不过在传参时需要将该结构体的地址类型进行强转为sockaddr*。这是使用C语言实现多态的典型做法,确保该标准的通用性。

在这里插入图片描述

为什么参数没有用void*代替struct sockaddr*类型?

因为在该网络接口设计时,C语言还不支持void*这种类型,只能将套接字接口设置为struct sockaddr*作为通用指针类型。那现在支持了为什么不改呢?

尽管现代C语言支持void*,但为了保持向前兼容性,并避免对现有代码造成破坏。如果真的现在将接口参数类型修改为void*,那以前写的那些代码全部都要修改!

关于socketaddr_in结构的更多详细信息放到后面写代码时再细谈

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

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

相关文章

收银系统源码—千呼新零售【硬件篇】

连锁店收银系统源码—多商户平台入驻商城已上线-CSDN博客文章浏览阅读1k次。零售行业连锁店收银管理系统多商户入驻本地生活即时零售平台商城https://blog.csdn.net/V15850290240/article/details/141310629 详细介绍请查看上方文章↑↑↑ 详细介绍请查看上方文章↑↑↑ 详细…

[大模型]配置文件-Langchain-Chatchat-V0.3 (1)

文章目录 简述本地配置配置文件model_settings.yaml使用Ollama配置模型配置 使用Xinference配置模型配置修改默认使用的模型 对话基础对话知识库对话 简述 针对Langchain-Chatchat-V0.3版本&#xff0c;对配置文件与模型使用说明&#xff0c;本文建议使用Ollama配合Chatchat使…

用Python实现9大回归算法详解——09. 决策树回归算法

1. 决策树回归的基本概念 决策树回归&#xff08;Decision Tree Regression&#xff09;是一种树状结构的回归模型&#xff0c;通过对数据集进行递归分割&#xff0c;将数据分成更小的子集&#xff0c;并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈…

centos7.9系统安装cloudpods并使用ceph存储(二)

1.ceph安装 1.1 环境准备 配置hosts&#xff1a; $ vim /etc/hosts 10.121.x.x node01设置ssh无密码登录&#xff1a; # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa node01关闭selinux、firewalld # setenforce 0 # sed -i "s#SELINUXenforcing#SELINUXd…

国自然研究热点、“C位出圈”的类器官研究离不开细胞因子

前 言&#xff1a; 目前&#xff0c;类器官已从基础研究发展至药物开发和精准治疗。在疾病建模、药物开发、肿瘤研究、再生医学、精准医学等领域发展迅速。类器官与体内器官在功能和结构上的高度相似&#xff0c;使其广泛用于发育生物学和疾病建模。传统的2D细胞模型和模式动物…

k8s之Pod对象多种调度方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Redis数据库一文入门

Redis 是一个用于存储和管理数据的开源内存数据结构存储系统。它以其高性能和丰富的数据结构支持而闻名&#xff0c;是构建高效、可扩展应用程序的理想选择。本文将带你入门 Redis&#xff0c;并探讨其基本概念、安装步骤和一些常见的使用场景。 什么是 Redis&#xff1f; Re…

疯感工牌的风还是吹到了L4级无人驾驶

俗话说得好&#xff0c;打工人哪有不疯的&#xff1f; 最近你是不是也被“发疯工牌梗”刷屏了 一张张看似情绪稳定的工牌 以独特的方式展现了属于打工人自己的个性 这不&#xff0c;疯感工牌的风也吹到了无人驾驶 无人车也有了属于自己的时尚单品 看看它们都是如何介绍自己的&a…

Wot Design Uni:一个高颜值、轻量化的uni-app组件库,uni-app生态的新宠

一、介绍 wot-design-uni组件库基于vue3Typescript构建&#xff0c;参照wot design的设计规范进行开发&#xff0c;提供70高质量组件&#xff0c;支持暗黑模式、国际化和自定义主题&#xff0c;旨在给开发者提供统一的UI交互&#xff0c;同时提高研发的开发效率。 特性&#x…

新的网络钓鱼方法针对 Android 和 iPhone 用户

关注公众号网络研究观获取更多内容。 ESET 研究人员发现了一种针对 Android 和 iPhone 用户的不常见网络钓鱼活动。 他们分析了一起针对捷克某知名银行客户的网络钓鱼案例。 网络钓鱼流程 这种技术值得注意&#xff0c;因为它会从第三方网站安装钓鱼应用程序&#xff0c;而无…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

【大模型理论篇】基于3D可视化视角理解GPT

1. 背景介绍 先前我们通过多篇技术文章来分析大模型的原理&#xff0c;包括&#xff1a; 《Transformer原理及关键模块深入浅出》《GPT系列预训练模型原理讲解》、《大模型时代下Bert去哪啦》、《关于LLaMA 3.1 405B以及小模型的崛起》、《LLaMA3结构关键模块分析》、《强化学习…

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM&#xff08;文档对象模型&#xff09;元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了&#xff0c;每天都30度以上&#xff0c;我家猫狂掉毛&#xff0c;床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗&#xff0c;以为它生病了&#xff0c;连忙带它去看医生。医生告诉我&#xff0c;这是正常的猫咪换毛现象&#xff0c;我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍&#xff1a; 1. 将python代码编译为so&#xff08;win环境是pyd&#xff09; 2.打包生成wheel文件&#xff0c;可以使用pip 进行安装 1. 项目结构 注意&#xff0c;__init__.py文件是必须的&#xff0c;内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用&#xff0c;我依稀还记得在多年以前为了实现从数据库导出千万级别的数据&#xff0c;第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程&#xff0c;只知道 PHP-FPM 进程管理器是多进程模型&#xf…

【技术方案】智慧城市大数据平台技术方案(Doc原件)

第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 政策…

获发明专利加持,隆道加速推进企业级AI应用落地

近期&#xff0c;北京隆道网络科技有限公司研发的“基于供应链管理的AI采购业务分析装置及方法”获得国家发明专利授权。该项新专利的取得&#xff0c;证明了隆道在AI产业化应用中的技术前瞻性和创新性&#xff0c;也为隆道加速企业级AI应用落地提供了知识产权保障。 根据IBM发…

HTML+CSS+JavaScript制作动态七夕表白网页(含音乐+自定义文字)

源码介绍 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白,是不是要给女朋友或者正在追求的妹子一点小惊喜呢&#xff0c;今天这篇博客就分享下前端代码如何实现HTMLCSSJavaScript制作七夕表白网页(含音乐自定义文字)。赶紧学会了&#xff0c;来制作属于我们程序员的浪…