【网络】socket套接字

news2025/1/11 14:51:54

1.理解IP

每台主机都有自己的IP地址,所以当数据从一台主机传输到另一台主机就需要IP地址。报头中就会包含源IP和目的IP。源IP地址:发送数据报那个主机的IP地址,目的IP地址:想发送到的那个主机的IP地址我们把数据从一台主机传递到另一台主机不是真正目的,真正通信的不是这两个机器,通信的主体是两个主机上的进程。但是一个主机上有很多的进程,公网IP虽然标识了一台唯一的主机,那么数据就可以由一台主机传递到另一台主机,但是两个主机上的进程有很多,怎么保证主机A上的进程a和主机B上的进程b通信呢?也就是说用什么来标识主机上客户或者服务进程的唯一性是关键的,为了更好的表示一台主机上服务进程的唯一性,用端口号port标识服务进程、客户端进程的唯一性。

2.端口号

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

网络通信的本质就是进程间通信,进程间通信的本质是看到同一份资源,现在这个资源就是网络,通信的本质就是IO,因为我们上网的行为就两种情况:接收数据和发送数据

IP标定主机唯一性,port 标定进程唯一性 ----> IP+port   ==   进程在全网的唯一性

思考:进程在主机上可以用pid标识唯一性,那网络通信为什么不用IP+pid锁定要通信的进程呢?

原因:

pid是系统规定的,而port是网络规定的,这样就可以把系统和网络解耦
port标识服务器的唯一性不能做任何改变,要让客户端能找到服务器而每次启动进程pid就会改变。
不是所有的进程都需要网络通信即不是所有的进程都拥有端口号,但每个进程都需要pid。
 

3.认识 tcp / udp 协议

TCP(Transmission Control Protocol 传输控制协议) 特点:

传输层协议
有连接(正式通信前要先建立连接)
可靠传输(在内部帮我们做可靠传输工作)
面向字节流

UDP(User Datagram Protocol 用户数据报协议) 特点:
传输层协议
无连接
不可靠传输
面向数据报

理解不可靠传输:如发送数据时出现了丢包的情况、或者数据被重复传递了或者网络出现了问题等等造成的后果就叫做不可靠。所以传输层就是用来解决可靠性的一个协议。可不可靠是一个中性词。可靠是需要成本的,往往在维护和编码上都比较复杂;而不可靠没有成本,使用起来也简单。所以要分场景使用。

4.网络字节流

我们已经知道 , 内存中的多字节数据相对于内存地址有大端和小端之分。
大端存储: 低权值的数放入低地址。
小端存储: 低权值的数放入高地址。
这样就有可能一个大端机用大端的方式发送数据到一个小端机。如果现在跨网络我们也不知道数据到底是大端和小端,会导致接收到的数据被解析为了别的意思,所以规定: 网络中的数据都是大端发送数据的主机如果是大端机就不用管如果是小端机就把发送的数据由小端转为大端再发送,接收数据同理。

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

也就是说先发出的数据是低地址,后发出的数据是高地址

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可。

调用库函数做网络字节序和主机字节序的转换:
#include <arpa/inet.h>

// 主机序列转网络序列
uint16_t htons(uint16_t hostshort);
uint32_t htonl(uint32_t hostlong);

// 网络序列转主机序列
uint16_t ntohs(uint16_t netshort);
uint32_t ntohl(uint32_t netlong);
h表示host,n表示network,l表示32位长整数,s表示16位短整数。主机是大端还是小端在函数内部会自己进行判断。

5.socket套接字接口

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

ip和端口号port就叫为套接字,socket就是插座的意思,未来进行网络通信时,插头和插座配套使用。

常见套接字的种类1.网络套接字2.原始套接字3.unix域间套接字

网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信。而原始套接字可以跨过传输层(TCP/IP协议)访问底层的数据。这些套接字应用场景完全不同,所以我们想用就得用三套不同的接口。而为了方便,设计者只设计了一套接口,就可以通过不同的参数,解决所有网络或者其他场景下的通信问题。

