浅谈TCP协议的可靠含义和三次握手

        这里不过多阐述计算机网络的体系结构,本文主要是想阐述三次握手和可靠连接之间的联系。TCP协议全称传输控制协议(Transmission Cotrol Protocol)。

1、TCP协议运行在哪一层

        TCP运行在运输层。
2、TCP协议的可靠是什么意思
        步入主题,很多同学的回答是TCP三次握手确保了可靠连接,这样说非常不严谨,这个可靠并不是说因为三次握手所以建立起的这个连接是可靠的,三次握手只是建立连接的一个方式,可靠的意思是说TCP协议中的各种机制使得其建立连接后的信道是可靠的,更严谨的说,是能确保这个信道数据的传输是可靠的。
2.1、其中的面向连接是什么意思
        意思是说TCP传输数据需要先建立连接,数据传输完毕要释放连接,就像通信双方中间建立了一条无形的物理连接一样(逻辑信道)。
        那通信双方是谁呢,在计算机中,叫套接字(socket)(对应的,Linux有Socket Statistics,简称ss命令可以查看本机网络连接),写法是IP地址:端口号,相当于两个端点之间建立了一条连接,如192.168.1.1:8000---192.168.1.2:8000(所以一个端点可能有不同的几条连接)。
2.2、可靠的保证
        前面提到,TCP的可靠是由其中各种机制保证的。那不妨想下,两个人通信可能会出现什么问题?例如在课堂上,A写了张纸条丢给B,那B可能收到了纸条,B也可能没有,B收到了纸条又可能存在什么问题?B收到了,但A不知道B收到了(假设A无法看见B是否捡起了纸条),B收到了但是A给定纸条上的信息有错误...,等等一系列情况,TCP的各种机制就是确保这些情况不会影响数据传输的(所以可以想一下,TCP相比UDP是比较耗时复杂的,因为它为了确保可靠传输多做了很多工作)。
        本篇文章主要为了说明可靠传输并不仅仅是三次握手实现的,因此只简单例举几种情况和几种相应的机制。例1,怎么确认B收没收到?所以TCP协议中会有停止等待机制,即每发送一个分组,等待对方的确认再继续发送。例2,等多久?B没收到怎么办?所以TCP协议有个超时重传机制,即每次发送完分组,会开始计时,规定时间内没收到确认会重发。
        上述只是简单的介绍两个确保可靠传输的机制,从上述例子中,可以再想一下,怎么知道这个分组发过了?分组是否要编号?多长时间重发?检查到分组数据有错误怎么办?数据传输效率怎么样?这就是可以继续深入的问题了。
3、可以说TCP的三次握手就能确保信道可靠的吗
        是不能的,有一个经典的问题,即蓝军通信问题。蓝军1和蓝军2需要协同作战对抗白军,现在蓝军1需要把命令传给蓝军2,假设蓝军1将作战信息发送给蓝军2,此时蓝军2收到信息并回复“蓝军2已收到”,但蓝军2并不知道蓝军1是否收到“蓝军2已收到”信息,假设蓝军1收到“蓝军2已收到”,那蓝军1,2有百分百把握执行作战信息吗,其实是没有的,需要蓝军1再发一次“蓝军1对信息-蓝军2已收到,已收到”给蓝军2。
        不难发现,双发永远无法确保自己发的最后一条信息是否被对方接收,这里的关键是知道最后一条信息是否被对方收到,三次握手也同理,那三次握手解决了这个问题吗,其实是没有的,下面是三次握手图解(摘自《计算机网络第七版》)。

        图示中SYN(同步)和ACK(确认)均是TCP报文段中的首部字段,简单来说步骤是服务器等待连接,客户端随机选择序号是x的分组(数据会被拆成一个个分组,并且编好序号)传给服务器,服务收到后把ack置为x+1,并且发送自己的序号是y的数据,客户端收到后ack=x+1后,知道x收到了,接着把x+1的发送给服务器,由此交换三次报文就算建立连接了,所以三次握手并没有解决最后一条信息问题,只是说确认双方存在建立了条连接罢了。换句话说,这里并不关注最后一条信息,只保证接收到当前数据并且发送下条数据。
        总结,下面就回到开头那句‘更严谨的说,是能确保这个信道数据的传输是可靠的’了,TCP各种机制是确保了数据(每一个分组)被正确接收,就像即使是一条保护的很好的物理线路,也不能保证这条线路永远不会损坏,但是协议得知道数据有没有传过去,是不是传对了等等。

        PS:有基本的概念后,再去学习运输层,就会明白很多了,例如为了解决前面那些问题的超时重传,选择确认等机制等的具体实现。

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

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

相关文章

maven异常记录-must be unique

maven 打包异常记录 我们可以看看一个重要的异常: dependencies.dependency.(groupId:artifactId:type:classifier) must be unique: org.springframework.boot:spring-boot-starter-test 经过检查pom文件 果然是spring-boot-starter-test引用重复,平…

rocketMQ-Dashboard安装与部署

