【网络原理】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,一经查实,立即删除!

相关文章

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…

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语言是一门…

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

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

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…

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

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

Zookeeper详解

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

canvas实现水印逻辑分析

目录 效果图一、相关文档二、分析三、实现1、将水印文字转为水印图片2、给刚生成的水印图片加入旋转以及间隔(1)旋转位移(2)间隔位移(3)最后使用toDataURL导出为png图片 3、将生成的水印图片依次排布在需要…

【Python数据结构与判断2/7】数据和判断小结

目录 序言 print() 变量 赋值 四种数据类型 字符串 格式化输出 四则运算 取整与取模 比较运算 逻辑运算 判断 if语句 if-else语句 if-elif-else语句 Tips 空值、0、非0非空值 实战案例 输入密码 短信模板 总结 序言 今天将对前面学过的内容进行一个复习小结…

科技引领品质:飞利浦智能锁“12年免费换新机”重塑行业新标杆

随着智能锁行业的竞争愈发火热,各大品牌在技术创新和服务升级方面不断推陈出新。售后服务的形态正发生深刻变化,从传统的保修维修到如今的技术支持、24小时在线客服等,各大品牌都在不断地提升售后服务水平,以创新的服务理念和先进…

配置与管理DNS服务器

配置与管理DNS服务器 **1,什么是DNS?**负责将域名转换成实际想对应的ip地址,这个过程交域名解析。 **2,域名解析的方法:**分布式,层次结构的数据库系统。根域,顶级域,二级域&#…

sql注入基础学习

1.常用SQL语句 01、显示数据库 show databases; 02、打开数据库 use db name; 03、显示数据表 show tables; 04、显示表结构 describe table_name; 05、显示表中各字段信息,即表结构 show columns from table_nam…

面向对象的编程语言是什么意思?——跟老吕学Python编程

面向对象的编程语言是什么意思?——跟老吕学Python编程 面向对象是什么意思?面向对象的定义面向对象的早期发展面向对象的背景1.审视问题域的视角2.抽象级别3.封装体4.可重用性 面向对象的特征面向对象的开发方法面向对象程序设计基本思想实现 面向对象的…

数据结构-稀疏数组

文章目录 1、什么是稀疏数组?2、稀疏数组的存储流程3、代码实现4、运行结果 1、什么是稀疏数组? 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 2、稀疏数组的存储流程 记录数组一共有几行…

活体检测(点头,摇头,张嘴等动态识别)

活体检测(点头,摇头,张嘴等动态识别) 某本书里有一句话,等我去读、去拍案。 田间的野老,等我去了解、去惊识。 山风与发,冷泉与舌, 流云与眼,松涛与耳, 他们等…