【网络原理】TCP 协议中比较重要的一些特性(一)

目录

1、TCP 协议

2、确认应答

2.1、确认序号

3、超时重传

4、连接管理

4.1、建立连接(三次握手)

4.2、断开连接(四次挥手)



1、TCP 协议

TCP 是工作中最常用到的协议,也是面试中最常考的协议,具有面向连接,可靠传输,面向字节流,全双工的特点,其中可靠传输是 TCP 安身立命的本钱,TCP 设计的初心就是为了解决“可靠传输”这个问题

2、确认应答

确保 TCP 可靠性最核心的机制,称为“确认应答”。发送方给接收方发送消息成功后,接收方会返回一个应答报文(ack 报文,acknowledge)

ack(acknowledge,应答报文)

2.1、确认序号

确认序号是返回的应答报文中的一个值,确认序号是按照发送过去的最后一个字节的序号再加上 1 来进行设定的。

如上图所示,主机 B 收到 1 - 1000 这些字节数据之后,反馈了一个应答报文。应答报文中的确认序号的值就是 1001。 此处发送回去的 1001 有两个含义

  1. 告诉发送方主机 A ,小于 1001 的数据已经收到了
  2. 发送方主机 A接下来要发送从 1001 开始的数据

3、超时重传

超时重传,是确认应答的补充,用于处理丢包情况。

如果一切顺利,通过应答报文就可以告诉发送方,当前的数据是否成功收到,但是网络上可能存在“丢包”情况。如果数据包丢了,没有到达对方,对方自然也就不会发送 ack 应答报文。为了针对这种情况,提出了“超时重传”。

超时重传简单来说就是:发送方发了一个数据后,会进行等待,如果超过了预设的等待时间依然没有 ack 应答报文返回(超时),此时发送方就会认为数据的传输出现了丢包,就会将刚才发送的数据包再传输一次(重传)

重传并不会无限的重传,当重传次数到达一定上限时,会尝试重置连接,如果重置也失败,则会直接放弃连接。并且重传的超时时间阈值也不是固定不变的,会随着重传次数的增加而增大(重传频率越来越低)

当然,发送方没有接收到 ack 应答报文,有两种情况,一种是数据丢了,一种是接收方收到了数据,再回传 ack 时 ack 丢了。

当 ack 丢失时,会导致发送多次相同数据到接收方,此时接收方可以通过“接收缓冲区”将重复的数据过滤掉,防止因为重复数据出现问题。

接收缓冲区除了能够帮助我们进行去重之外,还能进行排序,对收到的数据按照序号进行排序,确保应用程序读到的数据和发送的数据顺序是一致的,可以简单认为接收缓冲区是一个“优先级队列”,以序号作为优先级的参考依据。

注意:上述谈到的 ack、超时重传、保证顺序、自动去重,都是 TCP 内置的,只需要调用 outputStream.write() 上述功能即可自动生效。

反之如果使用 UDP,上述问题都需要好好考虑并处理。

4、连接管理

4.1、建立连接(三次握手)

操作系统内核建立连接的过程称为“三次握手”,目的是让通信双方都能保存对方的相关信息。

socket = new Scoket(serverIp,serverPort);

这个操作就是在进行“三次握手”,而服务器是在“三次握手”之后通过 accept 从队列中获取最新连接

syn(synchronize,同步报文段)不携带载荷,只携带报头。

第一次交互,一定是客户端主动发起的,此时客户端会发送一个 syn 。服务器收到 syn 之后,会返回 ack (应答报文)和 syn ,其中 ack 表示收到了连接请求,syn 表示接收连接。此时客户端接收到 syn 后再给服务器发送一个 ack。

所谓的建立连接的过程,本质上就是通信双方各自给对方发送一个 syn,各自给对方回一个 ack。

由于服务器返回 ack 和 syn 的过程和应用程序代码无关,由内核完成,中间两步的触发时机几乎完全一致,因此可以合并为一步。

“三次握手”的意义:

  1. 可以先针对通信路径,进行投石问路,初步的确认以下通信链路是否畅通。【关注点在中间过程】
  2. 验证通信双方的“发送能力”和“接受能力”是否正常。【关注点在两端】
  3. 三次握手的过程中协商一些必要的参数。例如序号

4.2、断开连接(四次挥手)

通过 socket.close() 开始执行断开连接操作。

FIN(finish,结束报文段)

在实际过程中,也可能是“三次挥手”,三次和四次取决于第一个 ack 和第二个 fin 的时间间隔,由于这两者之间的间隔与应用程序代码有关,如果时间间隔比较长,此时就无法进行合并。但是通常情况下还是认为是四次挥手。

所谓的断开连接的过程,本质上就是通信双方各自给对方发送一个 fin,各自给对方回一个 ack。

【博主推荐】 

JVM 的垃圾回收机制以及垃圾回收算法的详解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136530845?spm=1001.2014.3001.5501对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136529700?spm=1001.2014.3001.5501【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zzzzzhxxx/article/details/136322678?spm=1001.2014.3001.5501

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

