Linux相关概念和易错知识点(37)(序列化和反序列化、TCP协议、会话和守护进程)

TCP建立会话的过程 这里写目录标题TCP建立会话的过程三次握手第一次第二次第三次TCP断开会话4次挥手第一步第二步第三步第四步TCP确保可靠性的机制IP TCP建立会话的过程 三次握手 第一次 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次 第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包, 阅读详情

目录

1.序列化和反序列化

(1)为什么需要序列化

(2)序列化方案

①json

②json序列化代码模板

③json反序列化代码模板

④将自定义方案和json结合

2.TCP协议(传输控制协议)

(1)为什么支持全双工

(2)管理报文

​编辑

(3)面向字节流

3.会话和守护进程

(1)前台进程和后台进程

(2)会话

(3)创建新会话和守护进程

①创建新会话

②Daemon实现

4.常见指令

(1)netstat

(2)telnet

(3)ulimit


1.序列化和反序列化

(1)为什么需要序列化

应用层:用于解决实际问题,满足日常需求的网络程序都在应用层。

在应用层,我们一般都以面向对象的方式管理数据(管理消息需要有名字、时间等属性),即用类管理数据。协议就是双方约定好的结构化的数据和方法(协议定制就是定制双方都能认识的满足通信和业务需求的结构化数据(class、struct))。我们要传输一些结构化的数据怎么办?

一种方法是在recv里面直接传结构体指针,直接将结构体转为二进制,接收端直接接收并按照相应结构体的规则访问。OS的底层就是这样的,因为一台电脑上的OS设计有严格化规定,是统一的。

但在不同主机的应用层看来,大小端、对齐规则、语言版本、32位和64位、结构体里面有指针等都会导致通信出现问题,因此要考虑兼容性问题,在网络中,我们需要将这些数据转换成字符串形式传输,这就是序列化的由来。

序列化,即将信息多变一,以统一的规则发送,反序列化就是一变多,解析字符串为结构化数据。

(2)序列化方案

①json

json是现成的序列化方案(还有xml、protobuf等),我们可以直接用,会用即可。

我们发现json会将结构化数据转为KV字符串。同样我们也可以反序列化

 使用json需要包含的文件

②json序列化代码模板

	// 序列化模板代码
	Json::Value root;
	
	//输入每个想要序列化的对象的成员变量
	root["x"] = op._x;
	root["y"] = op._y;
	root["oper"] = op._oper;

	//将root接收的要序列化的对象转换为json格式的字符串
	Json::StreamWriterBuilder writer;
	std::string json_string = Json::writeString(writer, root);

③json反序列化代码模板

	// 反序列化模板代码
	Json::Value root;
	Json::Reader reader;
	bool ParsingSuccessful = reader.parse(json_string, root);
	if (!ParsingSuccessful)
		return 1;//进行错误处理

	// 接受反序列化结果的结构体对象
	operation info;
	info._x = root["x"].asInt(); // 对每个成员进行提取
	info._y = root["y"].asInt();
	info._oper = root["oper"].asInt(); // char类型也用asInt()来提取

④将自定义方案和json结合

json处理后的数据是有效载荷,我们还可以自己给这个有效载荷做一层包装。因为TCP是面向字节流的,有了这一层包装可以进一步保证资源传输完整性。

格式:head_length(有效载荷的长度)\r\n + 有效载荷(json处理后的数据)+ \r\n

到此为止,我们就实现了一个自己的协议。

对于客户端,它需要将发送的数据通过协议里面的包装函数转换成上述格式的字符串传出去,接收端再按照相应的解包函数逆向还原结构化数据,然后调用将这些数据作为参数调用服务,最后再将结果通过协议返回给客户端。

2.TCP协议(传输控制协议)

(1)为什么支持全双工

TCP会创建发送和接受缓冲区。send、write都是写到发送缓冲区,本质就是拷贝。recv和read同理,而最后何时刷新缓冲区这个决策由OS自主决定。

为什么TCP支持全双工?是因为有缓冲区,两台主机分别有一个发送和接受缓冲区,保证数据能从一方发送缓冲区发到另一方的接受缓冲区。这和系统的文件系统的处理类似,都是用空间换时间的做法。