1、下载最新版本rocketMQ-Dashboard 下载地址:https://github.com/apache/rocketmq-dashboard 2、下载后解压,并用idea打开 3、修改配置 ①、修改端口及rocketmq服务的ip:port ②、修改访问账号、密码 3、然后启动访问: 4、mav…

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 刷题https://leetcode.cn/problems/trim-a-binary-search-tree/description/文章讲解https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html视频讲解https://www.bilibili.com/video/BV17P41177ud/?sh…

8.2 新特性 - 透明的读写分离

文章目录 前言1. 安装部署1.1 下载安装包1.2 MySQL Shell1.3 配置 MySQL 实例1.4 启动 ReplicaSet1.5 启动 8.2 Router 2. 测试路由总结 前言 MySQL 8.0 官方推出过一个高可用方案 ReplicaSet 主要由 Router、MySQL Shell、MySQL Server 三个组件组成。 MySQL Shell 负责管理…

【.NET Core】C#编程规范

【.NET Core】C#编程规范 文章目录 【.NET Core】C#编程规范一、概述1.1 结构清晰第一1.2 简洁之风1.3 代码风格保持一致性 二、命名约定三、类型参数命名指南3.1 请使用描述性名称命名泛型类型参数,除非单个字面名称完全具有自我说明性且描述性名称不会增加任何作用…

C++寒假打卡2.19

题目列表 #字母转换 难度系数 ⭐ (送分) #数位求和 难度系数 ⭐⭐ (几乎也是送分) #分糖果 难度系数 ⭐⭐⭐ #猴子摘桃 难度系数 ⭐⭐⭐ (板字题) #最大值 难度系数 ⭐⭐⭐⭐…

设计模式三:工厂模式

工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式,其中后两者属于23中设计模式 各种模式中共同用到的实体对象类: //汽车类:宝马X3/X5/X7;发动机类:B48TU、B48//宝马汽车接口 public interface BMWCar {void s…

Bert基础(一)--transformer概览

1、简介 当下最先进的深度学习架构之一,Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络,并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

2024全年放假日历表及调休安排 用手机便签设置放假倒计时

对于绝大多数的上班族来说,春节长假已经结束,现在要回归到正常的工作和生活中。为了给生活增加一些“盼头”,很多小伙伴不约而同打开手机日历,查看下个法定节假日是什么时候。下面给大家具体讲一下2024全年放假日历表及调休安排&a…

UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里 1.在MyPawn头文件里,加上摇臂和相机组件 #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" 2.在Pawm里声明SceneComponet,SpringArmComponent,CameraComponent组件…

Excel生成不重复的UUID

第一步:在单元格中使用函数 第二步:下拉批量生成 生成函数如下: CONCATENATE(DEC2HEX(RANDBETWEEN(0,4294967295),8),DEC2HEX(RANDBETWEEN(0,42949),4),,DEC2HEX(RANDBETWEEN(0,42949),4),DEC2HEX(RANDBETWEEN(0,42949),4),DEC2HEX(RANDBETW…

Unity MVC开发模式与开发流程详解

在Unity游戏开发中,采用MVC(Model-View-Controller)模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller&#x…

vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度

目录 思路 安装css-color-function【接收一个颜色值,生成不同的透明度】 获取后台配置的主题色或者使用ColorPicker修改主题色 最终结果如下 思路 本篇文章的主体思路是从element Plus官网引申而来。结合了我以前用vue2element-ui配置主题色生成透明度&#x…

谈谈:你在工作中用到的设计模式!

谈谈:你在工作中用到的设计模式! Hello大家龙年好! 春节的假期转眼间过去,我们也要回归往日的节奏 因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生, 在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这…

体验即王道:提升B端管理系统用户体验的10大法则

大家好,我是贝格前端工场,专注于前端开发和UI设计,有需求可以私信。本篇从用户体验角度来分析管理系统如何设计和开发。 一、用户体验的重要性 B端管理系统的用户体验对于企业的成功至关重要。 提高工作效率:一个好的用户体验可…

什么是网络安全?一文了解网络安全究竟有多重要!

随着互联网的普及和数字化进程的加速,网络安全已经成为我们生活中不可或缺的一部分。然而,很多人对于网络安全的概念仍然模糊不清。 那么,什么是网络安全?它究竟有多重要呢? 一、网络安全的定义 网络安全是指保护网络…

Sora一出 哪里又要裁员了?

上班前夕迎来大新闻,那就是Sora了,Sora是什么,有什么牛逼之处,怎么实现的,我们跟着官方文档透露出来的一点点信息,简单的捋一捋。 一、Sora是什么 官方给出的定义是:世界模拟器。这很明显有夸大…

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据,这个时候前段可以直接解决。 在 JavaScript 中,可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型,其特点是元素不会重复且无序。 下面是一个示例代码,展示如何通过 S…

three.js 物体下落动画(重力加速度)

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><el-button click"loopFun"> 物体下落…

kubuntu 解决 kwallet 弹窗问题

问题 启动 kubuntu 后, 自动弹框要求验证 kwallet 的密码 查看本次启动中与 kwallet 有关的日志 $ journalctl -b | grep kwallet解决 开启 sddm/gdm 登录后自动解锁 kwallet 的功能 安装 kwallet-pam 模块 一般来说系统自带该模块 $ sudo apt install libpam-kwallet5 l…