struct sockaddr_in {
    short int sin_family;           // 地址族,一般为AF_INET
    unsigned short int sin_port;    // 端口号,网络字节序
    struct in_addr sin_addr;        // IP地址
    unsigned char sin_zero[8];      // 用于填充,使sizeof(sockaddr_in)等于16
};

struct sockaddr_un {
    sa_family_t sun_family;       /* AF_UNIX */
    char sun_path[108];    /* 带有路径的文件名 */
};//通过同一个文件的路径来让进程看到同一份资源

 

可以看到sockaddr_in和sockaddr_un是两个不同的通信场景。区分它们就用前2个字节:16地址类型协议家族的标识符(代表是本地通信还是网络通信)。 我们两个结构体都不用用的是sockaddr。未来进行网络编程时,如果是网络通信,填充的网络信息是struct sockaddr_in这个结构体。所以这就相当于:可以把 sockaddr看成基类,把 sockaddr_insockaddr_un看成派生类,构成了多态体系。 sockaddr使用统一的接口解决所有网络或者其他场景下的通信问题。

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

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

相关文章

C语言-const关键字

1.const 关键字 const 是 constant 的缩写&#xff0c;const 在实际编程中用得比较多&#xff0c;意思是“恒定不变的”&#xff0c;它是定义只读变量的关键字&#xff0c;或者说 const 是定义常变量的关键字。 (可读&#xff0c;不可写) const 可以修饰变量&#xff0c;数组&a…

光明区马田大围城市更新旧改项目--华润集团

【华润光明马田大围旧改一期项目基础信息】 项目开发商&#xff1a;华润集团 占 地 面 积&#xff1a;约110151㎡ 建 筑 面 积&#xff1a;待专规图 物 业 类 型&#xff1a;华润一期范围内的待拆迁物业 项 目 进 度&#xff1a;直接确权阶段&#xff0c;即将立项 【项目现…

c++ new 源码学习一下

之前有一篇文章介绍了 new 的一些用法 c new 在指定内存上创建对象&#xff0c;今天结合源码来学习一下 new 更详细的用法。相关的源码&#xff1a;gcc git 1&#xff0c;void* operator new (std::size_t size); 我们可以在头文件<new>里看到它的原型&#xff1a; _G…

J2EE 技术的企业人事管理系统的设计与实现(论文+源码)_kaic

目 录 一、引 言 二、相关技术概述 (一) 基于 MVC 设计模式的 J2EE 技术 (二) MySql 数据库管理系统 (三) 基于 B/S 结构的系统安全 三、企业人事管理系统总体设计 (一) 系统需求分析 1.功能结构分解 2.员工档案管理模块 3.员工工资管理模块 (二) 系统总体结构设计 四、企业人…

2023-06-03 陕西省技能大赛 crypto 复现

文章目录 奇怪的sar题目描述&#xff1a;题目分析&#xff1a; Ham3题目描述&#xff1a;题目分析&#xff1a; BigDataEnc题目描述&#xff1a;题目分析&#xff1a; 奇怪的sar 题目描述&#xff1a; from Crypto.Util.number import *key flag{**********}bits 1024 msg …

ESP32+U8G2库显示中文

这里写自定义目录标题 在使用esp32u8g2oled进行中文先显示例程 废话不说&#xff0c;直接上代码 #include <Arduino.h> #include <U8g2lib.h> //软件SPI U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock/ 14, / data/ 13, / cs/ 15, / dc/ 7, / r…

【AI绘图】三、stable diffussion操作界面介绍以及如何使用

上一篇&#xff1a;【AI绘图】二、stable diffusion环境准备与安装 stable diffusion操作界面介绍 操作界面总共分为5大块 1.模型选择区&#xff1b;点击跳转 2.功能区域&#xff1b;点击跳转 3.提示词输入&#xff1b;点击跳转 4.参数设置区&#xff1b;点击跳转 5.出图区点击…

计算机基础--->操作系统(1)

文章目录 简单说说操作系统操作系统的主要功能用户态和内核态为什么要有用户态和内核态&#xff1f;只有一个内核态不行吗&#xff1f;用户态和内核态是如何切换的系统调用系统调用过程 简单说说操作系统 操作系统是一种系统软件&#xff0c;它管理计算机硬件资源和提供服务给应…

