【网络协议】聊聊套接字socket
网络编程我们知道是通过socket进行编程的,其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的,所以在设置参数的时候,其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM,而UDP是基于数据报的,设置为SOCK_DGRAM
基于 TCP 协议的 Socket 程序函数调用过程
整体流程其实就是显示服务端进行bind ip+端口 可以进一步确定机器和将数据发送给那个应用程序,然后就开始监听状态。
在内核中,为每个 Socket 维护两个队列。一个是已经建立了连接的队列,这时候连接三次握手已经完毕,处于 established 状态;一个是还没有完全建立连接的队列,这个时候三次握手还没完成,处于 syn_rcvd 的状态。
服务端拿出一个已经完成的连接进行处理,客户端通过connect函数创建连接,指明要连接的目标IP+port。内核会给客户端分配一个临时的端口。
监听的 Socket 和真正用来传数据的 Socket 是两个,一个叫作监听 Socket,一个叫作已连接 Socket。
连接建立完成,就通过一写一读的模式进行处理数据。
Socket 在 Linux 中就是以文件的形式存在的。除此之外,还存在文件描述符。写入和读出,也是通过文件描述符。

基于 UDP 协议的 Socket 程序函数调用过程
UDP因为不需要进行连接,所以只需要端口和IP使用senddtp就可以发送数据,recvfrom接收数据。

服务器如何接更多的项目?
因为上面的方式其实就是一个客户端对应一个服务端的模式,但是对于高性能、高并发系统来说,其实都是需要一个服务端进行同时处理上千上万的客户端请求处理,所以这种方式不可以,那么服务端最大TCP连接数其实是受到文件描述符限制 也就是ulimit 文件描述符的数目,另一个就是内存,每个TCP连接都要占用一定的内存,硬件资源也是有限制的。
多进程方式
一种方式就是有一个专门处理连接+转发任务的进程,但是当有新的客户端请求进来的时候,这个主进程会fork新的进程进行处理客户端的请求,因为是通过frok的形式,所以会复制文件描述符的列表,也会复制内存空间。所以子进程也可以访问内核态统一打开文件列表的文件,当子进程处理完毕之后,就可以通过函数的返回值进行判断。如果是整数就是父进程,如果是0就是子进程。

多线程方式
线程相比进程暂用的资源更少,但是对于C10K问题来说,其实还有有点捉襟见肘。
IO 多路复用
select模式
由于socket是文件描述符,所以可以通过一个线程进行所有的文件描述符,将所有的文件描述符放在一起,fd_set中,会实时监听,那些文件描述符有变化,当发生变化的时候就将fd_set设置为1,表示socket可读或者可写,然后继续调用select进行监听下一轮的变化。
epollo
因为监听这种方式需要遍历所有的文件描述符,并且有最大数据限制。
所以最好的方式是那个文件描述符有变化,进行主动通知的方式,在内核的实现方式不是通过轮训的方式,而是通过注册callback函数的方式,当某个文件描述符发送变化的时候,主动通知。

