【网络协议】聊聊套接字socket

news2024/9/27 21:23:42

网络编程我们知道是通过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]

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

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

相关文章

【配置环境】VS Code中JavaScript环境搭建

一,环境 Windows 11 家庭中文版,64 位操作系统, 基于 x64 的处理器VS Code 版本: 1.83.1 (user setup)Node.js 版本:20.9.0 二,为什么搭建JavaScript环境 因为在看《重构改善既有代码的设计第2版》的时候,书中的代码展…

嵌入式基础知识-RSA非对称加密基本原理

之前的文章嵌入式基础知识-信息安全与加密,介绍过数据加密的一些基本概念,对称加密的原理比较简单,加密和解密的密钥相同,而非对称加密,两个密钥不同,本篇就来具体介绍RSA这种非对称加密的密钥计算原理。 …

【PyQt学习篇 · ⑧】:QWidget - 窗口特定操作

文章目录 图标标题不透明度窗口状态最大化和最小化窗口标志案例 图标 setWindowIcon(QIcon("resource/header_icon.png")):该函数用于设置QWidget的窗口图标。可以为窗口设置一个图标,以显示在窗口标题栏、任务栏或窗口管理器中。 windowIcon…

全面解析:oa系统是什么?有哪些好用的oa系统

oa系统是什么?有哪些好用的oa系统 一、什么是OA系统 OA系统全称为Office Automation,即办公自动化系统。它是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、流程管理、知识管理(档案和业务管理&am…

视频剪辑软件Corel VideoStudio Ultimate 会声会影2024中文旗舰版免费下载安装步骤

我喜欢视频剪辑软件Corel VideoStudio Ultimate 会声会影2024中文旗舰版,因为它使用起来很有趣。它很容易使用,但仍然给你很多功能和力量。VideoStudio让我与世界分享我的想法!“这个产品的功能非常多,我几乎没有触及它的表面&…

分布式系统之CAP理论

1. CAP 概念 CAP 概念指的是分布式系统中的三个核心属性:一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。CAP 定理由计算机科学家 Eric Brewer 在 2000 年提出&…

keealived安装配置启动

1.keepalived作用和原理图 keepalived作用:解决单点故障简单原理图1: 2.keepalived安装配置启动 地址: https://www.keepalived.org/download.html# 1)解压 tar -zxvf keepalived-2.0.18.tar.gz # 2)进入keepalived目录 cd keepalived-2.0.18/ # 3)安装libnl/libnl-3依赖…

系统架构设计之云原生架构

云原生架构 一. 云原生技术介绍二. 传统架构模式 VS 云原生架构模式三. 云原生架构反模式四. 云原生架构设计原则 其它相关推荐: 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 所属专栏:系统…

Tomcat简介 安装 站点部署 多实例配置 反向代理

一、Tomcat简介二 、Tomcat帮手 --- JDK安装jdk检查jdk是否安装成功 三.安装TomcatTomcat配置管理页面 四、web站点部署五、部署开源站点(jspgou商城)安装数据库 六、 jspgou商城上线配置数据库连接 七、Tomcat多实例配置复制程序文件浏览器访问 八、Tom…

3D LUT 滤镜 shader 源码分析

最近在做滤镜相关的渲染学习,目前大部分 LUT 滤镜代码实现都是参考由 GPUImage 提供的 LookupFilter 的逻辑,整个代码实现不多。参考网上的博文也有各种解释,参考了大量博文之后终于理解了,所以自己重新整理了一份,方便…

RT-Smart 开发笔记:int 类型数值溢出造成的奇怪问题的分析与排查记录

前言 最近在调试 RT-Smart 上的用户态 mq(消息队列)时,遇到一个奇怪的问题,这个例程打印了一下获取的时间,就可以正常的工作(超时退出),否则,就一直卡住(无法…

10.27~10.29数电第三次实验分析与问题

实验要求 分析 寄存器 D触发器有两个输出口,一个输入口,一个时钟信号,一个复位信号 同步异步就是说复位信号在不在always里 给它加一个load就成了一位寄存器, 寄存器堆 8个8位的寄存器堆,每个寄存器都有两读一写…

Zynq-Linux移植学习笔记之64- 国产ZYNQ在linux下配置国产5396芯片

1、背景介绍 复旦微ZYNQ通过SPI配置国产JEM5396,框图如下: 现在需要在linux下的应用程序内配置JEM5396的寄存器。其中FMQL和进口的XILINX ZYNQ类似,JEM5396和进口的BCM5396兼容。因此可以参考进口ZYNQ在linux下配置BCM5396过程。Zynq-Linux移…

【Java 进阶篇】Java HTTP响应消息详解

在Web开发中,HTTP(Hypertext Transfer Protocol)是一种用于传输数据的协议,它用于浏览器和Web服务器之间的通信。当你在浏览器中访问一个网页时,浏览器向Web服务器发送HTTP请求,然后Web服务器返回HTTP响应。…

YOLOv8如何添加注意力模块?

分为两种:有参注意力和无参注意力。 eg: 有参: import torch from torch import nnclass EMA(nn.Module):def __init__(self, channels, factor8):super(EMA, self).__init__()self.groups factorassert channels // self.groups > 0self.softmax …

CondaError_ Downloaded bytes did not match Content-Length

问题 使用anaconda下载包文件时,出现了CondaError: Downloaded bytes did not match Content-Length的错误 CondaError: Downloaded bytes did not match Content-Lengthurl: https://conda.anaconda.org/pytorch/win-64/pytorch-2.1.0-py3.11_cuda11.8_cudnn8_0.…

二维码智慧门牌管理系统升级,打造高效事件处理流程

文章目录 前言一、二维码智慧门牌管理系统的升级目标二、事件处理流程优化三、升级带来的好处 前言 随着城市化的不断推进,城市管理面临越来越多的挑战。为了更好地解决这些问题,许多城市已经开始采用二维码智慧门牌管理系统。这个系统不仅可以提高城市…

操作系统第一章-第三章大题_期末考试_详细易考

1.ABC三道作业如下表所示: 作业输入CPU输出A1505050B10060100C806050 (1) 计算在单道环境下运行时CPU的利用率;(2分) (2) 假设计算机系统中具有一个CPU、三个通道,画出ABC三道作业并发执行的情况图,并计算CPU利用率。(12分) 问题分析: c p u 利用率 c p u 有效…

Python对象(Object)与类型(Type)的关系

Object与Type 1、Object与Type概述2、Object与Type的关系 1、Object与Type概述 对象(Object)和类型(Type)是Python中两个最最基本的概念,它们是构筑Python语言大厦的基石 所有的数据类型,值,变…

[BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn

再补完这个就基本上完了. crypto RSA Variation II Schmidt-Samoa密码系统看上去很像RSA,其中Npqq, 给的eN给了d from secret import flag from Crypto.Util.number import *p getPrime(1024) q getPrime(1024)N p*p*qd inverse(N, (p-1)*(q-1)//GCD(p-1, q-1))m bytes…