Jenkins+Docker+SpringCloud微服务持续集成之集群部署

一、集群部署流程说明 环境配置 #环境配置 hostnamectl set-hostname web2-server && su systemctl stop firewalld systemctl disable firewalldvim /etc/selinux/config SELINUXdisabledvim /etc/resolv.conf nameserver 114.114.114.114#安装依赖包 yum install -y…

如何通过python写接口自动化脚本对一个需要调用第三方支付的报名流程进行测试?

对于需要调用第三方支付的报名流程进行接口自动化测试&#xff0c;可以通过以下步骤来编写Python代码&#xff1a; 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站百万播放全网第一的自动化测试教程&#xff0c;同时在线人数到达1…

微信小程序开发实战 ②③(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

Nginx:Nginx网站服务(一)

Nginx&#xff1a;Nginx网站服务 一、编译安装Nginx服务1.1 关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下1.2 安装依赖包1.3 创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身份运行&#xff0c;建议为其创建专门的用户账号&#xff0c;以便更准确地…

【全面突击数据结构与算法001】绪论篇,数据结构的基本概念

&#x1f341;前言 &#x1f451;作者主页&#xff1a;&#x1f449;CSDN丨博客园 &#x1f3c6;学习交流&#xff1a;&#x1f449;在下周周ovoの社区 &#x1f48e;全面突击数据结构与算法系列专栏&#xff1a;&#x1f449;数据结构与算法专栏 PS&#xff1a;本篇文章主要综…

【架构基础】简单设计原则

简单设计来源于极限编程&#xff08;ExtremeProgramming&#xff0c;简称XP&#xff09;。XP是由KentBeck在1996年提出的&#xff0c;是一种软件工程方法学&#xff0c;是敏捷软件开发中最富有成效的几种方法学之一。XP存在四个核心实践&#xff1a;TDD&#xff08;Test-Driven…

Lecture 6 Sequence Tagging: Hidden Markov Models

目录 Problems with POS Tagging 词性标注的问题Probabilistic Model of HMM HMM的概率模型Two Assumptions of HMM HMM的两个假设Training HMM 训练HMMMaking Predictions using HMM (Decoding) 使用HMM进行预测&#xff08;解码&#xff09;Viterbi AlgorithmHMMs in Practic…

地震勘探基础(五)之地震资料数字处理

地震资料数字处理 地震勘探主要包括地震资料野外采集&#xff0c;地震资料数字处理和地震资料地质解释三大部分。其中地震资料数字处理需要利用高性能的超级计算机和先进的处理软件系统。地震资料的质量和成像精度直接决定了油、气勘探的成功率。 地震资料数字处理的主要目的…

快速解读GC日志

本文介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。我们通过 -XX:UseSerialGC 选项,指定JVM使用串行垃圾收集器, 并使用下面的启动参数让 JVM 打印出详细的GC日志: -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintGCTimeStamps 这样配置以后&#xff…

postgreSQL/kingbase limit分页查询,结果乱序

postgres/kingbase limit分页查询&#xff0c;结果乱序 现象排查总结解决办法1.session中关闭synchronize_seqscans2.查询时带上order by 现象 我使用kingbase8&#xff0c;使用select * from xx limit 0,1000 每次查出来的结果都不一样。 排查 1.由于kingbase的文档较少&am…

Zinx框架学习 - 读写协程分离

Zinx - V0.7 读写协程分离 之前connection使用StartReader对客户端的数据接下来我们就要对Zinx做⼀个⼩⼩的改变&#xff0c;就是与客户端进修数据交互的Gouroutine由⼀个变成两个&#xff0c;⼀个专⻔负责从客户端读取数据&#xff0c;⼀个专⻔负责向客户端写数据。这么设计有…

Vue3 | Element Plus resetFields不生效

Vue3 | Element Plus resetFields不生效 1. 简介 先打开创建对话框没有问题&#xff0c;但只要先打开编辑对话框&#xff0c;后续在打开对话框就会有默认值&#xff0c;还无法使用resetFields()重置。 下面是用来复现问题的示例代码和示例GIF。 <script setup> import…