【Linux】认识协议、Mac/IP地址和端口号、网络字节序、socket套接字

头像
⭐️个人主页:@小羊
⭐️所属专栏:Linux
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

    • 1、初识协议
    • 2、Mac、IP地址
    • 3、端口号
    • 4、网络字节序
    • 5、socket


1、初识协议

  • 协议就是一种约定。
  • 如何让不同厂商生产的计算机之间能够互相通信?需要由权威组织或公司制定网络协议。
  • 协议本质也是软件,在设计上为了更好的进行模块化,解耦合,因此被设计为层状结构。

协议本质也是软件,为了更好的模块换,降低耦合度,所以被设计为层状结构。在Linux网络协议栈中,各个层次协同工作,以实现数据的封装、传输、路由和接收。从底层到高层,这些层次包括:

  1. 链路层(数据链路层):负责物理网络上的数据传输,包括帧的封装、错误检测和纠正等。在Linux中,这一层通常与特定的网络接口卡(NIC)驱动程序相关联。

  2. 网络层:提供IP地址管理和路由功能,确保数据包能够正确地从一个网络传输到另一个网络。Linux支持IPv4和IPv6两种IP协议版本。

  3. 传输层:提供端到端的通信服务,确保数据的可靠传输或快速、不可靠的传输。TCP(传输控制协议)提供可靠的数据传输,而UDP(用户数据报协议)则提供无连接的数据传输服务。

  4. 应用层:提供用户和网络服务之间的接口,包括HTTP(用于Web浏览)、SMTP(用于电子邮件发送)、FTP(用于文件传输)等多种应用层协议。

一般而言:

  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
  • 对于一台路由器,它实现了从网络层到物理层
  • 对于一台交换机,它实现了从数据层到物理层
  • 对于一台集线器,它只实现了物理层

2、Mac、IP地址

每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址

以太网中,任何时刻,只允许一台机器向网络中发送数据。如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞,所有发送数据的主机要进行碰撞检测和碰撞避免,没有交换机的情况下,一个以太网就是一个碰撞域,局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定的。

其中每层都有协议,当我们进行传输流程的时候,要进行封装和解包:
在这里插入图片描述
Tcp/IP通讯过程:
在这里插入图片描述

IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址,对于 IPv4 来说, IP 地址是一个 4 字节,32 位的整数,我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如1.94.9.200,用点分割的每一个数字表示一个字节,范围是 0 - 255。

在这里插入图片描述

Mac地址 vs IP地址:
唐僧从东土大唐出发,要去西天拜佛求经,途中要经过女儿国和黑风岭,女儿国和黑风岭是相邻两地。

  • 东土大唐 -> 西天:源IP地址 -> 目的IP地址
  • 女儿国 -> 黑风岭:源Mac地址 -> 目的Mac地址

其中经过的各个国家就是路由器,相邻的国家在同一个局域网中,路由器路由的下一个目的地是根据目的IP地址路由的,局域网通信需要Mac地址指路,一般Mac地址只在局域网中有效,IP地址几乎不变。

IP在网络中标识主机的唯一性,数据传输到主机不是目的而是手段,最终到达主机内的目的进程才是目的。但是在主机中,同一时间进程可能有很多,那怎么找到目的进程呢?


3、端口号

端口号(port)是传输层协议的内容,是一个2字节16位的整数,端口号标识唯一进程,一个端口号只能被一个进程占用

IP地址+端口号能够标识网络中的唯一进程。
网络通信,本质上也是进程间通信。

其中 0 - 1023 是知名端口号,HTTP, FTP, SSH等这些广为使用的应用层协议,它们的端口号都是固定的。1024 - 65535 是操作系统动态分配的端口号,比如客户端程序的端口号就是有操作系统动态分配的。

pid也可以标识唯一进程,为什么还要引入端口号呢?
进程pid属于系统概念,如果继续沿用pid标识唯一进程,会增加耦合度。另外,一个进程可以绑定多个端口号,但一个端口号不能被多个进程绑定。

网络通信的本质,也是进程间通信,本质是两个互联网进程代表人来进行通信。IP + port 叫做套接字socket。

传输层的典型代表:

TCP协议UDP协议
传输层协议传输层协议
有连接无连接
可靠传输不可靠传输
面向字节流面向数据报

4、网络字节序

内存中的多字节数据相对于内存地址有大端和小端之分,网络数据流同样有大端小端之分,如何定义网络数据流的地址?

  • 网络数据流的地址被规定:先发出去的是低地址,后发出去的是高地址。
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。

为使网络程序具有可移植性,使用样的C代码在大端和小端机器上编译后都能正常运行,可以调用下面库函数做网络字节序主机字节序的转换。

#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t hostlong);
uint16_t ntohs(uint16_t hostshort);
  • h表示hostn表示networkl表示32位长整数,s表示16位短整数。

5、socket

socket常见API:

// 创建 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);

