Linux网络编程——网络套接字初识

文章目录

    • 1. IP地址
    • 2. 端口号
    • 3. 初识TCP协议 && UDP协议
    • 4. 网络字节序
    • 5. socket创建API

1. IP地址

举个例子:

《西游记》中,唐僧要去取件,总是说从“东土大唐”来,前往“西天”拜佛求经,从哪里来,到哪里去,这一直都是不变的。

这里的“东土大唐”就是源IP地址,“西天”就是目的IP地址

在路上,一直发生变化的是上一站从哪来和下一站到哪去,比如说上一站在“女儿国”,下一站要去“火焰山”,这里的依据就是最终要去哪里

这里一直发生变化就叫做**mac地址**

image-20240129203746794

IP地址存在的意义就是,它能够指导我们进行路径规划。现在主流IP地址是IPv4,它是4字节32比特位的整数,例如192.168.1.1它能标定特定主机的唯一性。

当2台主机不在同一个子网的时候,那就需要把数据交给先给路由器,让路由器进行重新“路线规划”。

image-20240129205712687

“重新路线规划”之后再交给下层,即上图的令牌环驱动程序(这里只是一个例子),加上了令牌环的报头,可是这对于上层来说,它们收到报文的时候,这个报头已经去掉了。

所以有了IP协议(工作在IP层的路由器)的存在,底层的差异被屏蔽了,一切皆是IP报文

IP地址 Vs Mac地址:

IP地址(尤其是目的IP),一般都不是不会改变的;

Mac地址,出局域网之后,源和目的都会被丢弃,让路由器重新选择

image-20240129212235812

2. 端口号

  1. 网络协议栈中下三层,主要解决的是数据安全可靠传输到远端机器上(主机 -> 主机)

  2. 用户使用应用层软件完成数据的发送和接收

用户要使用这个软件,就得先把这个软件启动起来,这本质上就是进程,也就是进程A向进程B发起数据请求,这是进程通信,只不过它们使用了网络协议栈。

我们在传输层收到信息,它要向上交付给应用层,比如说应用层有很多软件:微信、QQ、淘宝什么的,应用层和传输层就需要协商一种方案,也就是端口号,传输层报文里面携带这个端口号,就能知道将数据交付给哪个应用。

端口号无论是对于客户端还是服务端,都能唯一标识该主机上的一个网络应用层的进程

在公网上,IP能标识唯一一台主机,而端口号能标识该主机的唯一进程,所以IP+Port能标识全网唯一一个进程

这种IP+Port的通信方式,我们叫做socket

在主机里面,进程pid能标识进程的唯一性,那为什么还要有port呢?

站在技术层面,用pid来标识网络应用的唯一性,是可以实现的;但是pid是系统层面的,如果系统层面改了,那网络层面也需要作出改变,所以给网络单独设计一套规则,这也就能进行解耦。

2台主机进行通信,是要绑定端口号的

image-20240129225058332

传输层内部,操作系统会实现一个哈希表,里面存的是task_struct*,当我们绑定端口号的时候,如果发现这个端口号没有在哈希表中,则可以绑定,将这个进程pcb的地址放进去;如果哈希表中有了,则表明这个端口号已被占用,需要换一个。

3. 初识TCP协议 && UDP协议

tcp(Transmission Control Protocol)udp(User Datagram Protocol)协议都是传输层的协议的,而传输层是离用户最近的,所以一般以通信为目的的代码都是传输层提供的接口,传输层提供的协议就是tcpudp

tcp叫传输控制协议:

  • 面向字节流
  • 可靠传输
  • 有连接

在数据传输之前要保证通信信道的通畅

udp叫用户数据报协议:

  • 无连接
  • 不可靠传输
  • 面向数据报

这里的可靠和不可靠,并不是褒义贬义词,而是一个描述特征词汇

4. 网络字节序

内存多字节数据对于内存都有高低地址之分,如何存储就有了不同意见,即大端存储还是小端存储,这也说不上哪种更好。所以对于网络,就要考虑这个问题,如果大端机向小端机发送数据,那么小端在数据解析的时候,就会发送解析错误。

