做中介平台网站 需要什么/苏州seo服务

做中介平台网站 需要什么,苏州seo服务,哔哩哔哩网站建设分析,wordpress媒体图像尺寸怎么设置TCP 全连接队列 理解 listen 的第二个参数 int listen(int sockfd, int backlog);backlog 参数表示 全连接队列(accept 队列)的最大长度。 那什么是全连接队列呢? 三次握手 & accept() 处理流程 客户端发送 SYN,服务器收到并…

TCP 全连接队列

理解 listen 的第二个参数

int listen(int sockfd, int backlog);

backlog 参数表示 全连接队列(accept 队列)的最大长度

那什么是全连接队列呢?

三次握手 & accept() 处理流程

  1. 客户端发送 SYN,服务器收到并放入半连接队列
  2. 服务器回 SYN+ACK,客户端收到后发送 ACK
  3. 服务器收到 ACK,握手完成,连接进入全连接队列等待 accept() 处理。
  4. 服务器调用 accept() 取出连接,建立 TCP 连接。

也就是说我们访问服务器会由内核自动进行3次握手,完成后会连入全连接队列中,服务端再调用accept(),从队列中获取连接进行处理。而listen的第二个参数就是全连接队列的最大连接长度,如果服务器来不及调用accept()处理连接,连接会堆积在全连接队列。超过最大连接长度,再进行连接就会三次握手失败。

所以全连接队列本质就是一种生产消费者模型backlog 不能太长也不能太短。

1.太短,可能丢失大量连接(客户端需要重试,增加网络负担)。

2.太长,一方面会让用户等待过长的时间,另一方面会占用大量内存

Linux 内核 TCP socket

先看一下从进程的文件描述符到 TCP socket的整体结构

1. 任务(task_struct)到文件描述符表

  • 进程的 task_struct 结构体包含 files_struct,用于管理进程的文件表。
  • files_struct 中有一个 fd_array[](文件描述符数组),存储着所有打开的文件(struct file 指针)。

2. 文件结构(struct file)

  • struct file 代表进程打开的一个文件,可能是普通文件、设备文件或者套接字(socket)。
  • 其中 private_data 用于存储 socket 相关信息。
  • 当文件描述符指向 socket 时,它的 private_data 指向 struct socket 结构体。

3. socket 结构(struct socket)

  • struct socket 代表一个高层的 socket 抽象,内部包含:
    • struct file *file:指向与 socket 关联的文件结构。
    • struct sock *sk:指向具体的 sock 结构体,代表底层协议相关的数据结构。
    • struct socket {socket_state state;       // socket 当前状态,如 SS_CONNECTEDshort type;               // socket 类型,如 SOCK_STREAM(TCP)或 SOCK_DGRAM(UDP)unsigned long flags;      // socket 标志struct file *file;        // 关联的 struct file 结构体struct sock *sk;          // 关联的 struct sock 结构体(底层协议数据)const struct proto_ops *ops; // 指向 socket 操作函数
      };
      


4. sock 结构(struct sock)

  • struct sock 是底层 socket 内部的核心结构,存储协议无关的信息。
  • struct sock 可以指向不同的协议(如 TCP、UDP、RAW)扩展成更具体的协议结构。

5. TCP Socket结构

  • 从高层到底层,TCP socket 主要涉及以下结构:

    • struct sock(通用 socket 结构)
    • struct inet_sock(IP 层 socket)
    • struct inet_connection_sock(面向连接的 socket)
    • struct tcp_sock(TCP 连接的具体实现)

1 struct sock(核心 socket 结构)

struct sock 是 Linux 内核中最基础的 socket 结构,几乎所有的协议(TCP、UDP、RAW)都会用到它。它存储了 socket 相关的通用数据,例如:

struct sock {struct socket *sk_socket;  // 关联的 socket 结构struct sock_common __sk_common; // 存放通用的网络信息,如 IP、端口等atomic_t sk_refcnt;  // 引用计数struct sk_buff_head sk_receive_queue; // 接收缓冲队列struct sk_buff_head sk_write_queue; // 发送缓冲队列struct proto *sk_prot; // 指向协议处理函数(TCP、UDP等)
};

关键字段解析

  • sk_socket:指向 struct socket,用于在高层 socket 结构和底层 sock 结构之间建立关联。
  • sk_receive_queue:存储接收到但尚未被应用层读取的数据包。
  • sk_write_queue:存储尚未发送的数据包。
  • sk_prot指向协议处理函数,例如 TCP 或 UDP 的操作集合。struct socket中type是TCP就调用TCP的函数

