当前位置: 首页 > news >正文

POSIX API与网络协议栈

本文介绍linux中与tcp网络通信相关的POSIX API,在每次调用的时候,网络协议栈会进行的操作与记录。

POSIX API

Posix API,提供了统一的接口,使程序能得以在不同的系统上运行。简单来说不同的操作系统进行同一个活动,比如打开文件,所调用的函数是不同的。系统1调用的是open1函数,系统2调用的是open2函数,在Posix API中统一规定把这个功能的函数包装成open,那么当应用程序在不同的系统上调用open函数的时候就都能打开文件了。

应用程序可能会有自己的打开文件函数,比如popen,fopen等等,都是在直接或间接的调用open。

网络协议栈

网络协议栈是内核的一部分,是一系列网络协议的集合。负责网络通信和网络数据传输。

tcp网络通信相关的POSIX API

socket

socket通俗的翻译是插座,插座分为插头和座,socket函数实际上是实现了网络通信中建立连接所需要的“插头”和“座”。在网络通信中,“插头”对应着socketfd,“座”对应着tcp控制块。

socketfd存在于用户空间中,Tcp协议是网络协议栈的一部分,tcp控制块又是tcp协议的一部分。

Tcp控制块包含了以下内容:源IP地址和源端口、目标IP地址和目标端口、连接状态、序列号和确认号、窗口大小、拥塞控制参数、超时和重传信息、接收和发送缓冲区、计时器、选项和标志。

bind

给socetkfd的tcp控制块的目的IP地址和目的端口赋值。有些客户端不绑定一个特定的端口,那么系统就会随机分配。

listen与connect

Listen函数的第二个参数是在设置syn_queue与accept_queue的总长度。listen函数主要在做两件事:

a.修改tcp控制块的连接状态,发生连接前后分别是LISTEN状态和ESTABLISH状态。

b.建立syn_queue(同步队列)和accept_queue(接受队列)。syn_queue用于存储未完成的三次握手的连接请求控制块,accept_queue用于存储刚刚完成了3次握手的连接请求控制块,等待移交给accept函数进行处理。

三次握手介绍

客户端连接到服务器需要首先进行三次握手,这三次握手是在底层进行的。服务器在listen状态,客户端调用connect之后,就在进行三次握手了,整个过程对于用户是黑箱的。作为高水平程序员,我们还是需要来了解下底层到底是怎么样的运作机制。

首先了解tcp头,需要重点了解的是控制位(Flags),包括了8块内容:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN,这些内容位要么填1,要么填0,用于控制和标识TCP连接的状态和行为。比如客户端发起了第一次握手,会往服务器发送一个tcp包,这个包会包含包头和没有数据的包体(包括后面的两次握手也是),这时候SYN被设置为1,说明是第一次握手。

三次握手的流程如图所示,以下的一根蓝线代表一次握手:

第一次握手,发送一个tcp包,这个包包头的SYN位置被设为1,seqnum被随机生成,比如是12345,由客户端发送给服务器。请求进入到了服务器的syn队列中,随即建立相应的请求控制块。

第二次握手,服务器返回一个包,这个包包头的SYN和ACK被设为1,客户端发送的12345的seqnum,收到12345的acknum。服务器也随机生成了一个seqnum,比如34531。

第三次握手,客户端发送了一个tcp包,于是服务器发送的是34531的seqnum,收到的34532的acknum。收到多大的acknum,表示seqnum小于这个acknum的tcp包都已经全部被对端接收过了。相应的请求控制块从syn队列移动到accept队列中。

通过seqnum和acknum的数值排序,可以实现tcp通信的不重复、不乱序、不缺失。

3个问题

  1. 连接的生命周期是什么时候开始的?从服务器第一次接收到tcp包开始。
  2. 第三次握手结束,accept队列是如何从syn队列中找到对应的请求控制块的?根据源ip和源port查找。
  3. Syn泛洪是什么?是一种网络攻击手段,简单来说就是黑客不断地通过第一次握手并且不回应第二次握手,把syn队列塞满,导致服务器无法建立新的连接。目前已经通过堡垒机、防火墙等手段拦截了该手段。