对于数据的存储,有兴趣可以查看此篇文章:数据的存储

计算机出现的比网络早,计算机对于大小端的争论没得出结果,网络为了不影响自己,于是直接规定网络当中的数据全部为大端,所以对于小端机,发送数据前,要先将小端转大端。

为了网络程序的可移植性,下面库函数做网络字节序和主机字节序的转换

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
  • h标识hostn表示networkl表示32为长整数,s表示16位短整数
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回

5. 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);

套接字编程种类:

  1. 域间套接字编程

    同一个机器内(本地通信)

  2. 原始套接字编程

    绕过传输层,使用底层的接口,一般用来编写一些网络工具

  3. 网络套接字编程

    使用传输层,进行用户间的网络通信

理论上不同种类的套接字,是需要三套接口的,可是设计者直接设置成了一套(统一抽象化),要保证接口统一,参数类型必须是统一的,即struct sockaddr*

image-20240129233656858

每个接口的前2个字节是可以进行判断的

if(address->type == AF_INET)
{
    //网络
}
else if(address->type == AF_UNIX)
{
    //本地
}

这其实就是多态的体现,只是之前C语言并没这个东西,所以我们用的时候强转即可

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js数组/对象的深拷贝与浅拷贝

文章目录 一、js中的深拷贝和浅拷贝二、浅拷贝1、Object.assign()2、利用es6扩展运算符&#xff08;...&#xff09; 二、深拷贝1、JSON 序列化和反序列化2、js原生代码实现3、使用第三方库lodash等 四、总结 一、js中的深拷贝和浅拷贝 在JS中&#xff0c;深拷贝和浅拷贝是针对…

网络和Linux网络_15(IO多路转接)reactor编程_服务器+相关笔试题

目录 1. reactor的服务器 1.1 Sock.hpp 1.2 加协议分割报文 1.3 序列化和反序列化 Protocol.hpp main.cc Epoll.hpp TcpServer.hpp 2. 相关笔试题 答案及解析 本篇完。 1. reactor的服务器 Log.hpp和以前一样&#xff0c;因为下面要写ET模式所以Sock.hpp加了一个把…

【架构论文】SCALE: Secure and Scalable Cache Partitioning(2023 HOST)

SCALE: Secure and Scalable Cache Partitioning 摘要 LLC可以提高性能&#xff0c;但是会引入安全漏洞&#xff0c;缓存分配的可预测变化可以充当侧信道&#xff0c;提出了一种安全的缓存分配策略&#xff0c;保护缓存免受基于时间的侧信道攻击。SCALE使用随机性实现动态可扩…

【ArcGIS微课1000例】0098:查询河流流经过的格网

本实验讲述,ArcGIS中查询河流流经过的格网,如黄河流经过的格网、县城、乡镇、省份等。 文章目录 一、加载数据二、空间查询三、结果导出四、注意事项一、加载数据 加载实验配套数据0098.rar中的河流(黄河)和格网数据,如下图所示: 接下来,将查询河流流经过的格网有哪些并…

乔拓云教育系统:打造培训机构全面数字化转型新篇章

在当今数字化、信息化高速发展的时代&#xff0c;教育培训机构也需要与时俱进&#xff0c;借助先进的管理工具提升运营效率&#xff0c;优化学员学习体验。乔拓云教育系统正是这样一个全面、高效、一站式的解决方案&#xff0c;为教育培训机构提供强大的技术支持和全方位的服务…

微信扫码登录流程

微信官方文档使用 搜索“微信开放平台”点击导航栏的“资源中心”点击“网站应用”下的“微信登录功能”地址微信扫码登录是基于OAuth2的&#xff0c;所以需要第三方应用&#xff08;就是实现微信扫码登录的应用&#xff09;成为微信的客户端&#xff0c;获取AppId和AppSecret…

聊聊java中的Eureka和Nacos

本文主要来自于黑马课程中 1.提供者与消费者 在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0…

第九节HarmonyOS 常用基础组件20-Divider

1、描述 提供分割器组件&#xff0c;分割不同内容块或内容元素。 2、接口 Divider() 3、属性 名称 参数类型 描述 vertical boolean 使用水平分割线还是垂直分割线。 false&#xff1a;水平分割线 true&#xff1a;垂直分割线 color ResourceColor 分割线颜色 默认…