(2)管理报文

OS内部可能会存在大量处于不同状态的报文,需要管理,管理方法依然是先描述、再组织

这里面的的receive_queue和write_queue就是我们说的发送和接受缓冲区。我们可以看到这两个缓冲区是socket单独开辟的,和OS层面的文件缓冲区、语言级缓冲区是没有关系的。我们可以理解为创建一个socket之后,对应的文件在file层面和其它文件没什么区别,但实际上是多开辟了缓冲区的。

(3)面向字节流

和面向数据报不同,UDP的数据必须完整打包发过去(快递不能收半个);相比而言,TCP就像自来水管,只负责发水,或多或少,发一个字节也是发数据了。至于数据怎么发,出错了怎么办等都由TCP自主决定,这就是面向字节流。

因此,TCP的完整性应由应用层保证,就是序列化中自定义协议的方案(head_length + json的包装)。

3.会话和守护进程

(1)前台进程和后台进程

使用命令可查看进程的属性

 ps ajx | head -1 ; ps ajx | grep sleep | grep -v grep

有个多余的sleep 180,我们不管它,只关注需要的部分

前台任务状态有+,S+就是前台的,这意味着可以Ctrl + C杀掉进程

sleep 1000 &直接放到后台,成为后台进程

可以用命令fg (任务号)由后台提到前台,我们可以看到状态又重新变为+了。

其它相关操作:

前台进程运行时^Z暂停,暂停时会获得一个任务号。

bg 1让它再次后台运行起来,这个时候就是后台的了

(2)会话

我们先来认识ps命令获取的属性

重点要理解会话,它是理解守护进程的必经之路。

这个会话在Windows里面就是图形化界面,将bash替换成GUI的shell即可,每个用户登录后得到的都是一个系统提供的会话,其下的进程都在同一会话下运行。由于继承了shell的文件描述符表,进程都指向同一个终端文件,因此我们同时只能有一个前台进程来获取用户的输入。

每个用户都有对应的session(会话),session实体也要通过数据结构管理起来,其中session有存储的地址和id等信息,将这些信息和bash的PID关联起来,此时进程就和会话相关了,其它进程同理。我们可以认为进程就是在会话里面运行的。

SID的值就是登录用户后bash的ID,其下子进程的SID理应都是该值。但用户一退出,会话下面的后台进程就会受到影响(不一定会被销毁,可能报错),因此要创建守护进程,就是想办法让后台进程在一个新的会话下面运行,而不是和用户的会话强关联。

(3)创建新会话和守护进程

①创建新会话

谁调用pid_t setsid()成功了,谁就创建了一个session并且自己成为了其中组长。调用的进程不能是进程组的组长,我们可以用孤儿进程来保证这一点。

daemon函数就是创建守护进程的函数,可以结合Daemon的实现来理解。

②Daemon实现

#pragma once

#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

void myDaemon(bool ischdir, bool isclose)
{
    // 守护进程屏蔽特定的信号,这里可以按照自己的需要进行修改
    signal(SIGCHLD, SIG_IGN); // 忽略子进程结束信号,子进程结束后自动释放资源
    signal(SIGHUP, SIG_IGN);  // 忽略挂起信号
    signal(SIGTSTP, SIG_IGN); // 忽略停止信号
    signal(SIGPIPE, SIG_IGN); // 忽略管道破裂信号

    // 进程组的组长不能创建新会话,因此创建子进程,让子进程执行后面的代码
    if (fork() > 0)
        exit(0); // 父进程(进程组组长退出)

    // 从这里开始就是子进程在执行代码了,子进程一定保证不是进程组组长,组长已经销毁了,可以说这里开始子进程就是孤儿进程了
    // 这一步是必然的,因此我们也可以说守护进程就是孤儿进程

    setsid(); // 建立新会话,该孤儿进程自动成为新的会话组长,并与原来的会话分离

    // 每一个进程都有自己的CWD
    if (ischdir) // 选择是否将当前进程的CWD更改成为 / 根目录,这样守护进程就能独自在根目录运行,而不会受到任何外界的干扰,在守护进程中访问文件就相当于绝对路径了
        chdir("/");

    // 选择是否关闭文件描述符,这样守护进程就不需要和终端打交道了
    if (isclose)
    {
        close(0);
        close(1);
        close(2);
    }
    else
    {
        // 重定向标准输入、输出、错误到/dev/null
        int fd = open("/dev/null", O_WRONLY); // 根目录下的黑洞文件,写的直接丢弃,读也读不到数据
        if (fd > 0)
        {
            dup2(fd, 0); // 将标准输入重定向到/dev/null,保证读不到任何输入
            dup2(fd, 1); // 将标准输出重定向到/dev/null,保证输出不显示在屏幕上
            dup2(fd, 2); // 将标准错误重定向到/dev/null,保证错误不显示在屏幕上
            close(fd);   // fd已经有3份拷贝了,关闭原来的fd
        }
    }
}

