[Linux][网络][网络编程套接字][一][预备知识][套接字地址结构]详细讲解

news2024/11/19 17:45:55

目录

  • 0.预备知识
    • 1.理解源IP地址和目的IP地址
    • 2.理解源MAC地址和目的MAC地址
    • 3.端口号
    • 4.理解端口号和进程ID
    • 5.理解源端口号和目的端口号
    • 6.通过IP地址、端口号、协议号进行通信识别
    • 7.认识TCP协议和UDP协议
    • 8.网络字节序
  • 1.套接字地址结构(sockaddr)


0.预备知识

1.理解源IP地址和目的IP地址

  • 每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址
    • 因此一个传输的数据当中应该涵盖其源IP地址和目的IP地址
      • 目的IP地址表明该数据传输的目的地
      • 源IP地址作为对端主机响应时的目的IP地址
  • 在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址

2.理解源MAC地址和目的MAC地址

  • 大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机

  • 源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达另一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化
    请添加图片描述

  • 如上主机1向主机2发送数据的过程中,数据的源MAC地址和目的MAC地址的变化过程如下:

时间轴源MAC地址目的MAC地址
刚开始主机1的MAC地址路由器A的MAC地址
经过路由器A之后路由器A的MAC地址路由器B的MAC地址
  • 因此数据在传输的过程中是有两套地址:
    • 一套是源IP地址和目的IP地址,这两个地址在数据传输过程中基本是不会发生变化的
      • 存在一些特殊情况,比如在数据传输过程中使用NET技术,其源IP地址会发生变化,但至少目的IP地址是不会变化的
    • 另一套就是源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,因为在数据传输的过程中路由器不断在进行解包和重新封装

3.端口号

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

4.理解端口号和进程ID

  • PID表示唯一一个进程,此处端口号也是唯一表示一个进程。那么这两者之间是怎样的关系?

    • 网络模块和进程管理模块进行解耦合。进程pid在技术上是可以标定当前主机上某一个唯一的进程,但是实际上不会用进程PID做,进程PID属于进程管理范畴,而端口号属于网络范畴。如果非要用进程pid做两用(既做调度进程管理,又在网络上标定主机的一个唯一进程),无疑是将进程管理和网络强耦合起来了。它可以但不合理
  • 底层如何通过port找到对应进程的?

    • 实际底层采用哈希的方式建立了端口号和进程PID或PCB之间的映射关系,当底层拿到端口号时就可以直接执行对应的哈希算法,然后就能够找到该端口号对应的进程
  • 一个进程可以绑定多个端口号吗?

    • 可以的。未来一个进程在进行网络通信的时候,它可能既和客户端A通信,也和客户端A的子模块通信,所以此进程就会绑定两个端口号。只要能够通过端口号找到同一个进程即可
    • 但是一个端口号不能被多个进程绑定。因为端口号到进程具有唯一性