c++的发展史、缺省参数、命名空间你了解吗?

1.c的发展历史概述 1.1.什么是c C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机…

Java 面向对象进阶 01(黑马)

static案例代码&#xff1a; 代码&#xff1a; public class Student {private String gender;private String name;private int age;public static String teacherName ;public Student() {}public Student(String gender, String name, int age) {this.gender gender;this.…

图书管理系统(ArrayList和LinkedList)--versions3.0

目录 一、项目要求&#xff1a; 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0&#xff1a; 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次&#xff0c;点赞29次&#xff0c;收藏17次。本文使用…

Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal

经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本、Jest、Webpack 等等&#xff0c;而偶尔看到的调试相关的文章又全都是在写 inspect、launch.json 这些方案&#xff0c;其实有一定学习成本。 而其实在 VSCode 中早已内置了相当无脑的 Debug 方式&#xff0c;就…

Mac苹果电脑玩幻兽帕鲁 Crossover玩Windows游戏

​​ 《幻兽帕鲁》&#xff08;英文&#xff1a;Palworld&#xff09;是一款近期在 Steam 爆红的动作冒险生存游戏&#xff0c;游戏设置在一个居住着「帕鲁」的开放世界中&#xff0c;玩家可以战斗并捕捉帕鲁&#xff0c;也能用它们来建造基地、骑乘和战斗。 不过目前《幻兽帕…

玻璃封装高温烧结航空插头插座连接器

概述 随着风电行业深入发展&#xff0c;风力发电机组使用的传感器主要有:位置传感器、加速度传感器、压力传感器、温度传感器、液位传感器、电压电流互感器、压点薄膜传感器等。对电子元器件的性能提出了更进一步的要求。连接器作为连接各个电子元器件的血脉&#xff0c;在保持…

《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)

文章目录 10.1 网页性能优化10.1.1 基础知识10.1.2 案例 1&#xff1a;优化网页图像10.1.3 案例 2&#xff1a;使用延迟加载优化性能10.1.4 案例 3&#xff1a;优化 CSS 和 JavaScript 的加载 10.2 SEO 最佳实践10.2.1 基础知识10.2.2 案例 1&#xff1a;创建一个 SEO 友好的博…

B3626 跳跃机器人——洛谷(疑问)

题目描述 地上有一排格子&#xff0c;共 &#xfffd;n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 &#xfffd;n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这个机器人的行动遵循下面的规则&#…

Python开发常用的库汇总,附官网链接

文章目录 前言环境管理包管理包仓库分发构建工具交互式解析器文件日期和时间文本处理特殊文本格式处理自然语言处理文档配置命令行工具下载器图像处理OCR音频Video地理位置HTTP数据库数据库驱动ORMWeb 框架权限CMS电子商务RESTful API验证模板引擎队列搜索动态消息资源管理缓存…

12306提示人证核验失败问题解决方案

问题环境&#xff1a;手机已经 Root 并且安装了其他软件 认证时提示 官方客服回复: 可能是我的人脸发生了太大变化导致&#xff0c;建议我去身份证的公安部门更新人脸信息&#xff0c;但是想一想又不对&#xff0c;如果发生了大变化所有 App 使用的都是统一的公安部的人脸信息…

VitePress-06-文档中容器块的使用

说明 所谓的【容器块】就是在文档中标记出来的一块区域&#xff0c;在页面渲染的时候有自己的块样式。 主要就是通过背景颜色来与别的内容区分开来。 简单理解 &#xff1a;【容器块】就是一个 带有背景颜色的div。 容器块的定义 容器块由三部分组成 &#xff1a;类型,标题,内容…

指针进阶2

紧接着我们上一讲&#xff0c;指针进阶1&#xff0c;让我们趁热打铁&#xff0c;学习一下指针进阶2~ 一&#xff0c;函数指针数组 由第一讲我们可以知道&#xff1a;&#xff08;由于我们知道数组是存放一种类型的多个元素&#xff0c;若两个函数指针相同的话&#xff0c;那我…
最新文章