作用

  • struct sock 作为所有协议(TCP/UDP)的基类,包含通用 socket 操作。
  • struct socket 通过 sk 字段关联。
  • sk_prot 用于决定 socket 的具体协议操作,例如 tcp_prot(TCP 协议处理)。

2 struct inet_sock(IP 层 socket)

struct inet_sock 继承自 struct sock,用于 IPv4 相关的 socket 操作。这个结构体增加了 IP 层的字段,例如源 IP、目的 IP、端口号等。

struct inet_sock {struct sock sk; // 继承 struct sock__be32 inet_saddr; // 本地 IP 地址__be32 inet_rcv_saddr; // 绑定的本地 IP 地址(可能是 0.0.0.0)__be16 inet_sport; // 本地端口(主机字节序)__be16 inet_dport; // 远程端口(主机字节序)__be32 inet_daddr; // 远程 IP 地址struct ip_options *inet_opt; // 额外的 IP 选项(如 IP 选路)
};

关键字段解析

  • inet_saddr:本地 IP 地址。
  • inet_daddr:目标 IP 地址。
  • inet_sport:本地端口号。
  • inet_dport:远程端口号。
  • inet_opt:可选的 IP 头部选项。

作用

  • 增加 IP 层信息,使得 struct sock 能够支持 IPv4 协议。
  • 存储 socket 关联的 IP 地址和端口号。
  • 供 TCP 和 UDP 继承,并扩展额外功能。

3 struct inet_connection_sock(面向连接的 socket)

struct inet_connection_sock 继承 struct inet_sock,用于 面向连接的协议(如 TCP)。它增加了 TCP 连接管理所需的数据,例如超时控制、连接状态等。

struct inet_connection_sock {struct inet_sock icsk_inet; // 继承 struct inet_sockstruct request_sock_queue icsk_accept_queue; // 半连接队列struct list_head icsk_ack_list; // TCP Fast Open 相关struct timer_list icsk_retransmit_timer; // 重传定时器struct request_sock *icsk_accept_head; // 指向全连接队列的头部
};

关键字段解析

字段作用
icsk_inet继承 struct inet_sock,包含 IP 地址、端口信息
icsk_accept_queue半连接队列,存放 SYN-RECEIVED 连接
icsk_ack_listTCP Fast Open 机制,加快 SYN 建立连接
icsk_retransmit_timerTCP 重传定时器,用于 SYN+ACK 超时重传
icsk_accept_head全连接队列,存放 ESTABLISHED 连接,等待 accept()

作用

  • 维护 TCP 连接状态(如 SYN、ESTABLISHED)。
  • 控制 TCP 连接的超时机制。
  • 监听 socket 维护 accept() 所需的连接队列。

4 struct tcp_sock(TCP 连接的实现)

struct tcp_sock 继承 struct inet_connection_sock,专门用于 TCP 连接,存储 TCP 专有的数据,例如 TCP 窗口大小、拥塞控制状态等。

struct tcp_sock {struct inet_connection_sock inet_conn; // 继承 struct inet_connection_socku32 snd_nxt; // 发送窗口的下一个序列号u32 rcv_nxt; // 接收窗口的下一个序列号u32 snd_una; // 发送窗口的最早未确认序列号u32 snd_wnd; // 发送窗口大小u32 rcv_wnd; // 接收窗口大小struct sk_buff *retransmit_skb_hint; // 指向要重传的数据struct tcp_congestion_ops *cong_control; // 拥塞控制算法
};

关键字段解析

  • snd_nxt:下一个要发送的 TCP 序列号。
  • rcv_nxt:期望接收的下一个 TCP 序列号。
  • snd_una:最早未被确认的 TCP 序列号(累计确认)。
  • snd_wnd / rcv_wnd:TCP 窗口大小,决定流量控制。
  • retransmit_skb_hint:指向当前需要重传的 TCP 报文。
  • cong_control:TCP 拥塞控制算法(如 Reno、CUBIC)。

作用

  • 维护 TCP 发送、接收窗口,实现流量控制。
  • 管理 TCP 拥塞控制机制,影响 TCP 传输速率。
  • 控制 TCP 数据包重传,保证可靠传输。

结构体关系总结

  • struct sock(核心 socket 结构,通用于所有协议)。
  • struct inet_sock(增加 IP 地址、端口等)。
  • struct inet_connection_sock(增加 TCP 连接管理功能)。
  • struct tcp_sock(TCP 特有字段,如序列号、窗口大小等)

