Tcp是怎样进行可靠准确的传输数据包的?

概述

很多时候,我们都在说Tcp协议,Tcp协议解决了什么问题,在实际工作中有什么具体的意义,想到了这些我想你的技术会更有所提升,Tcp协议是程序员编程中的最重要的一块基石,Tcp是怎样进行可靠准确的传输数据包的呢?

看过很多文章里都提到过Tcp协议的三次握手,在这里我要进行系统的整理一下,学习不能人云亦云,要真的去明白其中的道理,下面是一张理解Tcp/Ip的协议图。

请在此添加图片描述

Tcp三次握手

搞懂这个问题首先要知道什么是连接? 用于保证可靠性和流控制机制的信息,包括 Socket、序列号以及窗口大小叫做连接。RFC793

建立 TCP 连接就是通信的双方需要三种信息达成共识(初始化 Sockets、窗口大小、初始序列号),连接中的一对 Socket 是由互联网地址标志符和端口组成的,窗口大小主要用来做流控制,最后的序列号是用来追踪通信发起方发送的数据包序号,接收方可以通过序列号向发送方确认某个数据包的成功接收。

原因:

  • 通过三次握手才能阻止重复历史连接的初始化;
  • 通过三次握手才能对通信双方的初始序列号进行初始化;
  • 讨论其他次数握手建立连接的可能性;

为什么TIME-WAIT状态必须等待2MSL的时间?

  • 为了保证客户端发送的最后一个ACK报文段能够达到服务器。 这个ACK报文段可能丢失,因而使处在LAST-ACK状态的服务器收不到确认。服务器会超时重传FIN+ACK报文段,客户端就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重启计时器。最好,客户端和服务器都正常进入到CLOSED状态。如果客户端在TIME-WAIT状态不等待一段时间,而是再发送完ACK报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK报文段,因而也不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED状态。
  • 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK确认报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

tcp协议是怎么保证数据准备可靠的

Tcp协议再实际应用中主要是思想朴素而深刻,主要解决的数据包的可靠准确的传递,Tcp协议是怎么做到可靠准确的传送数据包呢?

1.解决不丢包问题:Ack + 重试

网络丢包是一定会出现的,对上层应用来说,只有一个办法就是不停的重发,服务器每次收到一个包,就要对客户端进行确认,反馈给客户端已经收到了数据包,如果客户端在超时时间内没有收到Ack,则重发数据。

在确认的时候,Ack每个数据包都要一一确认,效率太低了,客户端对发送的每个数据包编一个号,编号由小到大单调递增,基于编号就能进行确认。

2.解决不重的问题

因为只要超过了约定时间,客户端还没有收到服务器的确定,客户端就会重发,顺序Ack,服务器给客户端回复Ack=6,意思是所有小于等于6的数据包都收到了,之后凡在收到这个范围的数据包,则判定为重复的包,服务器收到后丢弃即可。

3.解决时序错乱的问题

假设服务器收到了数据包1,2,3,回复客户端(Ack=3),之后接收到5,6,7,而数据包4迟迟没有收到,这个时候怎么办呢?

服务器会把数据包5,6,7暂时存放,直到数据包4的到来,再给客户端回复Ack=7,如果数据包不来,服务器的Ack进度会一直停在那(保持Ack=3),等客户端超时,会把数据包4,5,6,7,全部重新发送,这样服务器收到了数据包4,回复ack=7,同时数据包5,6,7重复了,通过上面说的判重的办法,丢弃到上面的5,6,7。

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

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

相关文章

仓储13代电子标签接口文档

一、电子标签标签注册 通过手动触发电子标签注册到系统,注册成功就可以进行功能测试。 1、仓储13代注册 用磁铁靠近标签右上角(灯珠上侧) ​注册成功显示rssi:-xxdB如下: ​绝对值越小信号越差,一般0 ~ -75dB都可以正常通讯 二、查询电子标…

鉴源论坛·观模丨形式化方法的工业应用:轨交领域

作者 | 王依玲 上海控安可信软件创新研究院系统建模组 版块 | 鉴源论坛 观模 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 引言:前面几期文章介绍了形式化方法的发展历史和具体技术,并从整体的角度介绍了形式化方法的工程化。本…

24届华东理工大学近5年自动化考研院校分析

今天给大家带来的是华东理工大学控制考研分析 满满干货~还不快快点赞收藏 一、华东理工大学 学校简介 华东理工大学原名华东化工学院,1956年被定为全国首批招收研究生的学校之一,1960年起被中共中央确定为教育部直属的全国重点大学&#…

U盘删除的文件如何恢复?只需要这3个方法!

“谁来救救孩子啊!u盘里好多重要的文件,不小心被弟弟全部删除了,u盘里删除的文件还能不能恢复呀?快给我出出主意吧,感谢大家!” 随着u盘的使用越来越频繁,很多朋友会将重要的文件都保存在u盘里。…

PowerDesigner数据库设计工具使用笔记

简单记录下这个数据库设计工具的使用,在开发中设计数据库过程用得上,好记性不如烂笔头Q 显示窗口 工具类View >ToolBox 即可 选择数据库SQL语句类型是MySQL还是Orale以及版本 顶部栏中的Database 选中 第一个选项 change current DBMS 更改SQL…

Linux 中使用 verdaccio 搭建私有npm 服务器

安装 Node Linux中安装Node 安装verdaccio npm i -g verdaccio安装完成 输入verdaccio,出现下面信息代表安装成功,同时输入verdaccio后verdaccio已经处于运行状态,当然这种启动时暂时的,我们需要通过pm2让verdaccio服务常驻 ygiZ2zec61wsg…

jupyter文档转换成markdown

背景 上一篇文章**《如何优雅地用python生成模拟数据》**我就使用jupyter写的,这个真的是万能的,可以插入markdown格式的内容,也可写代码,关键是像ipython一样,可以分步执行。 我可以这样自由的写我的博客内容&#x…

不用手动编程!ChatGPT帮你轻松实现单片机按键输入功能

从今年年初,OpenAI发布的ChatGPT已摧古拉朽之势席卷全球,短短两个月注册用户数就超过1亿人,是全世界增长速度最快的应用。很多人都说今年是AI元年,其实也是有一定道理的,之前的AI门槛相对较高,很多人没有机…

我的Python教程:使用Pyecharts画关系节点图

示例源码1 from pyecharts import options as opts from pyecharts.charts import Graphnodes [{"name": "结点1", "symbolSize": 10},{"name": "结点2", "symbolSize": 20},{"name": "结点3&qu…

Java实现Google cloud storage 文件上传,Google oss

storage 控制台位置 创建一个bucket 点进bucket里面,权限配置里,公开访问,在互联网上公开,需要配置角色权限 新增一个访问权限 ,账号这里可以模糊搜索, 角色配置 给allUser配置俩角色就可以出现 在互联…

APT60DQ20BG-ASEMI快恢复二极管APT60DQ20BG

编辑:ll APT60DQ20BG-ASEMI快恢复二极管APT60DQ20BG 型号:APT60DQ20BG 品牌:ASEMI 封装:TO-3P 恢复时间:≤35ns 正向电流:60A 反向耐压:200V 芯片个数:双芯片 引脚数量&…

SQL server 与 MySQL count函数、以及sum、avg 是否包含 为null的值

sql server 与 mysql count 作用一样。 count 计算指定字段出现的个数, 不是计算 null的值 获取表的条数 count(n) n:常数 count(1),count(0)等 count(*) count(字段) 其中字段为null 不会统计在内。 avg(字段)、sum(字段) 跟count(字段)…