至此,只要程序调用这个函数,它就变成了一个守护进程,独立地运行,不受任何用户登录退出的影响。这个时候我们才可以说创建了一个真正的服务。

我们可以让一个网络服务的程序变成守护进程,一直运行在后台,不断处理用户发送的请求,这就是服务器正在干的事情。

4.常见指令

(1)netstat

-t代表TCP,-u代表UDP

netstat -t 或者 netstat -u

其他选项:

n表示数字显示,a表示所有匹配项,p显示进程,l表示只查看监听状态的TCP。

访问网站本质也是TCP(或UDP),我们可以在网站上用IP:Port访问TCP,获取提供服务的fd。

(2)telnet

telnet www.baidu.com 80(端口号)可以访问网站

这个可以配合HTTP使用。

(3)ulimit

fd要close,否则有fd(有限、有价值的资源)泄露问题。Linux支持对文件描述符个数进行扩展的,ulimit -a可看到open files个数


 

NAO机器人开发首关:Choregraphe连接失败的根因与闭环排查 ALMemory和NAOqi是人形机器人开发的核心基础概念,前者作为分布式状态总线实现传感器与执行器的数据协同,后者是以ALBroker为核心的中间件通信框架,支撑跨语言、松耦合的模块化控制。其技术价值在于将嵌入式硬件能力抽象为标准化服务接口,使开发者无需关注底层驱动即可调用TTS、运动、视觉等能力。典型应用场景包括教育机器人编程、服务机器人行为编排及科研平台快速原型验证。而实际工程中,95%的‘连接失败’并非网络问题,而是Choregraphe客户端SDK、NAOqi Runtime固件、Python运行 阅读详情

相关推荐

Mythos安全大模型:重构漏洞挖掘与防御闭环的AI新范式

大模型在网络安全领域的应用正从辅助分析迈向自主攻防闭环。其核心原理在于将传统NLP能力升级为‘推理深度×行动闭环’耦合架构,融合符号执行、内存建模与强化学习,实现从漏洞识别到可运行exploit生成的端到端自动化。该技术显著提升安全响应效率与精准度,支撑CTF演练、红蓝对抗、SOC实时响应及关键基础设施加固等多元场景。尤其在SWE-bench Pro和CyberGym等权威基准上展现突破性表现,标志着AI驱动的安全能力进入工程可用新阶段。

congli3478的博客 474

TCP/IP学习笔记-TCP协议

普普通通的学习TCP/IP协议的学习笔记

Mr___Blue的博客 2494

Mac本地部署OpenClaw:AI工具链调度器实战指南

AI工具链调度器是一种面向开发者的技术范式,用于统一编排本地运行的多个AI服务(如Ollama、Llama.cpp、FastAPI接口),其核心原理是通过声明式配置(YAML)定义技能(Skill)并按需路由请求。该架构不训练模型、不托管LLM,强调环境隔离与可编程性,技术价值在于实现模型无关、平台中立、可版本控制的AI能力集成。典型应用场景包括私有代码助手、企业知识库问答流水线、多模型协同推理等。本文聚焦macOS平台下基于Docker的OpenClaw部署实践,深入解析virtualization支持验

weixin_34319817的博客 385

TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束