UDP Socket 结构层次

UDP(User Datagram Protocol)是无连接的传输协议,与 TCP 相比,它没有连接管理、流量控制和可靠性机制,因此在 Linux 内核中的实现相对简单。UDP 的 socket 仍然依赖于 struct sock,但不需要像 TCP 那样扩展 struct inet_connection_sockstruct tcp_sock

UDP 在内核中的数据结构层级如下:

  1. struct sock(核心 socket 结构)
  2. struct inet_sock(IP 层 socket,增加源/目标 IP、端口等信息)
  3. struct udp_sock(UDP 特有的数据结构)

TCP 需要 struct inet_connection_sockstruct tcp_sock 来处理连接管理,而 UDP 直接使用 struct inet_sock,并在 struct udp_sock 中扩展少量的 UDP 相关字段。

listen()监听TCP连接创建tcp socket的内核过程

当服务器使用 listen() 监听 TCP 连接,并在 accept() 中接受新的连接时,Linux 内核会经历以下几个关键步骤:

  1. listen() 监听 TCP 端口
  2. 三次握手期间,创建 struct sock 并存入半连接队列,三次握手完成后连入全连接队列中
  3. accept() 取出 struct sock,创建 struct socket
  4. 创建 struct file 并存入 struct files_struct->fd_array[]

1. listen():初始化监听 socket 并设置全连接队列

Linux 内核执行 tcp_listen_start(),配置 struct sock 进入监听状态。

listen() 作用

  • 设置 struct sock->sk_state = TCP_LISTEN
  • 初始化 icsk_accept_queue(半连接队列)和 icsk_accept_head(全连接队列)
  • 设置 backlog,决定全连接队列最大容量

2. 客户端三次握手,创建 struct sock 并进入全连接队列

当客户端发起 TCP 连接时:

  1. 客户端发送 SYN

    • 服务器 TCP_LISTEN 状态,调用 tcp_v4_rcv() 处理 SYN
    • 服务器分配 struct request_sock,存入 半连接队列 (icsk_accept_queue)
  2. 服务器回复 SYN+ACK

    • 服务器仍然在 TCP_LISTEN 状态。
    • SYN+ACK 发送后,客户端需要回复 ACK
  3. 客户端发送 ACK,服务器进入 ESTABLISHED

    • tcp_v4_rcv() 处理 ACK
    • 服务器 创建 struct sock,从半连接队列转移到 全连接队列 (icsk_accept_head),等待 accept() 处理。

3. accept() 处理全连接队列,创建 struct socket

当服务器调用:accept()

  • accept() 取出全连接队列 icsk_accept_head 里的 struct sock
  • 创建 新的 struct socket 并关联 struct sock
  • accept() 创建 struct socket 后,还需要 struct file 结构,以便进程可以通过文件描述符访问它创建 struct file,并存入 fd_array[](文件描述符表)。

1.struct sock在三次握手过程中创建并进入半连接队列

2.三次握手完成后,struct sock连接到全连接队列中,accpet()调用后创建对应的struct socket并用struct sock*sk关联,

3.再创建struct file用private_data连接struct socket,struct socket中struct file*file再反指向file。

4.把file的指针填入struct files_struct 中fd_array[]文件描述符表数组分配文件描述符fd。

5.再由accept()返回创建的fd

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

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

相关文章

OpenEuler-22.03-LTS上利用Ansible轻松部署MySQL 5.7

一、需求 使用ansible自动化部署mysql二进制部署mysql部署mysql并创建JDBC用户 二、环境信息 本文涉及的代码,配置文件地址: 链接:百度网盘 请输入提取码 提取码:1g6y 软件名称版本备注Ansible2.9.27All modules — Ansible Doc…

基于javaweb的SpringBoot农资商城购物商城系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

angular打地鼠

说明:我计划用angular做一款打地鼠的小游戏, 打地鼠游戏实现文档 🎮 游戏逻辑 ​游戏场景 采用 3x3 网格布局的 9 个地鼠洞​核心机制 地鼠随机从洞口弹出点击有效目标获得积分30 秒倒计时游戏模式 ​难度系统 简单模式:生成间…

博客网站(springboot)整合deepseek实现在线调用

🎉🎉🎉🎉🎉🎉 欢迎访问的个人博客:https://swzbk.site/,加好友,拉你入福利群 🎉🎉🎉🎉🎉🎉 1、de…