5.理解源端口号和目的端口号

  • 传输层协议(TCP和UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号。就是在描述"数据是谁发的,要发给谁"
  • 对于源IP地址和目的IP地址,就是确定了哪两台主机要通信
  • 对于源端口号和目的端口号,就是确定了两台主机上的哪两个进程要进行通信

6.通过IP地址、端口号、协议号进行通信识别

  • 本质上两台主机进行通信是需要IP地址、端口号和协议号的

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

    • 例如打开两个Web浏览器,同时访问服务器上的两个页面,就会在这个浏览器跟服务器之间产生类似前面的两个通信
    • 在这种情况下必须严格区分这两个通信
      • 因此可以源端口号加以区分
  • 下图中③和①的目标端口号和源端口号完全相同,但是它们各自的源IP地址不同

  • 此外,还有一种情况下图中并未列出,那就是IP地址和端口完全都一样,只是协议号(表示上层是TCP或UDP的一种编号)

    • 这种情况下,也会认为是两个不同的通信。
  • 因此,TCP/IP或UDP/IP通信中通常采用5个信息来识别一个通信

    • 源IP地址、目标IP地址、协议号、源端口号、目标端口号
    • 只要有一项不同就被认为是其他通信
      请添加图片描述
  • 总结:

    • IP****地址最大的意义在于指导一个报文该如何进行路径选择,到哪里去就是去找目标IP地址
    • 端口号的意义在于唯一的标识一台机器上的唯一一个进程
    • IP****地址 + 端口号 = 能够标识互联网中的唯一一个进程
    • IP****地址 + port(端口号) = socket(套接字)

7.认识TCP协议和UDP协议

  • TCP协议:
    • TCP协议叫做传输控制协议(Transmission Control Protocol),TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议
    • TCP协议是面向连接的,如果两台主机之间想要进行数据传输,那么必须要先建立连接,当连接建立成功后才能进行数据传输。其次,TCP协议是保证可靠的协议(也意味着要做更多的事情),数据在传输过程中如果出现了丢包、乱序等情况,TCP协议都有对应的解决方法
  • UDP协议:
    • UDP协议叫做用户数据报协议(User Datagram Protocol),UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议
    • 使用UDP协议进行通信时无需建立连接,如果两台主机之间想要进行数据传输,那么直接将数据发送给对端主机就行了,但这也就意味着UDP协议是不可靠的,数据在传输过程中如果出现了丢包、乱序等情况,UDP协议本身是不知道的
  • TCP协议和UDP协议不存在哪个更好的说法
    • 虽然TCP协议是可靠的,不过这也意味着它为了维持自己的可靠性,一定要做更多的工作,一定会比较复杂
    • 而UDP虽然是不可靠的,不需要做过多的工作,不过这也意味着UDP是足够简单的

8.网络字节序

  • 网络中的大小端问题:

    • 计算机在存储数据时是有大小端的概念的:
      • 大端模式: 数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在内存的高地址处
      • 小端模式: 数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在内存的低地址处
  • 由于我们不能保证通信双方存储数据的方式是一样的,因此网络当中传输的数据必须考虑大小端问题

  • 因此TCP/IP协议规定如下:网络数据流采用大端字节序,即低地址高字节

    • 无论是大端机还是小端机,都必须按照TCP/IP协议规定的网络字节序来发送和接收数据
    • 如果发送端是小端,需要先将数据转成大端,然后再发送到网络当中
    • 如果发送端是大端,则可以直接进行发送
    • 如果接收端是小端,需要先将接收到数据转成小端后再进行数据识别
    • 如果接收端是大端,则可以直接进行数据识别
  • 注意:

    • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
    • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
    • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址
  • 如下:由于发送端是小端机,因此在发送数据前需要先将数据转成大端,然后再发送到网络当中,而由于接收端是大端机,因此接收端接收到数据后可以直接进行数据识别,此时接收端识别出来的数据就与发送端原本想要发送的数据相同了
    请添加图片描述

  • 为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,系统提供了四个函数,可以通过调用以下库函数实现网络字节序和主机字节序之间的转换

    • 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数
      • 例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送
    • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
    • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);  // 主机转网络
uint16_t htons(uint16_t hostshort); // 网络转主机
uint32_t ntohl(uint32_t netlong);   // 按4字节为单位主机转网络
uint16_t ntohs(uint16_t netshort);  // 按2字节网络转主机

1.套接字地址结构(sockaddr)

  • socket API是一层抽象的网络编程接口,适用于各种底层网络协议**(定义在netinet/in.h)**

    • 如IPv4、IPv6,以及后面要讲的UNIX Domain Socket
    • 然而,各种网络协议的地址格式并不相同
  • 套接字不仅支持跨网络的进程间通信(网络套接字),还支持本地的进程间通信(域间套接字)

    • 在进行跨网络通信时我们需要传递的端口号和IP地址,而本地通信则不需要
  • 网络的设计者想要把跨网络通信和本地通信进行大一统,因此套接字提供了sockaddr_in结构体和sockaddr_un结构体

    • 其中sockaddr_in结构体是用于跨网络通信的(网络套接字)
    • 而sockaddr_un结构体是用于本地通信的(域间套接字)
  • 为了让套接字的网络通信和本地通信能够使用同一套函数接口,于是就出现了sockaddr结构体

    • 该结构体与sockaddr_in和sockaddr_un的结构都不相同,但这三个结构体头部的16个比特位都是一样的,这个字段叫做协议家族
  • 也就是说我们的套接字接口就这么一套,但是通信方式确有多种,你只需要给这个结构体(struct sockaddr)传输你想要的通信方式即可

    • 其实也不难看出,这种就类似于多态,所有的通信方式都是子类,struct sockaddr就是父类,父类指向不同的子类,就使用不同的方法
  • 我们要做的就是在使用的时进行强制类型转换即可

    • 类似C语言中指针void*,它的功能就是可以接受任意类型的指针,再进行强转也可以
    • 但是,早期在设计的时候还没有void*这种指针,所以这种用法一直延续至今
      请添加图片描述
  • 此时当我们在传参时,就不用传入sockeaddr_in或sockeaddr_un这样的结构体,而统一传入sockaddr这样的结构体

    • 在设置参数时就可以通过设置协议家族这个字段,来表明是要进行网络通信还是本地通信
      • 在这些API内部就可以提取sockeaddr结构头部的16位进行识别
      • 如果前16为地址类型是AF_INET,就是网络间通信
      • 如果地址类型是AF_UNIX,就是本地间通信
  • 如上就通过通用sockaddr结构,将套接字网络通信和本地通信的参数类型进行了统一

  • 注意:

    • IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址
    • IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6
    • socket API可以都用struct sockaddr* 类型表示,在使用的时候需要强制转化成sockaddr_in
      • 这样的好处是程序的通用性,可以接收IPv4、IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数
