【Javaee】网络原理—TCP协议的核心机制
前言
TCP/IP五层协议是互联网中的主流模型,为网络通信提供了一个稳固的框架。
主要包含了应用层,传输层,网络层,数据链路层,物理层。
本篇主要介绍传输层的TCP协议的核心机制
一. 确认应答(ack)
TCP最核心的机制为可靠传输,但可靠传输并不是保证100%的成功,而是尽可能的使数据能到达对方,可靠性的保证有两个重要机制
1.能感知到对方是否接收到数据
2.如果发现对方没有收到,就要进行重发
其中,通过确认应答机制来感知对方是否收到。
所谓的“感知对方是否收到”,是靠对方的通知。
应答报文(acknowledge),缩写为ack
网络传输中存在着后发先至的情况,当发送多个消息时,上诉机制可能可能产生问题,例如
甲向乙提出两问题,乙回答时可能发送后发先至的情况,变成了乙不同意一起吃饭,却同意做女朋友,此时,就产生了歧义。
此时,可以给传输的数据添加编号,通过编号,可以区分出数据的先后顺序。
TCP是面向字节流的,实际上的编号是按照字节来编号的。
按照字节编号这样的机制,就是TCP的序号
在应答报文中,针对之前收到的数据进行对应编号,称为TCP的确认序号
其中,确认序号是接收方收到的数据最后一个字节序号的下一个序号(如上图,数据最后一个字节序号是1000,ack则返回1000+1,也就是1001作为确认序号)
确认序号前的数据,全部都已经被接收方接收
如果数据在发送过程中发生后发先至,后面的数据比前面的数据先一步到达,此时接收方read就会进入阻塞等待,直到读取到开头发送的数据,确报发送方write的顺序和接收方read的顺序相同时,才会解除阻塞。
二.超时重传
网络传输中并不是一帆风顺,常常会发生丢包情况
产生丢包的原因有多种
1.数据传输过程中,发生了bit翻转,收到这个数据的接收方计算校验和对不上,此时会直接丢弃该数据包。
2.数据传输到某一节点,节点负载太高了(网络高峰期),后续传输过来的数据可能直接被节点丢弃掉
TCP需要通过应答报文来区分数据是否丢包,收到应答报文(ack),就说明数据没有丢包,没收到应答报文,就说明数据丢包了。
丢包是难以预测的,TCP再强大也难以完全避免丢包,能做的只有在感应到数据丢包时重新发一次
但数据在网络传输是需要消耗时间的,“没收到应答报文”可能只是暂时没收到,等一会可能就收到了,也有可能是确实丢失,永远收不到了。
超时重传机制通过设定一个“时间限制”,如果在这个时间限制内,没有收到ack,则视为数据丢包,随后重传文件
如果数据成功发送,但ack丢包,由于发送方无法识别对方有没有收到数据,到达限制时间后也会进行重新发送,此时接收方又收到了一份相同的数据,TCP会进行去重,确保不会read到同样的数据。
超时重传的时间不是固定不变的,而是动态变化的。
发送方第一次重传,超时时间是t1,如果仍然没有ack,则会进行第二次重传,超时时间为t2
通常情况下t2>t1,每重传一次,超时时间的间隔就会变大,反复重传多次后,都没有顺利到达,TCP不会尝试重传,会先进行复位连接,发送一个一个特殊的数据包(复位报文),如果网络这会恢复了,复位报文会重置连接,使通信可以继续运行,如果网络存在严重问题,复位报文也没得到回应,此时TCP就会单方面放弃连接,连接也就无了。
确认应答和超时重传相互补充,共同构建了TCP的可靠传输机制
三.连接管理★★★(重点)
1.建立连接(三次握手)
三次握手是客户端与服务器建立连接的过程,前面提到过,连接的实质是双方保存着对方的信息
如上图所示,A请求保存B的信息,B接收到后返回ACK,然好B请求保存A的信息,A收到后返回ACK,其中,syn和ack可以同时发送,于是将这两步合并成一步,这就是三次握手。
三次握手要解决说什么问题?意义所在?
1.投石问路,初步验证通信链路是否畅通(可靠传输的前提条件)
2.确认通信双方各自的发送能力与接收能力是否都正常
3.让通信双方在通信前,对通信过程中需要用到的一些关键参数进行协商(TCP通信时的起始数据序号,就是通过三次握手协商确定的)
上诉约定的意义,在于避免“前朝的剑斩今朝的官”
假如A和B在传输数据时,数据包传输的慢,突然A和B断开了连接,过了一会A和B又重新建立了连接,虽然还是A和B两个主机连接,但可能是不同的应用程序,此时上一个没到达的数据包可能这时才到达,A和B已经是新的连接了。
针对这样“迟到”的数据包,应当直接丢弃掉。
那么,如何区分数据包是否是前朝的?
可以给每个连接都协商不同的起始序号,如果发现收到的数据和起始序号以及和最近收到的序号差距很大,则为“迟到”的数据包
2.断开连接(四次挥手)
断开连接就是通信双方各种把对端的信息删除掉(优雅的)
前面介绍“超时重传”时提到单方面释放连接,则是没那么优雅的进行断开连接(会造成资源浪费)
通信双方各种给对方发送“FIN”,各自给对方返回“ACK”
三次握手的三次,是因为中间的syn与ack进行了合并
对于四次挥手来说,中间ACK和FIN不一定能够合并。
原因是四次挥手ACK是内核控制的,但FIN的触发则是通过应用程序调用close
这中间存在着时间间隔
3.TCP的状态
1)LISTEN状态
服务器进入的状态,表示已经绑定好端口,服务器初始化完毕,准备连接客户端
2)ESTABLISHED
客户端和服务器都保存好了对方的信息,可以传输后续数据业务(三次握手后)
3)CLOSE_WAIT
被动断开连接的一方进入的状态,等待代码执行close方法
如果发现服务器端存在大量CLOSE_WAIT状态的TCP连接,说明服务器代码可能存在问题,应检查代码是否有close操作
4)TIME_WAIT
主动断开连接的一方进入的状态,此处的TIME_WAIT按照时间等待,达到一定时间后连接也就释放了。
为何不直接释放连接?而是要等待一段时间??
TCP在传输的过程中,任何一个数据都有可能丢包
此处的等待,就是以防最后一个ACK丢包,如果最后一个ACK丢包,则会重传FIN
能够重发一次ACK的前提是A这边的连接不能释放(如果释放就无法返回数据)
保留一段时间没有收到重传的FIN,则说明刚才的ACK应该是收到了,就可以释放连接
TIME_WAIT持续时间通常为2MSL
四.滑动窗口
1.概述
提起滑动窗口,学过算法的同学应该知道,算法思想中也有滑动窗口,其实,算法中的“滑动窗口”正是借鉴自TCP的滑动窗口
为什么TCP要滑动窗口???
TCP希望能在可靠传输的基础上,也能有不错的效率,为此引入滑动窗口。
此处的提高效率,只是“亡羊补牢”,使传输的效率损失尽可能降低(效率低于UDP)
按照以上方式(无滑动窗口),A每次发送一个数据给B,都得等待B的ack才能发下一个,这种方式的低效的。
改进方案则是把“发一个等一个”改成“发送一批等待一批”,把多次等待ack的时间合并成一次,这样等待的时间少了,效率也就提高了。
批量发送的数据越多,效率越高,此时把批量发送数据且不需要等待的数据的量称为窗口大小。
以下图为例,主机A批量发送数据包后,当收到第一个ack后,就会立即发送下一条数据,窗口向右移动
2.丢包问题
情况一
数据包抵达,ACK丢包(如图)
此时不需要做任何处理,批量发数据,ACK丢失也只是丢失其中的一部分,不可能全丢了
通过确认序号,可以判定前面的数据都收到了,接下来要发送的数据就从确认序号这里往后发
情况二
发送方数据丢包
如图,确认序号会在收到后面的数据包时反复返回丢失段数据包的序号,提醒发送方进行重发,发送方识别出哪个数据包丢失后,针对这个数据包进行重传,其他顺利到达的数据包无需重传,这就是“快速重传”
快速重传可以视为滑动窗口下搭配的超时重传。
五.流量控制
滑动窗口窗口的大小对于传输数据的性能是直接相关的
窗口的大小不能无限的大,通信是双方的事情,发送方发送的快了,也得确保接收方能够处理的来。
发送方与接收方之间,有着一个接收缓冲区,用于存放发送方发送的数据(本质为阻塞队列)
如果发送速度特别快,接收方处理接收速度比较慢,就会使接收缓冲区充满,此时发送方强行发送数据则会丢包,这就需要让接收方的处理能力反向制约发送方的发送速度。
可以通过“定量”的方式,来实现制约
如果空闲空间越大,则可以认为应用程序处理速度比较快,就可以让发送方发送的快一些,设置一个更大的窗口大小。
如果空闲空间小,则可以认为应用程序处理速度比较慢,就可以让发送方发送的慢一些,设置一个更小的窗口大小shu
TCP接收方接收到数据的时候,就会把接收缓冲区剩余空间大小通过ACK数据包反馈给对方,例如
流量控制,并不是TCP独有的机制,其他的协议可能也会涉及流量控制
六.拥塞控制
拥塞控制与流量控制是有关联的,也是“踩刹车”
虽然TCP有了滑动窗⼝这个⼤杀器,能够⾼效可靠的发送⼤量的数据.但是如果在刚开始阶段就发送⼤量的数据,仍然可能引发问题。
因为⽹络上有很多的计算机,可能当前的⽹络状态就已经⽐较拥堵.在不清楚当前⽹络状态下,贸然发送⼤量的数据,是很有可能引起雪上加霜的。
如下图,有一个节点本身负载已经很高,如果A依旧快速发送数据包,这个节点可能就直接丢包了
但由于中间节点数量多,每次传输数据走的路径还不一样,哪一个节点负载高难以精确的发现
那么要怎么衡量节点的负载来控制发送速度?
拥塞控制中,把中间传输的节点,视为一个整体,不关注具体的实现细节。
通过做实验的方式,找到一个合适的发送速度(面多加水,水多加面)
例如:1.先按照一个比较小的速度发送数据,数据非常畅通,没有丢包,说明网络传输数据整体比较畅通,就可以加快发送速度
2.增大到一定的速度后,发现丢包了,说明网络上可能存在拥塞,就减慢发送速度
3.减速到一定速度后,发现不丢包了,则又开始增加数据发送速度
........
如此反复
拥塞控制的窗口是动态变化的,需根据实际情况来调整
拥塞控制和流量控制都是踩刹车,这两个机制会同时起作用,最终实际发送发送窗口的大小,取决于上述两个机制得到的方式窗口的较小值。
流量控制与拥塞控制都是对TCP可靠传输的补充
七.延时应答
延时应答的目的是为了提高效率,尽可能降低可靠传输带来的性能影响。
发送方发送数据时,接收接收后不着急马上返回ack,而是数据发送一定数量(或可以按照一定时间)后,再返回ack。
八.捎带应答
捎带应答是再延时应答的基础上,提高效率的机制
把返回的业务数据和ack合二为一(减少包的数量,提高效率)。
正常情况下,发送方和接收方数据发送为“一问一答”,ack和发送数据业务之间存在着时间间隔,无法合并。
但是ack有着延时应答,可以将ack发送的时间往后拖,这一拖,可能赶上发送数据业务的时间,于是发送数据业务时,可以把ack也一起带上。
四次挥手中,FIN和ACK无法合并也是因为两个数据包之间存在着时间间隔。
但如果此时触发延时应答,ACK等待FIN发送时捎带发送,那么四次挥手也能够变成三次挥手
九.面向字节流
TCP协议传输时是通过字节流传输的,前文已经介绍过,这里主要介绍面向字节流所产生的粘包问题。
什么是粘包问题??
以图为例,当A向主机发送数据时,数据到达接收缓冲区
当应用程序读取接收缓冲区时,有各种读法(如aa,abb,bccc等),但“aaa”,“bbb”,“ccc”才是正确的读法,如不为这样的读法,应用程序读取的数据包与原数据包有所偏差,会产生不同的结果。
粘包问题就是应用层数据包在TCP缓冲区中连城一片,粘在一起。
应如何解决粘包问题?
方案一:
关键在于明确每个数据包的边界,可通过分隔符来区分包和包的边界。
方案二:
约定每个应用层数据包的长度,利用数据包开头的两个/四个字节来定义长度
十.异常处理
在遇到一些异常情况时,TCP协议有着解决问题的方案
1)进程崩溃
在Java中表现为抛出异常,但没人catch,最终异常到了JVM里,进程直接崩溃
在这过程中,操作系统会进行善后,会关闭文件描述表里对应的文件,socket文件也会触发正常的关闭流程(四次挥手)
2)主机关机(正常流程)
操作系统会关闭掉所有的进程,关闭的过程中同样会进行四次挥手。
此时有两种情况
a)当四次挥手快时,四次挥手结束后主机关机
b)当四次挥手慢时,可能每来得及挥完就关机了(如图)
此时,B应没收到ACK,就会触发超时重传,可能会重传很多次,但达到上限后只能单方面主动放弃连接
3)主机掉电(拔电源)
分为两种情况
a)发送方掉电
此时B会发送探测报文,若A有ACK,说明A没有掉。
如果多次发送探测报文,没有回复,则认为A掉了
探测报文是周期性发送的,同时这个报文也是探测对方“生死”的,也被称为“心跳包”
b)接收方掉电
此时,B就不会发送ACK给A了,A会触发超时重传,重传的数据也没有响应,多次后会重置连接,重置连接没有响应后,A会单方面断开连接
4)网线断开
和主机掉电非常相似
站在A的视角,ACK收不到,超时重传,重置连接,最后单方面放弃连接
站在B的视角,探测报文没有回复,最后单方面放弃连接
TCP不只有10个机制,本篇只是提到较为核心的机制
以上便是全部内容,如有不对,欢迎指正
相关文章:

