Tcp协议特点

news2024/10/2 16:18:53

目录

确认应答(ACK)

超时重传

建立连接-三次握手

断开连接-四次挥手


Tcp特点主要是分为四点:有连接,可靠传输,面向字节流,全双工。

这里我们主要介绍可靠传输

确认应答(ACK)

确认应答是保证“可靠性”的最核心的机制。

接收方反馈一个应答报文(ACK),表示已经收到。

假设现在A想去B家里玩,于是A给B发消息,正确的顺序是:

但是网络传输比较复杂,可能会出现一种情况“先发后至”,由于数据的长度不同或者传输网络不同,先发的数据不一定先到达,接收方的数据可能是乱序的:

当B回复A的时候若存在对应的关系,那么即使出现“后发先至”的问题也会顺利的解答:

 

 上述方法,虽然可以解答出A的问题,但是额外信息比较多,比较占带宽,并且不能解决“活法先致”的问题。

所以我们就有一个新的解决方法:针对数据编号。

但是真实的TCP并不是按照上述情况进行编号的,由于TCP是面向字节流的,此处的编号并不是按照一条,两条进行编号的,而是按照字节来编号的。

确认应答是一种特殊的报文(ACK),所谓的应答报文,本质上就是字段为1的报文,此时报头中的“确认序号”字段才是生效的。

如果发送多个数据,每个数据都会带有一个序号,接收方收到数据之后,就知道数据所带的序号,根据序号给出的确认序号(告诉发送方下次给我发的序号),发送给发送方,发送方就知道接收方收到哪些数据。

                                               确认序号=开始序号+数据长度(字节)- 1

超时重传

确认应答是一种理想的情况,但是数据在开发的过程中就会出现丢包的情况

以上面的例子为例,当A给B发消息,你在家呢?但是等了好久,A还是没有收到B的回复消息,此时,就会出现三种情况:

  1. B不想会A的消息
  2. B没有收到A的消息(丢包情况1:发送请求丢失)
  3. B回复了A的消息,但是A没有收到(丢包情况2:应答的ACK丢失)

2、3情况:丢包的两种情况,对于发送方来说无法确定是哪种情况,因此,进行统一处理:当发送一条数据之后,TCP内部就会自动启动一个定时器,达到一定时间没有收到ACK,定时器就会自动触发重传消息的动作——超时重传

如果在数据重传的时候,又会出现一次丢包,这个时候的等待的时间就会比上一次短。

上述丢包的两种情况:

一种是请求丢失:重传没有问题

一种是ACK丢失:重传就意味着接收方收到了相同数据,TCP会在内部进行数据去重,保证应用层读到的数据不是重复数据

建立连接-三次握手

当A给B打电话的时候,打电话的时候同样要验证自己一起对方的话筒和自己的听筒是否正常

 

第一次握手: 刚开始,A 不知道自己和 B 手机的听筒和话筒是否正常,所以 A说"喂,你能听到吗?"
第二次握手: B 听到后,说明 A 的话筒和 B 的听筒正常,但 B 还需进一步检查自己的话筒和 A 的听筒是否正常;同时 B 把 A 话筒正常和自己听筒正常的消息传递给 A;于是 B “我能听到,你呢?”
第三次握手: A 收到 B 的消息后,就证明了 A 听筒正常,B 话筒正常

以上三次握手就保证A、B的听筒和话筒都是正常,也就保证了通话的正常,这就也是类似网络建立连接的三次握手

TCP中真实的建立连接过程:

第一次握手:客户端希望与服务器建立连接,因此它首先向服务器发送一个TCP报文段,其中包含SYN(同步)标志位。这个SYN标志位表示客户端希望建立连接,并在报文段中包含一个初始序列号(ISN),该序列号用于标识客户端发送的数据。

第二次握手:服务器收到客户端的SYN后,会确认客户端的请求。服务器向客户端发送一个TCP报文段,其中包含SYN和ACK(确认)标志位。服务器也会选择自己的初始序列号(ISN)。这个ACK用于确认客户端的SYN,并表示服务器已经准备好建立连接。