socket:

  1. socket()打开一个网络通讯端口,如果成功,就像open()一样返回一个文件描述符,出错返回-1
  2. 应用程序可以像读写文件一样用 read/write 在网络上收发数据
  3. 对于 IPv4, family 参数指定为 AF_INET
  4. 对于 TCP 协议,type 参数指定为 SOCK_STREAM,表示面向流的传输协议
  5. protocol 参数指定为 0 即可

bind:

  1. bind()成功返回 0,失败返回-1
  2. bind()的作用是将参数 sockfd 和 myaddr 绑定在一起,使 sockfd 这个用于网络通讯的文件描述符监听 myaddr 所描述的地址和端口号
  3. struct sockaddr *是一个通用指针类型,myaddr 参数实际上可以接受多种协议的 sockaddr 结构体,而它们的长度各不相同,所以需要第三个参数 addrlen指定结构体的长度,我们可以对 myaddr 参数这样初始化:
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(_port);
local.sin_addr.s_addr = INADDR_ANY;

listen:

  1. listen()声明 sockfd 处于监听状态,并且最多允许有 backlog 个客户端处于连接
    等待状态,如果接收到更多的连接请求就忽略
  2. listen()成功返回 0,失败返回-1

accept:

  1. 三次握手完成后,服务器调用 accept()接受连接
  2. 如果服务器调用 accept()时还没有客户端的连接请求,就阻塞等待,直到有客户端
    连接上来
  3. addr 是一个传出参数,accept()返回时传出客户端的地址和端口号
  4. 如果给 addr 参数传 NULL,表示不关心客户端的地址
  5. addrlen 参数是一个传入传出参数(value-result argument),传入的是调用者提供的,缓冲区 addr 的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度

connect:

  1. 客户端需要调用 connect()连接服务器
  2. connect 和 bind 的参数形式一致,区别在于 bind 的参数是自己的地址,connect 的参数是对方的地址
  3. connect()成功返回 0,出错返回-1

注意:

  1. 由于客户端不需要固定的端口号,因此不必调用 bind(),客户端的端口号由内核自动分配
  2. 客户端不是不允许调用 bind(),只是没有必要显示的调用 bind()固定一个端口号,否则如果在同一台机器上启动多个客户端,就会出现端口号被占用导致不能正确建立连接
  3. 服务器也不是必须调用 bind(),但如果服务器不调用 bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦

sockaddr结构:

sock API是一层抽象的网络编程接口,适用于各种底层网络协议,各种网络协议的地址格式并不相同。

在这里插入图片描述
socket API 可以都用struct sockaddr*类型表示,在使用的时候需要强制转换成sockaddr_in,增加了程序的通用性。


本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像

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

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

相关文章

ubuntu 安装docker

ubuntu 安装docker 官网地址 https://docs.docker.com/engine/install/ubuntu/ 尽量根据官网的来&#xff0c;网上找的很多都是一大堆各种报错 卸载旧版本 新机器不需要操作 卸载的非官方包是&#xff1a; docker.iodocker-composedocker-compose-v2docker-docpodman-docker…

环境变量2

目录 环境变量PATH 如何改变PATH 我们今天继续来学习环境变量2&#xff01;&#xff01;&#xff01; 环境变量PATH PATH的作用是知道命令的搜索路径&#xff0c;我们都知道Linux上的命令行指令&#xff0c;ll&#xff0c;pwd什么的为什么我们写出来系统就知道是什么并且运…

网络安全中的机器学习

当涉及到网络安全时&#xff0c;技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中&#xff0c;我将介绍一些当前在网络安全领域使用的关键技术&#xff0c;包括加密&#xff0c;身份验证和防火墙。 首先&#xff0c;加密是网络安全中最常见的技术之一。加密是指使用算…

sass报错:[sass] Undefined variable. @import升级@use语法注意事项

今天创建vue3项目&#xff0c;迁移老项目代码&#xff0c;使用sass的时候发现import语法已经废弃&#xff0c;官方推荐使用use替换。 这里我踩了一个坑找半天的问题&#xff0c;原因是sass升级到1.85之后 定义变量前加上 - 就是表示变量私有&#xff0c;即使使用use导出 在新的…

嵌入式经常用到串口,如何判断串口数据接收完成?

说起通信&#xff0c;首先想到的肯定是串口&#xff0c;日常中232和485的使用比比皆是&#xff0c;数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu&#xff08;如&#xff1a;stm32f103&#xff09;在出厂时就已经在…

激光雷达YDLIDAR X2 SDK安装

激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.html‌YDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器&#xff0c;具有以下主要特点和规格参数‌&#xff1a; ‌测距频率‌&#xff1a;3000Hz ‌扫描频…

deepseek本地调用

目录 1.介绍 2.开始调用 2.1模型检验 2.2 通过url调用 3.总结 1.介绍 这篇博客用来教你如何从本地调用ollama中deepseek的模型接口&#xff0c;直接和deepseek进行对话。 2.开始调用 2.1模型检验 首先要保证ollama已经安装到本地&#xff0c;并且已经下载了deepseek模型…

