[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消息。

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

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

相关文章

无涯教程-Perl - ref函数

描述 如果EXPR为引用,则此函数返回真值;如果未提供EXPR,则为$_。返回的实际值还定义了引用所引用的实体的类型。 内置类型为- REFSCALARARRAYHASHCODEGLOBLVALUEIO::Handle 如果使用bless()函数为变量设置了祝福,则将返回新的数据类型。新的数据类型通常将是一个…

大数据-玩转数据-Flink 自定义Sink(Mysql)

一、说明 如果Flink没有提供给我们可以直接使用的连接器,那我们如果想将数据存储到我们自己的存储设备中,mysql 的安装使用请参考 mysql-玩转数据-centos7下mysql的安装 创建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

4个简化IT服务台任务的ChatGPT功能

最近几个月,ChatGPT 风靡全球,这是一个 AI 聊天机器人,使用户能够生成脚本、文章、锻炼图表等。这项技术在各行各业都有无穷无尽的应用,在本文中,我们将研究这种现代技术如何帮助服务台团队增强服务交付和客户体验。 什…

最佳实践:如何优雅地提交一个 Amazon EMR Serverless 作业?

《大数据平台架构与原型实现:数据中台建设实战》一书由博主历时三年精心创作,现已通过知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详…

章节7:XSS检测和利用

章节7&#xff1a;XSS检测和利用 测试payload <script>alert(XSS)</script> <script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> &qu…

golang—面试题大全

目录标题 sliceslice和array的区别slice扩容机制slice是否线程安全slice分配到栈上还是堆上扩容过程中是否重新写入go深拷贝发生在什么情况下&#xff1f;切片的深拷贝是怎么做的copy和左值进行初始化区别slice和map的区别 mapmap介绍map的key的类型map对象如何比较map的底层原…

《Java极简设计模式》第03章:工厂方法模式(FactoryMethod)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

腾讯云标准型CVM云服务器详细介绍

腾讯云CVM服务器标准型实例的各项性能参数平衡&#xff0c;标准型云服务器适用于大多数常规业务&#xff0c;例如&#xff1a;web网站及中间件等&#xff0c;常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格&#xff0c;腾讯云服务器网来详细说下云服务器CVM标准…

NAS搭建指南一——服务器的选择与搭建

一、服务器的选择 有自己的本地的公网 IP 的请跳过此篇文章按需求选择一个云服务器&#xff0c;目的就是为了进行 frp 的搭建&#xff0c;完成内网穿透我选择的是腾讯云服务器&#xff0c;我的配置如下&#xff0c;仅供参考&#xff1a; 4. 腾讯云服务器官网地址 二、服务器…

day9 10-牛客67道剑指offer-JZ66、19、20、75、23、76、8、28、77、78

文章目录 1. JZ66 构建乘积数组暴力解法双向遍历 2. JZ19 正则表达式匹配3. JZ20 表示数值的字符串有限状态机遍历 4. JZ75 字符流中第一个不重复的字符5. JZ23 链表中环的入口结点快慢指针哈希表 6. JZ76 删除链表中重复的结点快慢指针三指针如果只保留一个重复结点 7. JZ8 二…

gitblit-使用

1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”&#xff0c;然后点击图中“创建版本库” 填写名称和描述&#xff0c;注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…

使用IIS服务器部署Flask python Web项目

参考文章 ""D:\Program Files (x86)\Python310\python310.exe"|"D:\Program Files (x86)\Python310\lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor参考文章 请求路径填写*&#xff0c;模块选择FastCgiModule&…

一键部署 Umami 统计个人网站访问数据

谈到网站统计&#xff0c;大家第一时间想到的肯定是 Google Analytics。然而&#xff0c;我们都知道 Google Analytics 会收集所有用户的信息&#xff0c;对数据没有任何控制和隐私保护。 Google Analytics 收集的指标实在是太多了&#xff0c;有很多都是不必要的&#xff0c;…

Multi-object navigation in real environments using hybrid policies 论文阅读

论文信息 题目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 来源&#xff1a;CVPR 时间&#xff1a;2023 Abstract 机器人技术中的导航问题通常是通过 SLAM 和规划的结合来解决的。 最近…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

pytest 编写规范

一、pytest 编写规范 1、介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b;2、支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b;3、能够…

差分升级在物联网水表上的实现与应用(学习)

摘要 当越来越多的物联网水表加入抄表系统后&#xff0c;实现了水表数据的信息化&#xff0c;并且当水表终端需要技术更新时&#xff0c;通过网络方式来升级产品可以高效修复设备面临的问题&#xff0c;减少用户损失&#xff0c;降低维护成本&#xff0c;但同时也对有限的网络…

遍历集合List的五种方法以及如何在遍历集合过程中安全移除元素

一、遍历集合List的五种方法 测试数据 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循环 普通for循环&#xff0c;通过索引遍历 for (int i 0; i < list.size(); i) {Syst…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

NLP语言模型概览

语言模型结构分类 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…