第三次握手:客户端收到服务器的SYN-ACK后,会发送一个带有ACK标志位的TCP报文段给服务器。这个ACK用于确认服务器的SYN,并表示客户端也已经准备好建立连接。同时,客户端也会发送自己的初始序列号。

建立连接的过程,相当于通信双方各自给对方发送 SYN,在各自给对方发送给 ACK,只不过中间的 ACK 和 SYN 合二为一了,于是最后就是"三次握手"。

断开连接-四次挥手

三次握手:双方各自向对方发起建立连接的请求,确保双方都明确知道对已准备好连接。

四次挥手:用于确保双方在终止连接之前完成数据传输,并且都明确知道对方已经准备好关闭连接。

 以打电话为例子:

TCP中真实的断开连接过程:

第一次挥手(客户端向服务器发送FIN)

  • 客户端决定关闭连接,因此向服务器发送一个TCP报文段,其中包含FIN(Finish)标志位。则合格FIN表示客户端已经完成数据发送,并请求关闭。客户端进入FIN_WAIT状态。

第二次挥手(服务器回复ACK):

  • 服务器收到客户端的FIN后,会发送一个确认ACK数据报作为响应,以确认它已经收到客户端的关闭请求,同时,服务器进入CLOSE_WAIT状态。

第三次挥手(服务器向客户端发送FIN):

  • 当服务器也决定关闭连接时,它会向客户端发送一个带有FIN标志位的TCP报文段,表示服务器已经完成数据发送并请求关闭连接。服务器1进入LAST_ACK状态。

第四次挥手(客户端回复ACK):

  • 客户端收到服务器的FIN后,会回复一个确认ACK,表示客户端已收到服务器的关闭请求,此时客户端进入TIME_WAIT状态,等待一段时间(通常是两倍的最大寿命,以确保服务器收到ACK),然后才最终关闭连接。

在客户端的TIME_WAIT状态结束后,连接关闭。服务器在发送FIN后等待一段时间,确认客户端收到FIN的ACK之后,连接终止。

四次挥手三次挥完不行呢?

通常是不可以的,即:上述2、3为什么没有合并在一起?

因为中间两次操作时机不一样,ACK是收到FIN之后立即由操作系统内核返回的数据报,告诉客户端收到了关闭的消息,而FIN是应用程序处理完接受缓冲区的数据之后,调用close方法触发的。

但是若出发了延时应答机制,就可以三次挥完。

 

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

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

相关文章

EasyFalsh移植使用方法

参考:https://blog.csdn.net/Mculover666/article/details/105510837 注意: 这里说的修改默认环境变量后修改环境变量版本号就自动重新写入到flash这句话是有问题的,要开启上面【#define EF_ENV_AUTO_UODATE】宏定义后才会实现该功能&#…

Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量,干脆写个笔记备忘个,也方便小伙伴们节省时间。 JDK安装与环境变量配置 1.官网下载jdk mac安装包: Java Downloads | Oracle " https://www.oracle.com/java/technologies/downloads…

携程网关的架构设计-日流量200亿

一、概述 类似于许多企业的做法,携程 API 网关是伴随着微服务架构一同引入的基础设施,其最初版本于 2014 年发布。随着服务化在公司内的迅速推进,网关逐步成为应用程序暴露在外网的标准解决方案。后续的“ALL IN 无线”、国际化、异地多活等…

【爬虫笔记】Python爬虫简单运用爬取代理IP

一、前言 近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来…

day 1

使用cut截取出Ubuntu用户的家目录,要求:不能使用":"作为分割 grep ^ubuntu /etc/passwd|cut -d / -f 2,3 xmind

芒果app逆向分析 (二)

接着上文,我们发现请求后的结果是加密的状态,我们需要解密成明文看数据。 前面提到无法使用frida,直接上xposed. 直接就hook出来了?? key = "xkSHHy5DQzYwbZS32zJBDyrHCHWMDGDk" iv = "4yXhd2Ta4m6dif54"堆栈记录下,方便后续使用: 调用堆栈:at ja…

网络技术十七:IP路由原理