比如创建了m n x三个socket。那么会先创建一个epoll对象,也就是一个文件描述符,对应结构其实就是一个红黑树,保存所有这个监听所有的socket。当添加一个socket的时候,其实就是加入这个红黑树,红黑树的节点指向这个结构,将这个结构挂在被监听的socket事件列表中,当一个socket来了一个事件的时候,就可以从列表中获取epoll对象,并调用call back进行回调。
epoll 被称为解决 C10K 问题的利器
小结
本篇主要介绍了UDP和TCP网络编程流程细节,以及支撑大量连接的高并发的服务端不容易,多进程、多线程、IO多路复用等。
推荐阅读:https://blog.csdn.net/jia970426/article/details/130611163?spm=1001.2014.3001.5501
[https://blog.csdn.net/jia970426/article/details/132947333?spm=1001.2014.3001.5501]
相关文章:
【网络协议】聊聊套接字socket
网络编程我们知道是通过socket进行编程的,其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的,所以在设置参数的时候,其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM,而UDP是…...
GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】
GEO生信数据挖掘(十)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本) 通过 前面十篇文章的学习,我们应该已经可以获取到一个”心仪的基因列表“了,相较于原始基因数量,这个列表的数…...
api接口更新钉钉文档
class OperateKnowledgeBaseExcel():robot_code # agent_id #app_key #群机器人app_secret #群机器人def __init__(self,union_id, workbook_id, worksheet_id):self.union_id union_idself.workbook_id workbook_id # 获取方式:... &g…...
Android---如何同view进行渲染
ViewRootImpl 在 Activity、window 和 View 三者关系之间起着承上启下的作用。一方面,ViewRootImpl 中通过 Binder 通信机制,远程调用 WindowSession 将 View 添加到 Window 中;另一方面,ViewRootImpl 在添加 View 之前࿰…...
【LeetCode:26. 删除有序数组中的重复项 | 双指针】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
如何判断一个对象是不是一个空对象?
在JavaScript中,可以使用以下方法来判断一个对象是否为空对象: 1:使用Object.keys()方法:Object.keys()方法返回一个包含对象自身可枚举属性的数组。通过判断该数组的长度,可以确定对象是否为空对象。 function isEm…...
C/C++ “variable set but not used“的 警告问题解决方案
在编程的过程中,会有一些预留的变量暂时不用,但是编译过程编译器警告 会报错无法编译通过针对这个问题,采用下面的解决方案比较方便。 错误如下形式: 三种解决方法: 1.可以在变量前加上(void)就…...
JAVA安全入门之反射
反射 对于反射这个概念来说,直白的讲就是: 对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可以调⽤而众所周知 JAVA 是一门静态语言,我们通过反射就可以达到动…...
【c++|opencv】一、基础操作---2.图像信息获取
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取,roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …...
HarmonyOS开发:探索组件化模式开发
前言 组件化一直是移动端比较流行的开发方式,有着编译运行快,业务逻辑分明,任务划分清晰等优点,针对Android端的组件化,之前有比较系统的总结过相关文章,感兴趣的朋友,可以查看,点击…...
目标URL启用了不安全的HTTP方法
修复中危web项目漏洞(目标URL启用了不安全的HTTP方法) 漏洞名 :目标URL启用了不安全的HTTP方法 等级: 中危 漏洞位置: PUT DELETE 描述: Web服务器配置为允许使用危险的HTTP方法,如PUT、MOVE、…...
大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)
告警解释 根据本地历史数据备份策略,集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件,审计日志可以成功转储。审计日志转储失败,系统产生此告警。如果第三方服务器的转储目录磁盘空间不足,或者用户修改了转…...
大模型该被知道的技术实现-面向垂直领域
一个高度清晰的思维导图截图奉上(下载:需3积分) 内容截图...
赛灵思产品系列
FPGA概述: FPGA的性能主要划分为以下几个方面: 1. 逻辑单元数量:逻辑单元数量越多,FPGA的处理能力越强。 2. 存储单元数量:存储单元数量越多,FPGA的存储能力越强。 3. 时钟频率:时钟频率越高&a…...
[Linux C] signal 的使用
前言: signal 是一种通信机制,可以跨进程发送,可以同进程跨线程发送,可以不同进程向指定线程发送。 信号的创建有两套api,一个是signal,一个是sigaction,signal缺陷很多,比如没有提…...
AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀
💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 AI时代的产品经理面临着…...
计算机网络重点概念整理-第七章 网络安全【期末复习|考研复习】
计算机网络复习系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言七、网络安全7.1网络安全7.2 网络威胁7.3 加密7.3.1 对称加密7.3.…...
【LeetCode力扣】42. 接雨水
目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、双指针法 1、题目介绍 原题链接: 42. 接雨水 - 力扣(LeetCode) 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由…...
03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)
目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思...
Mac用户心目中的四款首选原型工具
Wireframe、Mockup和prototype在原型工具中有什么区别? 无论你是刚进入这个行业的UX/UI设计师,还是已经进入这个行业多年的老手,你都必须在制作原型的过程中接触或听到三个非常重要的原型术语:“wireframe(线框图)Mockup”或“pr…...
VMware 17 开机自启实战:从配置到故障排查的完整指南
1. VMware 17开机自启基础配置 很多运维工程师在生产环境中都会遇到这样的需求:让VMware虚拟机像系统服务一样随宿主机自动启动。这个功能对于无人值守的服务器、工控机等场景特别重要。下面我就以VMware Workstation 17为例,手把手教你配置全过程。 首…...
从MOT16到YOLOv8+ByteTrack:实战中你的多目标跟踪IDF1为什么上不去?
从MOT16到YOLOv8ByteTrack:实战中多目标跟踪IDF1提升的深度解析 在计算机视觉领域,多目标跟踪(Multi-Object Tracking, MOT)一直是极具挑战性的任务。当我们使用YOLOv8等先进检测器配合ByteTrack等跟踪算法时,IDF1分数往往成为衡量系统性能的…...
2026河北钢制防火门多少钱一平米?甲乙丙级最新报价
在建筑消防工程中,钢制防火门是厂房、小区、商场、地下室必不可少的消防设施。很多河北河间、任丘本地工程采购、施工方,最关心的就是钢制防火门最新平米价格。结合2026年河北消防建材市场行情,简单清晰讲解甲乙丙级钢制防火门市场价与选购要…...
3分钟掌握视频下载:VideoDownloadHelper免费插件完全指南
3分钟掌握视频下载:VideoDownloadHelper免费插件完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到过这样的…...
模态生成器:原理详解与推荐开源项目
把一种或多种输入模态,转换、补全或生成另一种目标模态的模块。例如: 文本 → 图像 图像 → 文本 文本 → 语音 语音 → 文本 图像 文本 → 视频 图像 文本 → 机器人动作 图像 → 深度图 / mask / 结构化检测结果 缺失模态 → 伪模态补全在 sVLM / ML…...
用Logisim从零搭建一个8位求补器:手把手教你理解补码的硬件实现
用Logisim从零搭建一个8位求补器:手把手教你理解补码的硬件实现 数字电路设计中最精妙的概念之一,莫过于补码表示法。它不仅解决了计算机中正负数的统一表示问题,还让加减法运算可以用同一套电路完成。但你是否好奇过,这个看似简单…...
2026 AI低代码实测:原理拆解+主流形态,避坑指南
2026年,AI低代码早已不是“概念炒作”,而是企业数字化转型的核心工具。Gartner预测,2026年全球70%以上新应用将采用低代码/无代码构建,较2023年45%的渗透率实现跨越式增长;IDC数据显示,同期全球AI低代码市场…...
从点击到意图:鸿蒙 App 的 AI 进化
子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...
芯片时钟树设计实战:平衡性能、功耗与鲁棒性的后端工程指南
1. 项目概述:从“动脉”视角理解时钟树在芯片设计的浩瀚世界里,时钟信号就像是整个系统的“动脉”。它不负责输送数据,但负责为所有逻辑单元提供统一的“心跳”节拍。没有稳定、同步的心跳,再强大的计算单元也会陷入混乱。我们常说…...
curatedMetagenomicData 应用宝典:3步实现人类微生物组数据分析实战
curatedMetagenomicData 应用宝典:3步实现人类微生物组数据分析实战 【免费下载链接】curatedMetagenomicData Curated Metagenomic Data of the Human Microbiome 项目地址: https://gitcode.com/gh_mirrors/cu/curatedMetagenomicData curatedMetagenomicD…...