accept

Accept函数做了两件事:

a.     根据取出的连接请求控制块,建立新的fd,也就是通常新的clientfd。

b.     为这个新的fd建立新的tcp控制块。

send与write

tcp通信的这两个函数其实只做一件事,就是把数据从应用层appliacation,拷贝进入内核kenerl的发送缓冲区中。至于内核什么时候把数据发送到对端,就不一定了,有可能是先凑满一定的字符数再一起发送,有可能是看到一定时间内都没有数据再拷贝进入就发送,不同的系统会有不同的操作。我们可以通过ifconfig命令查看mtu,也就是单个数据包中可以传输的最大字节数。

recv和read

tcp通信的这两个函数其实也只做了一件事,就是把数据从内核的接收缓冲区拷贝到应用层。

close

该函数是负责断开客户端与服务器之间的连接。底层的流程通常称为“四次挥手”。不同于发起连接只能由客户端发起,断开连接可以由任意一方启动,只分为主动方和被动方。

Close函数做了两部分工作:a.回收fd。b.发送一个控制位FIN为1的包(第一次挥手),也叫fin包或final包,这个包的包体没有任何内容,于是对端的recv会返回0。

当对端接收到FIN包之后,通常会返回一个ack包,再调用close函数返回一个fin包(第二、三次挥手)。本端收到fin包之后再返回一个ack包(第四次挥手)。

下图是close主动方与被动方的挥手关系与状态变化:

红圈对应着主动方与被动方的状态变化。

相关文章:

POSIX API与网络协议栈

本文介绍linux中与tcp网络通信相关的POSIX API,在每次调用的时候,网络协议栈会进行的操作与记录。 POSIX API Posix API,提供了统一的接口,使程序能得以在不同的系统上运行。简单来说不同的操作系统进行同一个活动,比…...

互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…...

腾讯云 IPv6 解决方案

产品矩阵全覆盖 腾讯云全线产品 All in IPv6;云服务器、私有网络、负载均衡、内容分发、域名解析、DDoS 高防等都已支持 IPv6。 全球 IPv6 基础设施 腾讯云在全球开放25个地理区域,运营53个可用区;目前已有多个地域提供 IPv6 接入能力。 …...

Appium 自动化测试

1.Appium介绍 1,appium是开源的移动端自动化测试框架; 2,appium可以测试原生的、混合的、以及移动端的web项目; 3,appium可以测试ios,android应用(当然了,还有firefoxos)…...

深入浅出Android dmabuf_dump工具