IP路由原理 引入 路由器负责将数据报文在逻辑网段间进行转发 路由是指导路由器如何进行数据报文发送的路径信息 每台路由器都有路由表,路由存储在路由表中 路由环路是由错误的路由导致的,它会造成IP报文在网络中循环转发,浪费网络带宽 路…

mac项目流程管理 OmniPlan Pro 4中文 for Mac

OmniPlan Pro 4是一款专业的项目管理软件,提供了强大的项目流程管理功能,帮助用户规划、执行和监控项目的各个阶段和任务。 以下是OmniPlan Pro 4中的项目流程管理功能: 1. 项目计划:用户可以使用OmniPlan Pro 4创建项目计划。软…

SAP MM学习笔记27- 购买依赖(采购申请)

前面已经努力的学习了 购买发注,入库,请求书照合 等功能,还是蛮多内容的哈。 剩下的功能,比如 右侧的 所要量决定,供给元决定,仕入先选择 还没学。 从这章开始,要开始学习它们了。 这一章先来…

【案例分享】H3C设备配置端口镜像

简介 本案例介绍本地端口镜像的配置方法。 组网需求 某公司内部各部门使用不同网段的IP地址,其中研发部使用10.1.1.0/24网段,市场部使用12.1.1.0/24网段。现要求通过配置本地端口镜像功能,使用数据监测设备对研发部和市场部访问Internet的流…

java对接webservice接口的四种方式

这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的三种方式。 方式一:以HttpURLConnection的方式调用 String url "http://127.0.0.1/cwbase/Service…

【LeetCode】297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…

百度智能云千帆大模型丨未来人手必备的代码助手

文章目录 1. 前言2. 千帆大模型平台3. 十分友好的功能4. comate代码助手5. 总结 1. 前言 我之前给大家推荐过Poe这个网站,它用的人比较少,但一旦接触后会发现它其实挺强大的。 因为它是一个可以同时支持好几个大模型的在线聚合平台。常用的GPT4&#x…

idea:java: Compilation failed: internal java compiler error

java: Compilation failed: internal java compiler error错误 检查下面2个即可:

智能转码技巧大揭秘,轻松实现视频转码!

你是否曾经遇到过需要将视频进行转码,但却被繁琐的步骤和复杂的参数困扰?现在,我们教你如何巧用智能转码,让视频转码变得轻松简单! 首先第一步,我们要进入媒体梦工厂主页面,在板块栏里选择“智…

Debian11安装Geoserver+矢量插件Vector Tiles

呕心之作,小白教程 1 安装 Java 112 安装Geoserver2.1 安装2.2 设置自启动2.3 跨域问题 3 安装矢量插件 Geoserver的官网安装手册。 GeoServer需要 Java 8 或者 Java 11 环境 1 安装 Java 11 Debain默认安装 Java 11 版本,直接执行: # 确认…

保姆级别redis安装轻轻松松上手使用

Redis安装 Windows快速安装安装包下载安装 Windows快速安装 安装包下载 https://github.com/microsoftarchive/redis/tags安装 直接运行.msi的安装包,一直next,直到下面界面,勾选上再next 最后点击finish 进入计算机服务中(右键计算机–>管理–…

无涯教程-JavaScript - WORKDAY.INTL函数

描述 WORKDAY.INTL函数返回带有自定义周末参数的指定工作日数之前或之后的日期的序列号。周末参数指示哪些和多少天是周末。周末和指定为假期的任何日子均不视为工作日。 语法 WORKDAY.INTL (start_date, days, [weekend], [holidays])争论 Argument描述Required/OptionalS…

CVE-2023-35843:NocoDB任意文件读取漏洞复现

文章目录 NocoDB 存在任意文件读取漏洞CVE-2023-358430x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06修复建议 NocoDB 存在任意文件读取漏洞CVE-2023-35843 0x01 前言 本次测试仅供学习使用,如若非法他用&…

VMware 安装 黑群晖7.1.1-42962 DS918+

本例的用的文件 1、ARPL 1.0beat 引导文件 vmdk格式: https://download.csdn.net/download/mshxuyi/88309308 2、DS918_42962.pat:https://download.csdn.net/download/mshxuyi/88309383 一、引导文件 1、创建一个虚拟机 2、下一步,选稍后…