// 通用套接字地址结构
/* Structure describing a generic socket address.  */
struct sockaddr
{
    __SOCKADDR_COMMON(sa_); /* Common data: address family and length */
    char sa_data[14];       /* Address data.  */
};

// IPV4套接字地址结构
/* Structure describing an Internet socket address.  */
struct sockaddr_in
{
    __SOCKADDR_COMMON(sin_);
    in_port_t sin_port;      /* Port number.  */
    struct in_addr sin_addr; /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof(struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof(in_port_t) -
                           sizeof(struct in_addr)];
};

// Unix域套接字地址结构
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket */
struct sockaddr_un
{
    __SOCKADDR_COMMON(sun_);
    char sun_path[108]; /* Path name.  */
};

/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr
{
    in_addr_t s_addr;
};
  • in_addr用来表示一个IPv4的IP地址,其实就是一个32位的整数

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

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

相关文章

【智能算法】骑手优化算法(ROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2018年&#xff0c;D Binu等人受到骑手群体竞赛赢得比赛行为启发&#xff0c;提出了骑手优化算法&#xff08;Rider Optimization Algorithm, ROA&#xff09;。 2.算法原理 2.1算法思想 ROA基…

[ESP32]:TFLite Micro推理CIFAR10模型

[ESP32]&#xff1a;TFLite Micro推理CIFAR10模型 模型训练 数据集处理 from keras.datasets import cifar10 from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, load_model, Model from keras.layers import Input, Dense, …

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

AG32 MCU在触摸屏的应用(AGM FPGA/MCU行业应用)

传统的屏驱MCU常见应用于洗衣机、空调、空调面板、仪器仪表等人机交互界面显示场景中&#xff0c;通常是以段码的形式显示设备运转的时间、温度、测量结果等简单运行数据&#xff0c;随着人机交互需求丰富化&#xff0c;智能家居设备、摩托车、电动车等产品也逐步增加了屏幕显示…

解决Milvus官网提供的单机版docker容器无法启动,以及其它容器进程与Milvus容器通信实现方案【Milvus】【pymilvus】【Docker】

文章目录 问题预备知识方案获取pymilvus获取milvus 实例多容器通信 问题 我的需求是做混合检索单机版可以满足&#xff0c;要走Docker容器部署&#xff0c;还需要和另一个容器中的程序做通信。官方文档提供的Milvus安装启动Milvus方案&#xff0c;见文档&#xff1a;传送门 我…

为什么要学音视频?

一直都在说“科技改变生活”&#xff0c;现实告诉我们这是真的。 随着通信技术和 5G 技术的不断发展和普及&#xff0c;不仅拉近了人与人之间的距离&#xff0c;还拉近了人与物&#xff0c;物与物之间的距离&#xff0c;万物互联也变得触手可及。 基于此背景下&#xff0c;音…

Eclipse 如何设置 Maven 下载源代码和文档

在 Eclipse 的 Windows 菜单下选择属性。 然后在 Maven 选项下&#xff0c;选择下载包的源代码和文档。 保存应用即可。 Eclipse 如何设置 Maven 下载源代码和文档 - Java - iSharkFly在 Eclipse 的 Windows 菜单下选择属性。 然后在 Maven 选项下&#xff0c;选择下载包的源代…

Linux异步io机制 io_uring

io_uring作为2019年的后起之秀&#xff0c;为linux异步网络编程新增一把倚天大剑&#xff0c;让我们简单学习一下&#xff01; 数据结构&#xff1a; a. sq (submition queue)&#xff1a;提交队列&#xff0c;一个存放待执行事件的环形队列 b. cq (completion queue): 完成…

自定义大整数类(初次版本)

例子&#xff1a; #include "X:\Work\Share\CCode\CPlatform\MathExt\_MathExt_out.h"using namespace lf; using namespace std;int main() {_Integer i1 _t("12345678989764581381214575686787987979234234354364");_Integer i2 _t("1234567898…

SpringCloud02(远程调用Feign,网关Gateway,配置中心Nacos)

目录 一、远程调用Feign【要会用】 1. Feign简介 1 什么是Feign 2 准备基础代码 2. Feign入门【重点】 步骤 实现 测试 3. Feign配置Ribbon 1 说明 2 配置 4. Feign配置日志 1 说明 2 步骤 5. Feign使用优化 1 说明 2 步骤 6. 小结 二、网关Gateway 1. 网关…

基于深度学习神经网络的AI图片上色DDcolor系统源码

第一步&#xff1a;DDcolor介绍 DDColor 是最新的 SOTA 图像上色算法&#xff0c;能够对输入的黑白图像生成自然生动的彩色结果&#xff0c;使用 UNet 结构的骨干网络和图像解码器分别实现图像特征提取和特征图上采样&#xff0c;并利用 Transformer 结构的颜色解码器完成基于视…

xfce4 panel 不能显示QQ,钉钉的状态图标

有一段时间不能显示了&#xff0c;之前刚装完系统的时候很长时间内都是好的&#xff0c;所以刚开始肯定是支持显示这些状态图标的。就是因为不能显示的原因&#xff0c;所以还装了lxQt桌面&#xff0c;这个桌面确实不错。不过还是有时会怀念xfce4&#xff0c;想看看能不能解决这…

面经总结(二)(数据库)

数据库常识&#xff1a; 1、数据库系统包含什么&#xff1f; 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库&#xff08;DB)&#xff1a;顾名思义是存放数据的仓库&#xff0c;实现数据的持久化。 数据库管理系统&#xff08;DBMS)&#xff1a;类似于操作系…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献&#xff1a; 1 安装ollama curl -fsSL …

(GEE)2000-2020年黄河流域时序渐变图及高程模型计算 JavaScript版

文章目录 一. 选取目标区域二. NDVI实现三. 高程模型DEM实现四. 时序图五. 植被覆盖类型六. 参考文献 首先推荐吴秋生老师团队开源的便捷构建网站&#xff1a;适用于地理空间应用的Streamlight 吴秋生老师团队的工具请自行探索。本文讲解基于GEE云开发平台实现&#xff0c;基于…

关于springboot内置tomcat最大请求数配置的一些问题

前言 springboot内置了tomcat。那么一个springboot web应用&#xff0c;最大的请求链接数是多少呢&#xff1f;很早以前就知道这个是有个配置&#xff0c;需要的时候&#xff0c;百度一下即可。但&#xff0c;事实并非如此&#xff0c;有几个问题我想大多数人还真不知道。比如…

机械图纸管理系统,如何选择适合的机械图纸管理系统?

机械图纸管理系统是一种专门用于管理和跟踪机械制造过程中的图纸、设计文件和相关信息的软件系统。例如&#xff1a;彩虹图纸管理系统&#xff0c;这种系统能够有效地整合和管理工程图纸、零部件清单、技术规范、工艺流程等各种数据&#xff0c;为企业提供全面的图纸管理和协作…

typescript:vscode的settings配置文件配置ts语法提示

typescript&#xff1a;vscode的settings配置文件配置ts语法提示 1 找到vscode左下角的齿轮按钮 2 点击Settings&#xff08;或者快捷键ctrl,&#xff09;&#xff1a; 点击右上角的Open Settings(JSON)按钮打开配置文件&#xff1a; 或者ctrlshiftp&#xff0c;搜索settings&…

嵌入式全栈开发学习笔记---Linux基本命令1

目录 cd加路径 相对路径是什么 绝对路径是什么 cd后面没有路径 cd- ls -l ls -a ls -al ls加路径 Linux的命令是数不清的&#xff0c;就像很多应用软件一样&#xff0c;随时都有可能被开发出来。 但是我们目前阶段只需要掌握基本的命令就可以了。 上一篇博文中我已经…

元宇宙APP搭建重点,会用到哪些三方服务?

元宇宙APP的搭建是一个综合性的项目&#xff0c;涉及到众多关键要素和第三方服务。以下是一些元宇宙APP搭建的重点&#xff0c;以及可能用到的第三方服务&#xff1a; 一、搭建重点 技术框架的选择与搭建&#xff1a;元宇宙APP需要稳定、高效的技术框架来支撑其运行。这包括前…