Kubernetes 单节点集群搭建

Kubernetes 单节点集群搭建教程 本人尝试基于Ubuntu搭建一个单节点K8S集群,其中遇到各种问题,最大的问题就是网络,各种镜像源下载不下来,特此记录!注意:文中使用了几个镜像,将看来可能失效导致安…

专题三0~n-1中缺失的数字

1.题目 给一个数组,单调性是递增的,需要找到缺失的数字,加上这个数字就变为等差数组了。 2.算法原理 这里用二分来解决,而二段性是根据下标区分,临界值前的数字于下标相对应,临界值后的于下标相差1&#x…

【图像处理】ISP(Image Signal Processor) 图像处理器的用途和工作原理?

ISP(图像信号处理器)是数字影像设备的“视觉大脑”,负责将传感器捕获的原始电信号转化为我们看到的高清图像。以下从用途和工作原理两方面通俗解析: 一、ISP的核心用途:让照片“更像眼睛看到的” 提升画质&#xff1a…

python学习笔记-mysql数据库操作

现有一个需求,调用高德api获取全国县级以上行政区数据并保存为json文件,使用python获取: import requests import json# 高德API Key api_key "your_api_key"# 调用行政区域查询API def fetch_districts():url f"https://r…

Redisson 实现分布式锁源码浅析

大家好,我是此林。 今天来分享Redisson分布式锁源码。还是一样,我们用 问题驱动 的方式展开讲述。 1. redis 中如何使用 lua 脚本? Redis内置了lua解释器,lua脚本有两个好处: 1. 减少多次Redis命令的网络传输开销。…

【软件】免费的PDF全文翻译软件,能保留公式图表的样式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 很多PDF全文翻译软件都是收费的,而划线翻译看着又很累。这个开源的PDF全文翻译软件非常好用,并且能够保留公式、图表、目录和注…

PentestGPT 下载

PentestGPT 下载 PentestGPT 介绍 PentestGPT(Penetration Testing GPT)是一个基于大语言模型(LLM)的智能渗透测试助手。它结合了 ChatGPT(或其他 GPT 模型)与渗透测试工具,帮助安全研究人员自…

防火墙虚拟系统实验

一实验拓扑 二实验过程 配置资源 创建虚拟系统 配置管理员 创建安全策略

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信,但是前面的传递并没有完全体现出HTTP的序列化和反序列化,为了更好得理解其工作流程,在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…

基于Python+SQLite实现(Web)验室设备管理系统

实验室设备管理系统 应用背景 为方便实验室进行设备管理,某大学拟开发实验室设备管理系统 来管理所有实验室里的各种设备。系统可实现管理员登录,查看现有的所有设备, 增加设备等功能。 开发环境 Mac OSPyCharm IDEPython3Flask&#xff…

深拷贝and浅拷贝!

一、什么是拷贝?什么是深拷贝和浅拷贝? (1)拷贝:拷贝就是为了复用原对象的部分or全部数据,在原对象的基础上通过复制的方式创建一个新的对象。 拷贝对象可以分为三种类型:直接赋值、浅拷贝和深拷…

高频面试题(含笔试高频算法整理)基本总结回顾43

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

网络爬虫【简介】

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲视图 一、网络爬虫的定义 网络爬虫(Web Crawler),又称为网络蜘蛛、网络机器人等,是一种按照一定规则自动抓取互联网信息的程序或脚本。它…

​AI时代到来,对电商来说是效率跃升,还是温水煮青蛙

​凌晨三点的义乌商贸城,95后创业者小王,静静地盯着屏幕上的AI工具,竟露出了笑容。这个月他的跨境玩具店销量提升了不少,从之前的状态翻了3倍;而且团队人数有所变化,从5人缩减到了2人(其中包括他…

PDF文件密码保护破解:安全解密的步骤与技巧

PDF文件加密后,需要特定的密码才能访问内容。以下是一些常见的方法来解密PDF文件: 方法一:使用Adobe Acrobat 如果你有Adobe Acrobat Pro,可以使用它来解密PDF文件。 打开Adobe Acrobat Pro: 启动Adobe Acrobat Pro…

qt 自带虚拟键盘的编译使用记录

一、windows 下编译 使用vs 命令窗口,分别执行: qmake CONFIG"lang-en_GB lang-zh_CN" nmake nmake install 如果事先没有 指定需要使用的输入法语言就进行过编译,则需要先 执行 nmake distclean 清理后执行 qmake 才能生效。 …