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个问题
- 连接的生命周期是什么时候开始的?从服务器第一次接收到tcp包开始。
- 第三次握手结束,accept队列是如何从syn队列中找到对应的请求控制块的?根据源ip和源port查找。
- 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>添加配置类,与服务启动类同一个层级 地址:http…...
代码随想录 Leetcode383. 赎金信
题目: 代码(首刷自解 2024年1月15日): 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转场模板,视频画面上下左右转场后带有一点点回弹效果的PR项目工程模板 Vol. 05 项目特点: 回弹效果视频转场; Premiere Pro 2020及以上; 适用于照片和视频转场; 适用于任何FPS和分辨率; 视频教程。 PR转场…...
【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南
1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: 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的挂载数据目录,存放shp数据 m…...
libcurl使用默认编译的winssl进行https的双向认证
双向认证: 1.服务器回验证客户端上报的证书 2.客户端回验证服务器的证书 而证书一般分为:1.受信任的根证书,2不受信任的根证书。 但是由于各种限制不想在libcurl中增加openssl,那么使用默认的winssl也可以完成以上两种证书的双…...
MySQL运维实战(3.3) 管理数据库(database)
作者:俊达 引言 数据库的创建和管理是构建可靠数据的关键,关系到所存储数据的安全与稳定。在 MySQL 这个强大的关系型数据库系统中,数据库的创建与管理需要精准的步骤和妥善的配置。下面,将深入探讨如何使用MySQL 来管理数据库&…...
Web3去中心化存储:重新定义云服务
随着Web3技术的崭露头角,去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构,而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式,重新定义了云服务的未来。 1.摒弃中心化的弊端 …...
纸尿裤行业调研:预计到2024年提高至68.1%
母婴大消费是指围绕孕产妇和0-14岁婴幼童人群,贯穿孕产妇孕产及产后护理周期、婴幼童成长周期的满足其衣、食、住、行、用、玩、教等需求的消费品的总和。 不同产品消费频次各异,纸尿裤是母婴大消费中的最为高频且刚需的易耗品。当前,消费升…...
目标检测数据集 - 行人检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:行人检测数据集,真实场景高质量图片数据,涉及场景丰富,比如校园行人、街景行人、道路行人、遮挡行人、严重遮挡行人数据;适用实际项目应用:公共场所监控场景下行人检测项目,以及作为…...
重磅!巨匠纺品鉴正式签约“体坛冠军程晨”为品牌形象代言人
2024年,巨匠纺品鉴打响品牌营销开年第一战,携手全国啦啦操冠军程晨,强势开启“冠军品牌、冠军优选、冠军品质”中国年,实现品牌战略全面升级,全力传递"冠军品质"的品牌精神,拓展品牌影响力的深度和广度,为品…...
亚信安慧AntDB超融合框架——数智化时代数据库管理的新里程碑
在信息科技飞速发展的时代,亚信科技AntDB团队提出了一项颠覆性的“超融合”理念,旨在满足企业日益增长的复杂混合负载和多样化数据类型的业务需求。这一创新性框架的核心思想在于融合多引擎和多能力,充分发挥分布式数据库引擎的架构优势&…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
