最近在做优化的时候涉及到了这块内容,觉得值得写下来,方便以后翻阅。
🏠 博客主页:小谢同学的小破站✍️ 本文由 小谢同学的小破站 原创,首发于 CSDN💻☕ Java学习专栏:java📗 MySQL专栏:MySQL🧩 数据结构与算法:Java 数据结构与算法🌐C语言专栏: C语言👍 欢迎
TCP协议
1.1 TCP协议结构前言: 这里是小谢同学的 Java学习记录,整理TCP协议的核心特性。笔记用于自我复盘巩固,有错误
1. 认识TCP协议
TCP(Transmission Control Protocol,传输控制协议),属于传输层协议,是面向字节流、可靠的字节流协议,全双工。和 UDP 无连接、不可传输形成鲜明对比。
1.1 TCP协议结构
解释:
16位源端口: 是传输层协议中用于标识发送端应用程序的端口号,用于区分同一主机上不同进程的通信。16位目的端口: 是网络通信中数据包发送到目标主机上特定服务的端口号,用于标识接收方的应用程序或服务。32位序号: 针对数据进行编号。32位确认序号: 给ack报文进行用,用于确定当前ack是应答哪一个数据4位首部长度: 该字段表示 TCP 所传输的数据理应从 TCP 数据包的哪位开始计算,也可以把它看作 TCP 首部的长度。保留位:
URG(紧急指针是否有效),ACK(确认是否有效)PSH(指示接收方立即将数据提交给应用层,而不是等待缓冲区满)RST(对方要求重新连接,也称为:复位报文段)SYN(请求建立连接,也称为:同步报文)FIN(通知对方,当前端口要关闭,也称为:完成报文段)
16位窗口大小: 标识接收方可接受的数据字节数16位紧急指针: 标识哪部分数据是紧急数据选项: TCP头部中可变长度的字段,用于增强连接功能,如最大报文段长度、选择确认、时间戳和窗口扩大等16位校验和: 用于检验数据完整性。
2. TCP协议的核心特性
TCP协议中主要核心特性分别为:校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制,滑动窗口,快速重传,延时应答,捎带应答
2.1 可靠传输的7大核心特性
1. 确认应答(ACK报文): 数据在收到后,返回对应的应答报文来告诉发送方"我收到了"。
丢包,会重新发送数据。
传输过程中可能会出现发送时间超时了,但是超时后,数据到达了的情况 此时这种情况就会多收到一次数据:类似于迷路了但是后来又找到了 为了规避这种情况,传输的数据先会到达接收方的接收缓冲区,在接收缓冲区内会对数据进行去重,辨别是否为无效数据,此时就会进行舍去操作; 超时重传的数据并不是固定的: 1. 多次传输过程中都没有到达对方;2. 重传达到一定的次数;->这两者都极大可能说明了网络可能出现严重故障,每一次重传时间间隔会逐渐拉长
1. 连接管理: 此处涉及到建立连接与断开连接两个操作,分别为3次握手与4次挥手。
连接操作:三次握手 为了节省资源,3次握手连接过程中在返回ACK过程中,连同SYN一同返回回去; 断开操作:四次挥手 此处涉及到几种状态:listen,establishen,close_wait和time_wait
listen:服务器准备就绪establishen: 建立连接完成close_wait:断开连接时:收到FIN的一方,知道这方主动发送FINtime_wait:主动断开连接的一方,会等待一段时间(时间:2MSL 相当于2分钟) 4次挥手可以合并吗?->不一定 第二个FIN和ACK之间的时间间隔对于四次挥手来说取决于你自己代码怎么写的 如果代码逻辑没啥,中间的间隔非常短,就可以合并不能合并的原因:如果代码逻辑相对多,中间的间隔很长,就不能合并
1. 流量控制:防止发送方发的太快,接收方来不及接收。
我们知道:滑动窗口,提升效率.滑动窗口越大,传输效率越高,但是滑动窗口特别大就会出现坑,举个例子:发送数据特别快,但是接收方的接收缓冲区就忙不过来了,此时再继续传输就会面临丢包; 流量控制就是对滑动窗口大小进行控制
1. 拥塞控制:防止发送方发的太快,把网络堵崩。
和流量控制类似,都是对滑动窗口做出限制,只不过二者有所区别:流量控制依据接收方的处理能力;拥塞控制依据通信路径的处理能力 此时就能够对滑动窗口做出一种限制,传输数据快慢,会根据路由中最小处理能力的路由器相关,此时就会引入一个概念:拥塞窗口
2.2 提高性能的4大核心特性
1. 滑动窗口:开辟一块窗口缓冲区,窗口内的数据可以批量发出;收到确认后窗口向后滑动。
从而达到不再每发 1 个报文就等待一次 ACK 确认应答,而是一次性连续发送一批数据。
1. 快速重传:丢包之后不等超时计时器到期,立刻重传丢失报文。
进而引出了两大坑:TCP如何解决ACK或者数据丢包了? 跳过漫长的超时等待,降低丢包恢复耗时,提升传输效率。
1. 延时应答:接收方收到数据后,不立即返回 ACK 确认报文,短暂等待一小段时间。
托的过程中先让应用程序处理一部分数据再返回ACK此时剩余空间就有可能会变大,从而提高效率;
1. 捎带应答:ACK 确认报文 “搭顺风车”,附着在反向传输的数据报文头部一起发送给发送方。
就类似于日常生活中的顺风车,司机顺路回家,你通过手机APP下单,司机送你回去的一种;
2.3 面试高频问题总结
TCP 如何保证可靠性? 校验和 + 确认应答 + 超时重传 + 序号去重 + 流量拥塞控制TIME‑WAIT 状态存在的意义? 客户端断开后等待 2MSL,保证最终一个 ACK 报文一定被服务器收到。滑动窗口的作用? 实现流量控制,批量发送报文,减少 ACK 报文次数,提升传输效率。三次握手流程
客户端发送 SYN 请求报文,请求建立连接服务端返回 SYN+ACK,同意连接并且确认收到客户端请求客户端返回 ACK,确认收到服务端报文,连接正式建立不能两次握手的原因 防止过期失效的连接报文延迟到达服务器。如果只有两次握手,服务器收到旧报文就会直接建立一条无效连接,白白占用服务器资源。
就写这么多吧,内容比较基础,适合入门回顾。有补充的地方欢迎留言一起完善。
评论 (0)
暂无评论