【计网】从零开始认识网络socket

news2024/9/24 21:26:09

在这里插入图片描述

优于别人,并不高贵,
真正的高贵应该是优于过去的自己。
--- 海明威 ---

从零开始认识网络socket

  • 1 网络通信流程
  • 2 IP地址 VS MAC地址
  • 3 网络socket
    • 3.1 理解源 IP 地址和目的 IP 地址
    • 3.2 传输层的典型代表
    • 3.3 网络字节序
    • 3.4 socket编程基础

1 网络通信流程

两台主机进行通信时,需要进行两个通信协议栈,分别进行封装信息和解包信息。网络层包装协议时,会加入当前IP地址和目标IP地址,然后再次封装到数据链路层进行通信。路由器得到数据包后进行一层的解包,通过目标IP地址进行判断:

  • 发现不是给同一局域网的主机,直接通过MAC地址找到目标
  • 发现是给不同局域网的主机,就推送数据包给路由器进行搜索对应IP地址,然后再次封装数据包进行通信,最后通过MAC地址找到对应主机。

图示:
在这里插入图片描述

  1. 网络层(就是IP层)向上(包括网络层)看到的所有的报文的都是一样的,至少是IP报文。
  2. IP可以屏蔽底层网络的差异
  3. 所以的网络都是IP网络,所以手机,电脑和平板都可以互相通信!

2 IP地址 VS MAC地址

我们讲个故事来理解这两个地址:

最近黑神话悟空非常热门,我们就以西游记进行举例:
唐僧师徒四人从东土大唐长安城出发,前往西天灵山取经。中间会经过若干城池:车迟国,女儿国,火焰山…

  1. 此时唐僧有两份地址 :长安到灵山 , 长安到车迟国。到达车迟国时,唐僧告诉国王:“我从东土大唐而来 ,前往女儿国,请问接下来应该前往何处?”
    国王根据唐僧四人的目的地告诉:下一站是女儿国。这时唐僧的两份地址为: 长安到灵山 , 车迟国到女儿国!
  2. 到达女儿国,唐僧告诉国王:“我从东土大唐而来 ,前往西天灵山取经,请问接下来应该前往何处?”
    女儿国国王告诉唐僧下一站是火焰山。这时唐僧的两份地址为:长安到灵山 , 女儿国到火焰山
  3. 最终到达火焰山。

这里反复出现的“我从东土大唐而来 ,前往西天灵山取经”就是IP地址
而每一次的起始站是MAC地址,每个国相当于路由器,通过唐僧的目标,选择最合适的下一站
在这里插入图片描述

所以:

  1. IP地址是最终目标
  2. MAC地址是下一个目标,受IP地址影响!

将西游记的落实到实际中就是这样的一张图!!!
在这里插入图片描述

3 网络socket

3.1 理解源 IP 地址和目的 IP 地址

MAC地址只能在局域网内保证唯一性,因为MAC地址不会超出局域网。IP地址才是用来保证网络中的主机的唯一性!

数据传输的目的不是仅仅是到达主机,而是让用户来进行使用使用数据!也就是要在进程中来使用数据!
我们看B站,从服务器主机传输来的视频数据,最终是要在我们手机上的B站进程中进行播放的!

数据传输到主机不是目的, 而是手段。 到达主机内部, 在交给主机内的进程,才是目的!

但是,数据包通过IP地址找到对应主机,之后是如何从大量进程中找到目标进程呢?通过端口号(PORT),IP地址中的端口号开放给进程使用,用来标识目标进程!

也就是数据包解包到应用层时通过端口号找到对应进程!

这里具有疑问了?为什么不直接使用进程的pid,这不也是唯一的吗?
因为如果使用pid进行网络标识,那么网络与系统就产生了强耦合!如果系统层出现问题导致PID变化,就会导致网络层也出现问题!这可不行,我们要做的是弱耦合!所以单独使用端口号来进行标识!

所以:socket = IP + PORT == 网络中唯一的进程