目录 dmabuf是什么? dmabuf_dump工具介绍(基于Android 14) Android.bp dmabuf_dump.cpp 整体架构结构如下 dmabuf_dump主要包含以下功能 前置背景知识 fdinfo 思考 bufinfo Dump整个手机系统的dmabuf Dump某个进程的dmabuf​​​​​​​ 以Table[buff…...

Guava RateLimiter预热模型

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 什么是流量预热 我们都知道在做运动之前先得来几组…...

【搭建个人知识库-3】

搭建个人知识库-3 1 大模型开发范式1.1 RAG原理1.2 LangChain框架1.3 构建向量数据库1.4 构建知识库助手1.5 Web Demo部署 2 动手实践2.1 环境配置2.2 知识库搭建2.2.1 数据收集2.2.2 加载数据2.2.3 构建向量数据库 2.3 InternLM接入LangChain2.4 构建检索问答链1 加载向量数据…...

如何看待 Linux 内核邮件列表重启将内核中的 C 代码转换为 C++

如何看待 Linux 内核邮件列表重启将内核中的 C 代码转换为 C 的讨论? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿…...

springboot网关添加swagger

添加依赖 <dependency><groupId>com.spring4all</groupId><artifactId>swagger-spring-boot-starter</artifactId><version>2.0.2</version></dependency>添加配置类&#xff0c;与服务启动类同一个层级 地址&#xff1a;http…...

代码随想录 Leetcode383. 赎金信

题目&#xff1a; 代码&#xff08;首刷自解 2024年1月15日&#xff09;&#xff1a; class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> v(26);for(auto letter : magazine) {v[letter - a];}for(auto letter : ransomNote…...

上下左右视频转场模板PR项目工程文件 Vol. 05

pr转场模板&#xff0c;视频画面上下左右转场后带有一点点回弹效果的PR项目工程模板 Vol. 05 项目特点&#xff1a; 回弹效果视频转场&#xff1b; Premiere Pro 2020及以上&#xff1b; 适用于照片和视频转场&#xff1b; 适用于任何FPS和分辨率&#xff1b; 视频教程。 PR转场…...

【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第三…...

Linux系统使用docker部署Geoserver(简单粗暴,复制即用)

1、拉取镜像 docker pull kartoza/geoserver:2.20.32、创建数据挂载目录 # 统一管理Docker容器的数据文件,geoserver mkdir -p /mydata/geoserver# 创建geoserver的挂载数据目录 mkdir -p /mydata/geoserver/data_dir# 创建geoserver的挂载数据目录&#xff0c;存放shp数据 m…...

libcurl使用默认编译的winssl进行https的双向认证

双向认证&#xff1a; 1.服务器回验证客户端上报的证书 2.客户端回验证服务器的证书 而证书一般分为&#xff1a;1.受信任的根证书&#xff0c;2不受信任的根证书。 但是由于各种限制不想在libcurl中增加openssl&#xff0c;那么使用默认的winssl也可以完成以上两种证书的双…...

MySQL运维实战(3.3) 管理数据库(database)

作者&#xff1a;俊达 引言 数据库的创建和管理是构建可靠数据的关键&#xff0c;关系到所存储数据的安全与稳定。在 MySQL 这个强大的关系型数据库系统中&#xff0c;数据库的创建与管理需要精准的步骤和妥善的配置。下面&#xff0c;将深入探讨如何使用MySQL 来管理数据库&…...

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角&#xff0c;去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构&#xff0c;而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式&#xff0c;重新定义了云服务的未来。 1.摒弃中心化的弊端 …...

纸尿裤行业调研:预计到2024年提高至68.1%

母婴大消费是指围绕孕产妇和0-14岁婴幼童人群&#xff0c;贯穿孕产妇孕产及产后护理周期、婴幼童成长周期的满足其衣、食、住、行、用、玩、教等需求的消费品的总和。 不同产品消费频次各异&#xff0c;纸尿裤是母婴大消费中的最为高频且刚需的易耗品。当前&#xff0c;消费升…...

目标检测数据集 - 行人检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;行人检测数据集&#xff0c;真实场景高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据&#xff1b;适用实际项目应用&#xff1a;公共场所监控场景下行人检测项目&#xff0c;以及作为…...

重磅!巨匠纺品鉴正式签约“体坛冠军程晨”为品牌形象代言人

2024年&#xff0c;巨匠纺品鉴打响品牌营销开年第一战&#xff0c;携手全国啦啦操冠军程晨&#xff0c;强势开启“冠军品牌、冠军优选、冠军品质”中国年&#xff0c;实现品牌战略全面升级&#xff0c;全力传递"冠军品质"的品牌精神,拓展品牌影响力的深度和广度,为品…...

亚信安慧AntDB超融合框架——数智化时代数据库管理的新里程碑

在信息科技飞速发展的时代&#xff0c;亚信科技AntDB团队提出了一项颠覆性的“超融合”理念&#xff0c;旨在满足企业日益增长的复杂混合负载和多样化数据类型的业务需求。这一创新性框架的核心思想在于融合多引擎和多能力&#xff0c;充分发挥分布式数据库引擎的架构优势&…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...