word$deepseep

1、进入官网地址。 DeepSeek 2、进入DeepSeek的API文档 3、点击DeepSeek开放平台左侧的“API Keys”, 再点击“创建API Key” 4、在弹出的对话框中&#xff0c;输入自己的API Key名称&#xff0c;点击创建。 sk-0385cad5e19346a0a4ac8b7f0d7be428 5、打开Word文档。 6、Word找…

自制简单的图片查看器(python)

图片格式&#xff1a;支持常见的图片格式&#xff08;JPG、PNG、BMP、GIF&#xff09;。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…

DeepSeek多模态统一模型Janus算法解析

&#xfeff;DeepSeek多模态统一模型算法解析与功能抢先体验 &#xfeff; 多模态统一模型是一种能够同时处理多模态输入&#xff08;如文本、图像、视频等&#xff09;并进行理解和生成任务的人工智能模型。这种模型可以将将多模态理解&#xff08;如视觉问答、图像描述等&a…

分享8款AI生成PPT的工具!含测评

随着人工智能技术的飞速进步&#xff0c;制作PPT变得愈发便捷&#xff0c;仅需输入主题指令&#xff0c;便能在瞬间获得一份完整的演示文稿。尤其在制作篇幅较长的PPT时&#xff0c;手动编写每一页内容并设计格式和排版&#xff0c;不仅效率低下&#xff0c;而且耗时耗力。 本…

猿大师办公助手对比其他WebOffice在线编辑Office插件有什么优势

1. 原生Office功能完整嵌入&#xff0c;排版一致性保障 猿大师办公助手直接调用本地安装的微软Office、金山WPS或永中Office&#xff0c;支持所有原生功能&#xff08;如复杂公式、VBA宏等&#xff09;&#xff0c;确保网页编辑与本地打开的文档排版完全一致。 提供OLE嵌入和完…

关于C#的一些基础知识点汇总

1.C#结构体可以继承接口吗&#xff1f;会不会产生GC&#xff1f; 在 C# 中&#xff0c;结构体不能继承类&#xff0c;但可以实现接口。 代码&#xff1a; interface IMyInterface {void MyMethod(); }struct MyStruct : IMyInterface {public void MyMethod(){Console.Write…

【第一节】C++设计模式(创建型模式)-工厂模式

目录 前言 一、面向对象的两类对象创建问题 二、解决问题 三、工厂模式代码示例 四、工厂模式的核心功能 五、工厂模式的应用场景 六、工厂模式的实现与结构 七、工厂模式的优缺点 八、工厂模式的扩展与优化 九、总结 前言 在面向对象系统设计中&#xff0c;开发者常…

CUDA兼容NVIDA版本关系

CUDA组成 兼容原则 CUDA 驱动(libcuda.so)兼容类型要求比CUDA新向后兼容无主版本一致&#xff0c;子版本旧兼容需要SASS、NVCC比CUDA老向前兼容提取对应兼容包 向后兼容&#xff1a;新版本支持旧版本的内容&#xff0c;关注的是新版本能否处理旧版本的内容。 向前兼容&#…

便捷批量字符一键查找替换工具

软件介绍 今天要给大家分享一款超好用的批量字符替换工具。它操作便捷&#xff0c;只需一键&#xff0c;就能帮你轻松查找替换内容。 这款工具的兼容性堪称强大&#xff0c;支持 txt、reg、bat、cmd、htm、html、xml、asp、aspx、php、php3、php4、php5、jsp、asax、java、cp…

环境变量1

我们今天开始学习环境变量&#xff0c;在此之前我们先接触一下命令行参数是什么 命令行参数 如上图所示&#xff0c;没想到main函数还可以带参数&#xff0c;argc和argv就是命令行参数&#xff0c;argc在C11里面叫可变参数模板&#xff0c;这里同样可变&#xff0c;argc是参数…

【Linux Redis】关于用docker拉取Redis后,让虚拟机运行起来redis,并使得其可以连接到虚拟机外的navicat。

步骤一&#xff1a;拉取Redis镜像 docker pull redis 这个命令会下载最新版本的Redis镜像到你的本地Docker仓库中。你也可以指定一个具体的版本号&#xff0c;例如docker pull redis:6.2.6&#xff0c;来拉取特定版本的Redis镜像。 如果拉取遇到问题请参考【Linux AnolisOS】关…

Android Hal AIDL 简介 (一)

Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…

《Real-IAD: 用于基准测试多功能工业异常检测的真实世界多视角数据集》学习笔记

paper&#xff1a;2403.12580 GitHub&#xff1a;Real-IAD: A Real-World Multi-View Dataset for Benchmarking Versatile Industrial Anomaly Detection 目录 摘要 1、介绍 2、相关工作 2.1 异常检测数据集 2.2 标准异常检测 2.3 异常检测中的其他设置 3、Real-I…