这样也就得到了网络通信的本质:不同主机的进程间通信!!!这两个进程看到的公共资源就是网络!!!这种通信就叫socket通信!

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

端口号分为两部分,一部分是系统内部只有,其余的才允许用户使用!

  1. 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的
  2. 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号.就是在描述 “数据是谁发的, 要发给谁”;

3.2 传输层的典型代表

用户是在应用层进行操控,用户想要进行通信就需要使用传输层。传输层之下的层,用户不需要考虑,操作系统会帮我们完成!我们只需要理解使用传输层的系统调用即可!

传输层有UDP协议和TCP协议:

  1. UDP协议具有无连接,不可靠传输,面向数据报的特点!
  2. TCP协议具有有连接,可靠传输,面向字节流的特点!

注意可靠听起来比不可靠更好,但是可靠的协议底层实现就肯定更加复杂!所以可不可靠不是优缺点,而是一种特性!以后我们再来进行详细讲解!

3.3 网络字节序

在学习C语言时,了解过两种机器:大端机和小端机,这两种的储存方式是不一样的:
在这里插入图片描述

  • 大端机的低地址储存数据的高位
  • 小端机的低地址储存数据的低位

如果两台主机不是一样的!那么主机如何读取另一个数据发送过来的数据包呢?因为根本无法判断对方是大端机还是小端机,那么就不可能正常的读取数据!

所以:TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.

  1. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  2. 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;

因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.这样按照大端字节序更加顺畅!传输数据时,如果是小端机就通过系统调用将数据转换成大端,否则就忽略,直接发送就可以!

3.4 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 API 可以都用 struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_insockaddr_un; 这样的好处是程序的通用性!

之后我们就来学习UDP套接字编程!开始网络编程的第一步!

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

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

相关文章

高压直流接触器及使用注意事项

高压直流接触器及使用注意事项 1.概述2.接触器和继电器有什么区别3.节能线圈4.安装位置5.直流继电器线圈抑制6.高压继电器和接触器有哪些应用?7.线圈效率的决定因素是什么?对线圈驱动器有什么要求?8.负载极性对接触器的影响9.触点参数注意事项10.线圈供电要求1.概述 航空接…

基于单片机实现的的多点分布室内环境监测系统

基于STM32单片机为基础设计的一款室内环境监测系统程序源码 程序分为接收端和采集端两部分 接收端与采集端均以STM32单片机作为控制核心,两者通过ZigBee无线通信技术进行连接。接收端主要用于接收数据并将其实时显示以及报警。 采集端主要用于监测室内环境的各类数…

【Python工具】Python 装饰器实现统计函数执行时长

文章目录 1、背景2、轮子 1、背景 业务基本代码堆积完毕了,部分流程需要调优,想着在几个关键执行路径上进行时间记录,类似 SQL 慢日志一样的方法,方便进行性能问题发现。 了解了下,应该是采用装饰器实现是代码侵入最…

林草湿地址、导出echart为word

2.导出 // 导出exportDoc () {this.loading truelet arrRefs [this.$refs.endChart, this.$refs.processChart, this.$refs.officeEndChart]setTimeout(() > {Promise.all(arrRefs.map((canvasDom) > {return this.html2canvasHandle(canvasDom)})).then(res > {let…

如何让潜意识帮你实现你的目标

潜意识的力量是意识的3万倍以上 如果你有一个宏大的目标,怎么借助潜意识实现你的目标呢 比如,我的目标是:帮助100万人颠覆潜意识,实现人生蜕变,并且培养一万名潜意识开发导师 这么宏大的一个目标,怎么让…

B-树底层原理

一、B-树介绍 定义: B-树(B-Tree)是一种自平衡的树形数据结构,广泛应用于数据库和操作系统中。它的设计目标是减少搜索、顺序访问、插入和删除操作中比较次数和移动次数,特别适合于磁盘中数据的存储和检索。 性质&a…

运维团队日志管理策略参考

