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

[C++ 网络协议编程] TCP/IP协议

目录

1. TCP/IP协议栈

2. TCP原理

2.1 TCP套接字中的I/O缓冲

2.2 TCP工作原理

2.2.1 三次握手(连接)

2.2.2 与对方主机的数据交换

2.2.3 四次握手(断开与套接字的连接)


TCP(Transmission Control Protocol传输控制协议):对数据传输过程的控制。

1. TCP/IP协议栈

 TCP/IP分为四层:

  1. 链路层(物理层):物理链接领域标准化的结果,专门定义LAN、WAN、MAN等网络标准,通俗点说就是,硬件之间的物理连接层
  2. IP层:IP层功能主要是确定传输数据的路径,但IP本身是面向消息,不可靠的,可能会发生数据丢失或错误的问题。
  3. TCP/UDP层(传输层):TCP则可以解决IP层数据丢失或错误的问题,赋予不可靠的IP协议可靠性。

    如图所示,是TCP简单的功能,会确认数据包是否到达。
  4. 应用层:程序员编写软件过程中,根据程序特点决定服务器端和客户端之间的数据传输规则。

2. TCP原理

2.1 TCP套接字中的I/O缓冲

问:如果服务器端一次性传输了40字节,而客户端却是通过4次read函数,每次读取10字节的方式来接收数据,那么当客户端第一次接收了10字节的数据,剩下30字节的数据去哪了呢?

答:剩下30节的数据都在I/O缓冲里。

实际上write函数调用后并不是马上进行数据传输的,read函数也不是马上进行数据读取的,而是如图:

总结:在write函数执行时,会先将数据,移动到输出缓冲里,在适当的时候,再将数据传送到对方的输入缓冲里,然后对方再通过read函数,从输入缓冲里读取数据。

I/O缓冲有如下特性:

  1. I/O缓冲在每个TCP套接字单独存在
  2. I/O缓冲在创建套接字时自动生成
  3. 即使关闭套接字也会继续传输输出缓冲中遗留的数据
  4. 关闭套接字丢失输入缓冲中的数据

问:如果客户端输入缓冲为50字节,服务器端却传输了100字节,那么会怎么办?

答:TCP会控制数据流,不会发生超过输入缓冲大小的数据传输

TCP中有滑动窗口协议,会在传输前,告知对方套接字,己方可以接收多少字节的数据。所以TCP不会因为缓冲溢出而丢失数据

write函数返回的时间点:

        write函数和Windows的send函数,不会在完成向对方主机的数据传输时返回,而是在数据移动到输出缓冲时就返回。然后TCP会保证对输出缓冲中数据的传输。

2.2 TCP工作原理

以下原理,保证了TCP的数据传输是可靠的,有序的,基于连接的。

2.2.1 三次握手(连接)

套接字是以全双工方式工作的,也就是说,它可以双向传输数据

以上可以解释成如下:

SYN(Synchronization):表示收发数据传输的同步消息。

ACK:命令正确应答;确认字符(acknowledgement character)。

SEQ:序列。

收发数据前,向数据包分配序号,并向对方通报此序号, 这样可以在数据丢失时马上查看并重传丢失的数据包,防止数据丢失。

三次握手后,主机之间彼此就绪,准备数据交换。

2.2.2 与对方主机的数据交换

主机A向主机B发送100个字节的数据,数据包的序号为1200,主机B回复给主机A,序号为1301的数据包ACK应答,为什么是序号为1301的数据包?

因为:ACK号=SEQ号+传递的字节数+1这样如果ACK号不是1200+100+1=1301的话,那么久说明,传递的字节数有丢失,就可以通知对方重传,加一是为了告知对方下次要传递的SEQ号。

这之间如果发生了错误,如图:

当主机A发送SEQ1301给主机B时,主机B没有接收到,不会发送ACK应答,主机A过了一段时间没有接收到主机B传来的应答,那么就会重传。主机A的TCP套接字会启动计时器等待ACK应答,如果超时,则重传。

2.2.3 四次握手(断开与套接字的连接)

FIN:断开连接,双方各发送一次FIN消息后断开连接。

含义和上述三次握手的差不多,这里主机B向主机A传递了两次ACK5001是因为,主机B向主机A发送第一次ACK后,会等待一段时间,看主机A是否还有数据要传给主机B,没有了,则会传递第二次ACK数据,并设置FIN消息。

相关文章:

[C++ 网络协议编程] TCP/IP协议