首先回顾一下TCP标志位的具体含义。 TCP Flag标志位(控制位) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header Length公用)。 12bit中前三个bit是保留,默认为全0: 000. .... .... = Reserved: Not set 第4个bit为: ...0 ......

answer3lin的博客 2万+

序列化/反序列化与TCP通信协议

序列化/反序列化, 协议, tcp

li_peixiansang的博客 1114

国产麒麟系统下用Rider开发C#桌面应用:从环境配置到Avalonia UI实战

本文详细介绍了在国产麒麟系统上使用JetBrains Rider开发C#桌面应用的完整流程,重点讲解了Avalonia UI框架的实战应用。从环境配置、Rider安装到Avalonia项目创建和UI开发技巧,全面覆盖了在非Windows环境下进行C#开发的关键步骤和优化建议,助力开发者高效构建跨平台桌面应用。

weixin_27791839的博客 387

Wireshark 提示和技巧 | TCP 会话完整性分析

Wireshark 提示和技巧 | TCP 会话完整性分析

7ACE的博客 7407

NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

以上内容详细介绍了,使用NRF24L01实现1对1单向通讯、1对1双向通讯、1对多双向通讯。

Joseph Wen的博客 7388

图解TCP三次握手:一步步构建网络会话

在互联网通信中,确保数据传输的可靠性至关重要。TCP三次握手的过程正是为了解决这一问题而设计的。在建立连接之前,客户端和服务器需要确认彼此的存在与准备状态,以防止因网络延迟或数据丢失而导致的错误。通过三次握手,双方不仅能够同步序列号,还能有效地建立稳定的通信链路,从而保证后续数据传输的顺利进行。

didiplus 2073

血管分割中的直径平衡难题:从clDice到cbDice的演进与实践

本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。

weixin_29170327的博客 239

车辆横向控制MPC实战:从‘老王模型’到CasADi求解的保姆级避坑指南

本文详细解析了车辆横向控制MPC的实战应用,从经典动力学模型选择到CasADi求解器的优化配置,提供了一套完整的避坑指南。重点介绍了车辆动力学模型的验证要点、CasADi环境的高效配置技巧以及MPC问题建模的核心要素,帮助开发者快速实现稳健的横向控制方案。

weixin_42524499的博客 346

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452

人形机器人数据采集:高吞吐、低延迟、强鲁棒的工程实践

人形机器人数据采集是面向真实物理世界的多模态感知数据获取过程,其核心在于解决高带宽(>200MB/s)、微秒级时间同步(<50μs)、持续写入稳定性与电磁兼容性等复合挑战。原理上需融合嵌入式实时系统、传感器融合时序对齐、NVMe存储热管理及硬件级时间锚点等关键技术;技术价值体现在保障原始数据完整性与时空一致性,避免因温控失效、USB干扰或时间戳漂移导致的TB级数据失效;典型应用场景包括双足步态优化、家庭环境语义理解与多模态大模型预训练;本文聚焦15天8.5TB实采项目中暴露的SSD散热瓶颈、PTP同步失准、

397

《手把手教你玩转RTOS操作系统》专栏简介

《手把手教你玩转RTOS操作系统》专栏系统讲解实时操作系统开发,以FreeRTOS为主线,结合RT-Thread和Zephyr对比分析。内容涵盖RTOS基础、任务管理、通信机制、中断处理等核心知识,并配套STM32/ESP32平台实战项目。专栏特色在于零基础友好、实战驱动、多系统对比和行业趋势分析,适合嵌入式开发者进阶RTOS开发能力,解决实际项目中的选型与优化问题。通过完整学习路径,读者可掌握构建高可靠性嵌入式系统的关键技能。

MHD0815的博客 530

windows中搭建sonic云真机环境/云真机环境搭建-基于docker容器部署

基于Windows系统搭建Sonic远程云真机环境实现通过浏览器操作手机端系统

雾林小妖的博客 1015

并行分布式框架:Celery、rq、funboost

Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。

freeking101的博客 5万+

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

一次正常的TCP/IP会话的过程

由于TCP是面向连接的协议,面向有连接是指在数据通信开始之前先做好两端之间的准备工作。 1、所以在双方正式传输数据之前,需要用“三次握手”来建立一个稳重的连接。所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都