在运维工作中,日志管理是一项至关重要的任务。有效的日志管理不仅能够帮助运维团队实时监控系统状态、发现潜在问题,还能为故障排查和系统性能优化提供宝贵的数据支持。本文结合运维行业的实际需求,介绍了一套全面的日志管理策略,…

AutoDroid: LLM-powered Task Automation inAndroid论文学习

光看题目怎么和上一篇差不多?又是纯用LLM的? 当然还是有一点不一样的: 这里的最大特点是加上了UI领域知识,可以大幅增强LLM在处理UI方面的知识的能力。根据文章的说法,使用了这招他们的LLM可以吊打GPT4V,准…

node.js 完全卸载和下载配置

一、介绍 (1)node.js Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于ChromeV8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, [1]让JavaScript 运行在服务端的开发平台&#xff0c…

Linux开发工具的使用

文章目录 vim的使用基本模式介绍光标当前行操作光标快速定位(命令行模式):插入模式的三种方式(命令行模式):vim基本操作(命令行模式)底行模式的操作 Linux编译器 - gcc/g的使用Linux…

录屏软件免费版:四款热门工具全面解析!

日常生活或工作中,我们经常有记录屏幕的需求。今天,就让我们来探索几款市面上广受欢迎的免费录屏软件,它们不仅功能强大,而且完全免费,让屏幕录制体验更加流畅和高效。 福昕录屏大师 直达链接:www.foxits…

比亚迪海豹06这油耗,丈母娘都叫好

文 | AUTO芯球 作者 | 雷慢 刚一朋友问我 有没有什么好看、价格低, 车大、油耗还低的车, 开到女盆友家能第一个动筷子。 哎,我要给你说的这车, 能不能第一个动筷子 首先看你未来的丈母娘喜欢什么货色的, 其次你…

仿最近老火的羊了个羊 三消游戏源码,两种玩法模式,完整带后台

游戏玩儿法类似于养了个羊,有两种模式,一个是普通版。一个是王者荣耀版。 代码免费下载:百度网盘

广播与组播,超时检测

目录 一.超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函数结合 二.广播与组播(broadcast & multicast) 1. 广播(udp) 理论&#xff1a…

redis底层—网络模型

1.用户空间和内核空间 2.阻塞IO 3.非阻塞IO 4.IO多路复用 select模式的三个问题: 能监听的FD最大不超过1024 每次select都需要把所有要监听的FD都拷贝到内核空间 每次都要遍历所有FD来判断就绪状态 poll模式的问题: poll利用链表解决了select中监听FD上限…

信号保存和处理

把上一篇回顾一下吧:共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存的数据结构: struct shmid_ds {…

3D技术在电商行业的应用有哪些?

‌3D技术在电商行业的应用广泛且多样化,主要涵盖以下几个方面‌: ‌1、商品展示‌: 通过3D模型进行全方位的展示,支持720旋转和任意缩放,使消费者能够更直观地了解产品的外观、结构和特点。这种展示方式不仅提高了消…

前端网络请求库:Axios

目录 1. 网络请求的基本概念 1.1 网络请求的基础HTTP协议 1.2 HTTP工作原理 1.3 TCP连接 1.31 建立TCP连接 1.31 关闭TCP连接 1.4 HTTP的请求方法 1.5 HTTP的响应状态码分类 1.6. 前端网络请求方式 2. Axios在在vue项目中的使用 2.1安装与使用 2.2 Axios使用HTTP请求…

碰撞检测 | 详解圆-矩形碰撞检测与N圆覆盖模型(附ROS C++可视化)

目录 0 专栏介绍1 N N N圆覆盖碰撞模型2 圆与矩形的碰撞检测3 算法仿真与可视化3.1 核心算法3.2 仿真实验 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰…

HCIP--<OSPF2>

目录 一,OSPF的不规则区域 1)远离骨干区域的非骨干区域 2)不连续骨干区域(和上面一样) 二,OSPF数据库表 三。优化OSPF的LSA(缺少LSA的更新量) [1]手工汇总:减少骨干区域的LSA [2]特殊区域&…