目录 1. TCP/IP协议栈 2. TCP原理 2.1 TCP套接字中的I/O缓冲 2.2 TCP工作原理 2.2.1 三次握手(连接) 2.2.2 与对方主机的数据交换 2.2.3 四次握手(断开与套接字的连接) TCP(Transmission Control Protocol传输控…...

Unity用NPOI创建Exect表,保存数据,和修改删除数据。以及打包后的坑——无法打开新创建的Exect表

先说坑花了一下午才找到解决方法解决, 在Unity编辑模式下点击物体创建对应的表,获取物体名字与在InputText填写的注释数据。然后保存。创建Exect表可以打开,打包PC后,点击物体创建的表,打不开文件破损 解决方法&#…...

记一次fegin调用的媒体类型问题

1.问题:分页查询,分页参数传递不生效 2.开发环境:fegin接口 开发环境:调用接口 3.修改后:fegin接口不变 调用接口 前端媒体类型: 问题解决!!! 4.原因分析&…...

在Hive/Spark上运行执行TPC-DS基准测试 (ORC和TEXT格式)

目前,在Hive/Spark上运行TPC-DS Benchmark主要是通过早期由Hortonworks维护的一个项目:hive-testbench 来完成的。本文我们以该项目为基础介绍一下具体的操作步骤。不过,该项目仅支持生成ORC和TEXT格式的数据,如果需要Parquet格式,请参考此文《在Hive/Spark上执行TPC-DS基…...

如何仿写简易tomcat 实现思路+代码详细讲解

仿写之前,我们要搞清楚都要用到哪些技术 自定义注解,比如Tomcat使用的是Servlet,我们可以定义一个自己的MyServlet构造请求体和返回体,比如tomcat使用HttpRequest,我们可以自己定义myHttpRequestjava去遍历一个指定目…...

如何提高深度学习性能

可用于 对抗过度拟合并获得更好泛化能力的20 个提示、技巧和技术 如何从深度学习模型中获得更好的性能? 这是我最常被问到的问题之一。 可能会被问为: 如何提高准确率? ……或者可以反过来说: 如果我的神经网络表现不佳该怎么办? 我经常回答说:“我不太清楚,但我有很…...

ECMAScript版本对比:从ES1到ES2021

引言 ECMAScript(简称ES)是一种用于编写Web前端JavaScript的标准化语言。自1997年发布第一版(ES1)以来,ECMAScript已经经历了多个版本的更新和演进。每个版本都引入了新的语法和功能,为开发人员提供了更强…...

设计HTML5表格

在网页设计中,表格主要用于显示包含行、列结构的二维数据,如财务表格、调查数据、日历表、时刻表、节目表等。在大多数情况下,这类信息都由列标题或行标题及数据构成。本章将详细介绍表格在网页设计中的应用,包括设计符合标准化的…...

神经网络基础-神经网络补充概念-60-卷积步长

概念 在深度学习中,卷积步长(convolution stride)是指在卷积操作中滑动卷积核的步幅。卷积操作是神经网络中常用的操作之一,用于从输入数据中提取特征。步长决定了卷积核在输入数据上的滑动间隔,从而影响输出特征图的…...

怎么开通Tik Tok海外娱乐公会呢?

TikTok作为全球知名的社交媒体平台,吸引了数亿用户的关注和参与。许多公司和个人渴望通过开通TikTok直播公会进入这一领域,以展示自己的创造力和吸引更多粉丝。然而,成为TikTok直播公会并非易事,需要满足一定的门槛和申请找cmxyci…...

Java接口压力测试—如何应对并优化Java接口的压力测试

导言 在如今的互联网时代,Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量,用户体验将受到严重影响,甚至可能导致系统崩溃。因此,了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…...

Coremail参与编制|《信创安全发展蓝皮书——系统安全分册(2023年)》

信创安全发展蓝皮书 近日,Coremail参与编制的《信创安全发展蓝皮书—系统安全分册(2023年)》重磅发布。 此次信创安全发展蓝皮书由工业和信息化部电子第五研究所联合大数据协同安全技术国家工程研究中心重磅共同发布。 本次蓝皮书涵盖信创系…...

分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

文章目录 1. Kafka 消费者消费消息01. 创建消费者02. 订阅主题03. 轮询拉取数据 2. Kafka 消费者参数配置01. fetch.min.bytes02. fetch.max.wait.ms03. fetch.max.bytes04. max.poll.records05. max.partition.fetch.bytes06. session.timeout.ms 和 heartbeat.interval.ms07.…...

批量爬虫采集大数据的技巧和策略分享

作为一名专业的爬虫程序员,今天主要要和大家分享一些技巧和策略,帮助你在批量爬虫采集大数据时更高效、更顺利。批量爬虫采集大数据可能会遇到一些挑战,但只要我们掌握一些技巧,制定一些有效的策略,我们就能在数据采集…...

Springboot 实践(7)springboot添加html页面,实现数据库数据的访问

前文讲解,项目已经实现了数据库Dao数据接口,并通过spring security数据实现了对系统资源的保护。本文重点讲解Dao数据接口页面的实现,其中涉及页面导航栏、菜单栏及页面信息栏3各部分。 1、创建html页面 前文讲解中,资源目录已经…...

Go中带标签的break/continue以及goto的差别

带标签的 continue: 直接跳到标签所标记的最外层循环的下一个迭代,忽略当前迭代剩余的代码。 带标签的 break: 直接跳出标签所标记的最外层循环,继续执行该循环之后的代码。 goto 关键字 goto 可以无条件地跳转到程序中指定的标…...

SaaS当然是一门好生意了啊

(1)SaaS关键特征 1、应用架构:多租户 2、部署:公有IaaS部署 3、商业模式:年度订阅续费 (2)用户云注册、用户在线付费 用户云注册、用户在线付费,站在中国乙方利益视角,多…...

ZooKeeper单机服务器启动

ZooKeeper服务器的启动,大体可以分为以下五个主要步骤:配置文件解析、初始化数据管理器、初始化网络I/O管理器、数据恢复和对外服务。下图所示是单机版ZooKeeper服务器的启动流程图。 预启动 预启动的步骤如下。 (1)统一由QuorumPeerMain作为启动类。 …...

Jenkins自动发送飞书消息

前言 公司办公软件用的是飞书套壳,本文主要介绍如何通过飞书机器人发送Jenkins构建的进度和消息。 方法 前置条件 创建一个飞书机器人搭建好Jenkins创建好构建任务 过程 根据飞书开发者平台的接口文档,用shell脚本封装一套调用飞书机器人发送消息接…...

Centos 7 出现 write error (disk full?)

问题 mysql 导入任务时,由于导出的 sql 文件是在很大 (30G),利用 SQLDumpSpliter 切割工具 切成几个 1G 大小的 sql 文件 结果在导入大半天,突然报错 (另一个服务器上更惨,都导入两天快完成的…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...