【Javaee】网络原理—TCP协议的核心机制
前言 TCP/IP五层协议是互联网中的主流模型,为网络通信提供了一个稳固的框架。 主要包含了应用层,传输层,网络层,数据链路层,物理层。 本篇主要介绍传输层的TCP协议的核心机制 一. 确认应答(ack…...

Unity插件-Intense TPS 讲解
目录 关于TPS 打开场景:WeaponTest.unity, 只要把这些枪点,打开(默认隐藏,不知道为何), 一开始不能运行如何修复 总结 关于TPS 个人不是TPS,FPS的射击游戏爱好者, 不过感觉这个枪感&…...

【p2p、分布式,区块链笔记 Blockchain】truffle001 以太坊开发框架truffle初步实践
以下是通过truffle框架将智能合约部署到Ganache的步骤 Truffle简介环境准备:智能合约 编写 & 编译部署合约本地服务器ganache配置网络配置部署合约: 运行Truffle迁移(部署):与智能合约交互: 以下是通过truffle框架将智能合约部署到Ganach…...

网站被浏览器提示“不安全”,如何快速解决
当网站被浏览器提示“不安全”时,这通常意味着网站存在某些安全隐患,需要立即采取措施进行解决。 一、具体原因如下: 1.如果网站使用的是HTTP协议,应立即升级HTTPS。HTTPS通过使用SSL证书加密来保护数据传输,提高了网…...
java -jar启动 报错: Error: Unable to access jarfile
是JDK版本不对,即运行项目所需JDK与本机所装JDK版本不同 解决方法: 修改JDK版本即可。 jarfile 其后的路径不对 解决方法 修改正确的路径 将绝对路径修改为相对路径或者将相对路径修改为绝对路径,尝试一下...

Servlet(三)-------Cookie和session
一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用…...

最新物流行业CRM系统应用数字化解决方案
因势利导 ——全球化物流的挑战与机遇 在全球经济一体化与互联网技术快速发展的双重驱动下,物流行业正经历着前所未有的变革时期。这一变革不仅影响 着行业的发展模式,还对运营效率和客户体验提出了新的要求。 随着市场需求的不断演变,物流行业已呈现出多元化和专业 化并行的发…...
[deadlock]死锁导致的设备登录无响应问题
[deadlock]死锁导致的设备登录无响应问题 一、问题现象二、初步观察三、继续深挖查看netlink相关信息查看warnd进程栈 四、再接再厉查看warnd 用户栈 后记 一、问题现象 实验室一台压力测试设备突然无法登录,无论web页面,ssh或者telnet登录,…...

2024年10月21日计算机网络,乌蒙第一部分
【互联网数据传输原理 |OSI七层网络参考模型】 https://www.bilibili.com/video/BV1EU4y1v7ju/?share_sourcecopy_web&vd_source476fcb3b552dae37b7e82015a682a972 mac地址相当于是名字,ip地址相当于是住址,端口相当于是发送的东西拿什…...
ESlint代码规范
这里写目录标题 ESlint代码规范解决代码规范错误 ESlint代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号左右是否需要空格” “一行代码结束是否要加分号” JavaScript Standard Style规范说明:https://standardjs.com/rules-zhc…...

【Vue.js设计与实现】第三篇第11章:渲染器-快速 Diff 算法-阅读笔记
文章目录 11.1 相同的前置元素和后置元素11.2 判断是否需要进行 DOM 移动操作11.3 如何移动元素11.4 总结 系列目录:【Vue.js设计与实现】阅读笔记目录 非常快的Diff算法。 11.1 相同的前置元素和后置元素 不同于简单 Diff 算法和双端 Diff 算法,…...

材质变体 PSO学习笔记
学习笔记 参考各路知乎大佬文章 首先是对变体的基本认知 概括就是变体是指根据引擎中上层编写(UnityShaderLab/UE连连看)中的各种defines情况,根据不同平台编译成的底层shader,OpenGL-glsl/DX(9-11)-dxbc DX12-dxil/Vulkan-spirv,是打到游…...

2024年【烟花爆竹储存】考试及烟花爆竹储存复审模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 烟花爆竹储存考试参考答案及烟花爆竹储存考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹储存操作证已考过的学员汇总,相对有效帮助烟花爆竹储存复审模拟考试学员顺利通过考试。 1、【单选题】( …...
文件夹操作
文件夹操作 opendir closedir readdir write(fd,buf,strlen(buf)); return 0; } 作用 : 打开目录 opendir 所有头文件 : #include <sys/types.h> #include <dirent.h> 函数 : DIR *opendir(const char *name); 参数: name :目…...

如何制作一台自己想要的无人机?无人机改装调试技术详解
制作一台符合个人需求的无人机并对其进行改装调试,是一个既具挑战性又充满乐趣的过程。以下是从设计、选购材料、组装、调试到改装的详细步骤: 一、明确需求与设计 1. 明确用途与性能要求: 确定无人机的使用目的,如航拍、比赛、…...

Linux -- 进程间通信、初识匿名管道
目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言: 管道 代码预准备: 如何创建管道 -- pipe 函数 参数: 返回值: wait 函数 参数: 验证管道的运行: 源文件 test.c : m…...

网站的SSL证书快到期了怎么办?怎么续签?
网站的SSL证书即将到期时,需要续签一个新的证书以保持网站的安全性和信任度。以下是续签SSL证书的一般步骤: 1. 选择证书提供商 如果您之前使用的是免费证书,您可以选择继续使用同一提供商的免费证书服务进行续签。如果您需要更高级别的证书…...
解決爬蟲代理連接的方法
爬蟲在運行過程中常常會遇到代理連接的問題,這可能導致數據抓取的效率降低甚至失敗。 常見的代理連接問題 代理IP失效:這是最常見的問題之一。有些代理IP可能在使用一段時間後失效,導致連接失敗。 連接超時:由於網路不穩定或代…...

Prometheus 监控Harbor
你好!今天分享的是基于Prometheus监控harbor服务。 在之前的文章中分别介绍了harbor基于离线安装的高可用汲取设计和部署。那么,如果我们的harbor服务主机或者harbor服务及组件出现异常,我们该如何快速处理呢? Harbor v2.2及以上…...

SQL 干货 | SQL 半连接
大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi …...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...