如果觉得作者写的不错,求给博主一个大大的点赞支持一下,你们的支持是我更新的最大动力!

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

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

相关文章

软考高级:单元测试、集成测试、确认测试(内部确认测试、Alpha 测试、Beta测试、验收测试)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Electron程序如何在MacOS下获取相册访问权限

1.通过entitiment.plist,在electron-builder签名打包时,给app包打上签名。最后可以通过codesign命令进行验证。 TestPhotos.plist electron-builder配置文件中加上刚刚的plist文件。 通过codesign命令验证,若出现这个,则说明成…

Fortran语法介绍(三)

个人专栏—ABAQUS专栏 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则各向同性线弹性材料本构模型…

《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题。 2.源码 本文介绍webdriver中关于浏览器退出操作。driver中有两个方法是关于浏览器关闭&…

SQL28 计算用户8月每天的练题数量

👨‍💻 大唐coding:个人主页 🎁 个人专栏: 《力扣高频刷题宝典》《SQL刷题记录》 ⛵ 既然选择远方,当不负青春,砥砺前行! 大家好,我是大唐,今天我们来做一道牛客题库SQL…

MySQL-----存储过程

▶ 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,…

C switch 语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。 语法 C 语言中 switch 语句的语法: switch(expression){case constant-expression :statement(s);break; /* 可选的 */ca…

Sora模型详细描述提示词的10个技巧

在使用Sora进行文本生成视频时,详细描述提示词是提高生成质量和准确度的重要手段。下面将详细介绍10个关于详细描述提示词的技巧,帮助用户更有效地利用Sora模型生成符合需求的文本内容。 1. 具体化描述 详细说明:在提供提示词时&#xff0c…

python实现B/B+树

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 B树和B树都是一种多路搜索树,用于对大量数据进行排序和查找。它们在数据库系统中被广泛应用,特别是用于构建索引结构。 B树(B-Tree) B树&…

传统开发读写优化与HBase

目录: 一、传统开发数据读写性能优化 1. Mysql 分表、主从复制与读写分离 2. Redis(缓存型数据库)主从复制与读写分离 二、HBase 一、传统开发数据读写性能优化 1、Mysql 分表、主从复制与读写分离 mysql分库分表方案 一种分表方案:设置表A 表B 表A 自增列从1开始…

C语言中的UTF-8编码转换处理

C语言UTF-8编码的转换 1.C语言简介2.什么是UTF-8编码?2.1 UTF-8编码特点: 3.C语言中的UTF-8编码转换处理步骤1:获取UTF-8编码的字节流步骤2:解析UTF-8编码步骤3:Unicode码点转换为汉字 4.总结 1.C语言简介 C语言是一门…

js进阶-es6-作用域-垃圾回收机制-闭包-变量提升

1.作用域 作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问。 作用域分为:局部作用域 全局作用域 1.1 局部作用域 局部作用域分为函数作用域和块作用域 1.函数作用域 : 在函数内部…

【面试精讲】Java线程6种状态和工作原理详解,Java创建线程的4种方式

Java线程6种状态和工作原理详解,Java创建线程的4种方式 目录 一、Java线程的六种状态 二、Java线程是如何工作的? 三、BLOCKED 和 WAITING 的区别 四、start() 和 run() 源码分析 五、Java创建线程的所有方式和代码详解 1. 继承Thread类 2. 实现…

【jvm】java对象占用内存问题深入解析

一个Java对象占用多大内存-CSDN博客 关于Object o new Object()追魂九连问(个人学习笔记) - 知乎JVM(Java虚拟机)-史上最全、最详细JVM笔记-CSDN博客

Node-RED在Linux二次开发网关中能源数据实时采集与优化

智能电网与分布式能源系统已成为推动绿色能源转型的重要载体。为了更好地应对多样化的能源供给与需求挑战,以及实现更高效的能源管理,Linux二次开发网关与Node-RED这一创新组合应运而生。 Linux二次开发网关作为高度定制化的硬件平台,其开源特…

【深入理解LRU Cache】:缓存算法的经典之作

目录 一、什么是LRU Cache? 二、LRU Cache的实现 1.JDK中类似LRUCahe的数据结构LinkedHashMap 2.自己实现双向链表 三、LRU Cache的OJ 一、什么是LRU Cache? LRU Cache(Least Recently Used的缩写,即最近最少使用&#xff0…

7-17 2个数由小到大

输入两个整数a、b,按照从小到大的顺序输出这两个数。 输入格式: 在一行中输入两个整数,之间用一个空格间隔,没有其它任何附加字符。 输出格式: 在一行中按照“a小的数,b大的数”的顺序输出,两个数原样输出,没有其它…

跨平台是什么意思?——跟老吕学Python编程

跨平台是什么意思?——跟老吕学Python编程 跨平台跨平台释义跨平台软件数据库管理系统(DBMS):网站服务器、应用程序服务器:网络浏览器: 跨平台编程语言跨平台详细解说跨平台应用前景 跨平台 计算机领域术语 跨平台概念是软件开发中…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目,是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…