bogumymy_2_2的博客 2013

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HCIA复习

本文系统介绍了计算机网络通信的核心技术体系。首先阐述了标准化通信的重要性,包括协议、数据格式、字符编码等7个方面的标准化。详细解析了OSI七层模型各层功能及TCP/IP四层协议簇的工作原理,重点说明了TCP三次握手/四次挥手机制、可靠传输保障(排序、确认、重传、流控)以及拥塞控制算法(慢启动、拥塞避免、快速恢复)。同时介绍了DHCP协议工作流程、ARP地址解析、交换机/路由器转发原理等关键技术,并对比了三层与二层网络架构特点。最后阐述了园区网设计中的冗余机制,包括线路、设备、网关等多层次的冗余保障方案。全文

2301_81350613的博客 682

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

TCP协议详解-三次握手、四次挥手

为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就好像语言不同的

RaphetS的博客 3069

tcp流与tcp会话

TCP三次握手成功完成,即可建立TCP会话。 同一个会话的的报文具有相同的四元组: 源IP 目的IP | 源TCP端口 目的TCP端口 称为一个socket。  同一个会话如果“|”前后的值对调也属于一个会话,只是来自不同方向 例如你Telnet到某台主机,这就是一次Telnet会话;你浏览某个网站,这就是一次HTTP会话。 即:一次应用层的业务过程:从tcp三次连接

程序狗的成长之路 5673

『网络协议攻防实验』TCP会话劫持攻击

前言 靶机1:seedubuntu 12.01,IP:192.168.199.137 靶机2:WindowsXP SP2,IP:192.168.199.135 攻击机:Kali-2020.4,IP:192.168.199.129 工具:ettercap 原理 TCP会话劫持目标是劫持通信双方已建立的TCP会话连接,假冒其中一方(通常是客户端)的身份,与另一方进行进一步通信。 TCP会话劫持攻击 Kali通过ARP欺骗成为中间人,从而通过截获TCP数据包,对seedubuntu和WinXP之间的TCP会话

Ho1aAs‘s Blog 6903

Linux入门真经-047TCP会话的建立与断开

  敲!黑!板!无论是大学计算机网络期末考试,还是网络/运维/技术支持乃至程序猿面试,这个问题都命中率极高。本篇文章会介绍TCP连接的建立与断开以及一些常用的TCP参数,不过,仅限于入门知识哈。   1、TCP头中的重要参数   seq与len:   TCP的传输是有序的,它为每一个数据段都标上了一个序号。因为传输距离的遥远和网络的庞大和复杂,先发出去的包未必就能先到达目的地,因...

TheMonkeyKing 1024

TCP/IP网络参考模型(端口号、TCP滑动窗口、TCP拥塞控制、IP协议号、以太网帧)

运行在MAC层之上在以太网链路上传输的数据包成为以太帧。 应用层常见协议——传输数据PDU 传输层协议——传输数据段 端口号 TCP面向连接服务CONS TCP报文格式 TCP数据传输——ACK确认机制 TCP会话建立——三次握手 TCP会话结束——四次握手 TCP流量控制——滑动窗口协议 TCP可靠传输机制 TCP拥塞控制UDP无面向连接服务DLNS 网络层协议——传输数据包 IP协议 数据链路层——传输数据帧 Ethernet_II帧格式 IEEE802.3帧格式

m0_49864110的博客 2万+

TCP--会话的终止

若要关闭连接,应设置数据段报头中的 FIN(结束) 控制标志。为终止每个单向 TCP 会话,需采用包含 FIN 数据段和 ACK 数据段的二次握手。因此,若要终止 TCP 支持的整个会话过程,需要实施四次交换,以终止两个双向会话。注意:在本部分中,为了更容易理解,采用了客户端和服务器端进行说明。实际上,终止的过程可以在任意两台完成会话的主机之间展开。 1. 当客户端...

weixin_33888907的博客 1061
上一篇: Linux相关概念和易错知识点(36)(TCP套接字编程、远程命令的实现)
下一篇: Linux相关概念和易错知识点(38)(对会话层和表示层的理解、网络计算器的实现)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值