[JavaEE] TCP协议

目录

一、TCP协议段格式

二、TCP确保传输可靠的机制

2.1  确认应答

2.2  超时重传

2.3  连接管理

        2.3.1  三次握手

        2.3.2  四次挥手

2.4  滑动窗口

        2.4.1  基础知识

        2.4.2  两种丢包情况

                2.4.2.1  数据报已经抵达,ACK丢包

                2.4.2.2  数据包丢包

2.5  流量控制

2.6  拥塞控制

2.7  延迟应答

2.8  捎带应答

2.9 面向字节流

三、异常情况

3.1  进程终止

3.2  机器重启

3.3  机器掉电/网线断开


一、TCP协议段格式

        TCP全称为"传输控制协议(Transmission Control Protocol")。

源/目的端口号:标识数据是从哪个进程来,到那个进程去;

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节,单位是4字节)

6保留位:为后续的可拓展性留下的没被启用的空间

6标志位:

        URG:紧急指针是否有效

        ACK:确认号是否有效

        PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

        RST:对方要求重新建立连接,RST标识的被称为复位报文段

        SYN:请求建立连接;SYN标识的被称为同步报文段

        FIN:通知对方,本端要关闭了,FIN标识的被称为结束报文段

16位校验和:发送端填充,通过CRC校验,如果接收端校验不通过,则认为数据有问题,包含TCP首部和数据部分。

16位紧急指针:标识那部分数据是紧急数据

二、TCP确保传输可靠的机制

2.1  确认应答

在接收方收到数据之后,就要给发送方返回一个“应答报文”(ack/acknowledge)。

在网络信息传输中,由于每个信息所通过的传输路径不相同,所以可能造成,后发的信息早于先发的信息到达接收端,我们把这个现象叫做“后发先至”。针对于这个现象,TCP中通过针对信息进行“编号”方法解决。

TCP面向字节流,所以编号的排序是按照字节来排,且字节之间是连续递增的,这种按照字节排序的机制,就叫做“TCP的序号”,在应答报文中,针对接受之前数据的排序的机制,就叫做“确认序号”。

丢包:数据传输的过程中,可能会发生bit翻转,接受方接受这个数据发现校验和对不上了,就会把这个数包丢弃。也可能是数据传输到某个节点,这个节点负载过高的时候,就会发生丢。

针对上方提到的丢包现象,TCP为了确保传输的可靠性,接收方会有一个“接受缓冲区”,接收方接收到数据,先进入到缓冲区里,后续再接收到数据,就会根据序号在缓冲区中排序,如果发现有重复的现象,缓冲区就会自动去掉重复的数据。

2.2  超时重传

超时重传,这里的超时指的并不是时间,而是动态变化的。第一次传的时候花费t1时间,如果长时间没有ack就会发送第二次,花费的时间t2>t1,每次重传的时候时间就会增加,如果重传多次之后都没有ack,这时TCP就会发送一个特殊的数据包“复位报文”,再次建立连接重新连接,使通信可以继续进行,如果复位报文没有得到回应,这时TCP就会单方面放弃连接。

2.3  连接管理
        2.3.1  三次握手

在连接前,客户端会发送一个没有业务的数据包,也就不包含任何数据,只有TCP报头。在客户端发送syn同步请求之后,服务器接收之后也会发送一个ack+syn来回应客户端,客户端收到服务器发送的syn请求之后,会发送一个ack返回给服务器。

三次握手的意义:

        投石问路,初步验证信息的链路是否通畅,是可靠传输的“前提条件”,确认双方各自的接受和发送能力正常。

        这个过程也需要确定TCP序号开始的大小,这样做的意义就是为了避免,一个数据包走丢的过久,导致传输到服务器的时候已经不需要了。

        协商参数,通信双⽅共同确认⼀些通信中的必备参数数值。

        2.3.2  四次挥手

双方各自把对端的信息删除,简略过程如下图,这里面不同于“三次握手”需要发送四次,因为ack是由系统内核所发出的,而FIN是由程序经过逻辑代码发出的,所以需要分两次发送。

TCP的几个状态转化

        1.LISTEN:服务器的状态,服务器好绑定端口,表示可以建立连接。

        2.ESTABLISHED:客户端和服务器的状态,表示建立完结完毕(保存好对方信息)。

        3.CLOSE_WAIT:被动断开连接的一方,也就是先收到FIN的一方(等待代码执行close方法)。如果服务器存在大量CLOSE_WAIT状态的TCP连接,说明调用close方法出现问题。

        4.TIME_WAIT:客户端接收服务器的ACK和FIN之后,按照时间来等待,达到一定状态之后释放连接,因为存在客服端发送ACK丢包的现象,所以需要等待一段时间。如果保存一段时间之后,没有收到重传FIN,说明ACK没有丢包,也就会释放连接。

        TIME_WAIT存在的时间,成为2MSL,不同系统不一样,是可配置的。

2.4  滑动窗口
        2.4.1  基础知识

刚才我们讨论了确认应答策略,对每⼀个发送的数据段,都要给⼀个ACK确认应答。收到ACK后再发送下 ⼀个数据段。这样做有⼀个⽐较⼤的缺点,就是性能较差,尤其是数据往返的时间较⻓的时候。

窗口大小:把“发送一次等待一个”改进为“发送一批等待一批”,批量发送数据,不需要等待的数据的量,成为“窗口大小”,批量发送的单位是字节。

如上图发送前四个段的时候,不需要等待任何ACK,直接发送;

收到第一个ACK后,滑动窗口向后移动一个单位,继续发送第五个段的数据;

操作系统为了维护这个滑动窗口,需要开辟发送缓冲区,来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删除;

窗口越大,网络的吞吐率就越高。

        2.4.2  两种丢包情况
                2.4.2.1  数据报已经抵达,ACK丢包

ACK丢包并不要紧,因为后面的ACK包括前面的,可以通过后面的ACK是否发送来进行确认。

                2.4.2.2  数据包丢包

快速重传:上图中,快速识别哪个数据包丢包之后,并且针对性的重传,其他顺利到达的数据无需重传,这个过程被称为“快速重传”

2.5  流量控制

TCP⽀持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制(Flow  Control)。

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等⼀系列连锁反应。窗口大小并不是越大越好,针对于确定窗口大小的合理大小,TCP内有流量控制机制。接收方有接收缓冲区,根据序号排序并且去重,并且向发送方反应缓冲区的剩余空间是否过小。

接受端将自己的可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK端通知发送;

窗口大小字段越大,说明网络的吞吐量越高;

接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端; 

发送端接收到这个窗口之后,就会减慢自己的发送速度;

如果接收端缓冲区满了,就会将窗口设置为0,这是发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。

由于TCP首部中,只有一个16位窗口字段,我们所传输的最大上限是固定的,TCP为了解决这个问题,在首部选项中包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移M位;

2.6  拥塞控制

在接收端有流量控制的机制,可是一旦发送方开始就大量的发送数据,可能会造成路由器的阻塞,而导致频繁丢包的现象。为了解决发送方的问题,TCP引入了一个慢启动机制,先发送少量的数据,再决定按照多大的速度传输数据。

此处引入一个概念程为拥塞窗口,发送开始的时候,定义拥塞窗口大小为1,每次收到一个ACK应答,拥塞窗口增加1。每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小 做比较,取较小的值作为实际发送的窗口。

像上面这样的拥塞窗口增长速度,是指数级别的,“慢启动”知识初始时慢,但是增长非常快。

为了不增长那么快,引入一个叫慢启动的阈值,当拥塞窗口超过这个阈值的时候,不再按照指数指数方式增长,而是按照线性方式增长。当TCP开始启动的时候,慢启动阈值等于窗口最大值,在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置为1.

2.7  延迟应答

如果直接接受数据的主机直接返回ACK的应答,这时候返回的窗口可能比较小,如果稍慢一下返回ACK应答,有可能经过这一小段时间之后,空间就变大了。当然,并不是一定空间会变大,也有可能由于发送发发送的数据量大于接收方处理的能力,就会造成延时应答之后空间变小。

数据多的时候:每隔N个包就应答一次;

数据少的时候:通过时间限制,超过最大延时时间就应答一次。

一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率。

2.8  捎带应答

在延时应答的基础上,我们可以将两个不同时间发送的数据一起返回。比如在四次握手的情况下,由于ACK是由系统内核所发,一定快于由程序逻辑所发的FIN,所以我们可以在延时应答的基础上,让ACK和FIN一起返回。

2.9 面向字节流

粘包问题

•首先要明确,粘包问题中的“包”,是指应用层的数据包

•在TCP协议头中,没有同UDP一样的“报文长度”这样的字段,但是有一个序号这样的字段。

•站在传输层的角度,TCP是一个一个报文过来的,按照序号排好序放在缓冲区中。

•站在应用层的角度,看到的只是一串连续的字节数据,

•那么应用层看到了这一传字节数据,不知道如何分割,才是一个完整的应用层数据包

所以为了避免粘包问题,需要明确两个包之间的边界

•方案一:指定分隔符

•方案二:指定数据的长度

•方案三:可以在包头的位置,约定⼀个包总⻓度的字段,从⽽就知道了包的结束位置。

对于UDP协议来说不存在“粘包问题”,因为一个DatagramSocket就是一个完整的应用层数据报。

三、异常情况

3.1  进程终止

        进程终止会释放文件描述符,仍然可以发送FIN,和正常关闭没有什么区别。

3.2  机器重启

        和进程终止情况相同。

3.3  机器掉电/网线断开

        发送方掉电:TCP自己也内置了一个保活定时器,接收端会发送一个探测报文“心跳包”,定期询问对方是否还在,如果对方不在,也会把链接释放。

        接收方掉电:发送方会触发超时重传,一定次数之后还没有发送到,会单方面释放连接。

=========================================================================

如果对你有用的话,请给博主一个三联,博主会继续努力的ヾ(◍°∇°◍)ノ゙

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

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

相关文章

音视频入门基础:AAC专题(7)——FFmpeg源码中计算AAC裸流每个packet的size值的实现

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

Vue3:v-model实现组件通信

目录 一.性质 1.双向绑定 2.语法糖 3.响应式系统 4.灵活性 5.可配置性 6.多属性绑定 7.修饰符支持 8.defineModel使用 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 一.性质 在Vue3中,v-model指令的性质和作用主要体现在…

AI健身之俯卧撑计数和姿态矫正-角度估计

在本项目中,实现了Yolov7-Pose用于人体姿态估计。以下是如何在Windows 11操作系统上设置和运行该项目的详细步骤。 环境准备 首先,确保您的计算机已经安装了Anaconda。Anaconda是一个开源的Python发行版本,它包含了conda、Python以及众多科…

【滑动窗口】算法总结

文章目录 滑动窗口算法总结1.暴力求解vs滑动窗口2.需要注意的细节问题 2.滑动窗口的基本模板1.非固定窗口大小的滑动窗口2.固定窗口大小的滑动窗口细节 滑动窗口算法总结 1.暴力求解vs滑动窗口 遇到那些可以转化成一个子数组的长度的问题时,往往需要用到双指针。 …

安全基础学习-AES128加密算法

前言 AES(Advanced Encryption Standard)是对称加密算法的一个标准,主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度,其中AES-128是最常用的一种,它使用128位(16字节)的密钥进…

探索人工智能绘制宇宙地图的实现

人工智能 (AI) 已成为了解世界的重要工具。现在,随着人们对太空探索的兴趣重新升温,人工智能也可能对其他世界产生同样的影响。 尽管经过了几十年的研究,科学家们对地球大气层以外的宇宙仍然知之甚少。绘制行星、恒星、星系及其在太空中的运…

python爬虫初体验(一)

文章目录 1. 什么是爬虫?2. 为什么选择 Python?3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫? 爬虫(Web Scraping)是一种从网站自动提取数据的技术。简单来说&am…

安卓14剖析SystemUI的ShadeLogger/LogBuffer日志动态控制输出dumpsy机制

背景: 看SystemUI的锁屏相关代码时候发现SystemUI有一个日志打印相关的方法调用,相比于常规的Log.i直接可以logcat查看方式还是比较新颖。 具体日志打印代码如下: 下面就来介绍一下这个ShadeLogger到底是如何打印的。 分析源码&#xff1…

前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel

前言:哈喽,大家好,今天给大家分享今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f…

OpenWrt 定时重启

问题 想设置 OpenWrt 定时重启,避免因长期不重启导致的问题。 方法 参考 Scheduling tasks with cronopenwrt设置定时重启(天/周/月)定时重启openwrt (istoreos) 软路由系统 设置 cron 自启动 System - Start up - 找到 cron - 设置成自…

stm32单片机个人学习笔记5(OLED调试工具)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

深入探究HTTP网络协议栈:互联网通信的基石

在我们日常使用互联网的过程中,HTTP(HyperText Transfer Protocol,超文本传输协议)扮演着至关重要的角色。无论是浏览网页、下载文件,还是进行在线购物,HTTP协议都在背后默默地支持着这些操作。今天&#x…

go语言中的切片详解

1.概念 在Go语言中,切片(Slice)是一种基于数组的更高级的数据结构,它提供了一种灵活、动态的方式来处理序列数据。切片在Go中非常常用,因为它们可以动态地增长和缩小,这使得它们比固定大小的数组更加灵活。…

芯片开发(1)---BQ76905---底层参数配置

主要开发思路:AFE主要是采集、保护功能、均衡,所以要逐一去配置芯片的寄存器 采集、均衡功能主要是配置引脚 保护功能主要是参数寄存器配置,至于如何使用命令修改寄存器参数该系列芯片提供了子命令和直接命令两种方式 BQ76905的管脚配置 I、参数配置 …

使用Renesas R7FA8D1BH (Cortex®-M85)和微信小程序App数据传输

目录 概述 1 系统架构 1.1 系统结构 1.2 系统硬件框架结构 1.3 蓝牙模块介绍 2 微信小程序实现 2.1 UI介绍 2.2 代码实现 3 上位机功能实现 3.1 通信协议 3.2 系统测试 4 下位机功能实现 4.1 功能介绍 4.2 代码实现 4.3 源代码文件 5 测试 5.1 编译和下载代码…

Codeforces Round 974 (Div. 3) A-F

封面原图 画师礼島れいあ 下午的ICPC网络赛的难受一晚上全都给我打没了 手速拉满再加上秒杀线段树 这场简直了啊 唯一可惜的是最后还是掉出了1000名 一把上蓝应该没啥希望了吧 A - Robin Helps 题意 侠盗罗宾因劫富济贫而闻名于世 罗宾遇到的 n n n 人,从 1 s …

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候,由于数据库的表格中含有中文,在使用mysqldump导出sql语句的时候,中文显示乱码,如下图所示: 环境描述 系统:windows10数据库: Mariadb -10.6.16…

linux安装Anaconda3

先将Anaconda3安装包下载好,然后在主文件夹里新建一个文件夹,将Anaconda3安装包拖进去。 打开终端未来不出现缺东西的异常情况,我们先安装 yum install -bzip2然后进入根目录下,在进入Anaconda3文件夹下 sh包安装方式 sh Anac…

动手学深度学习(李沐)PyTorch 第 2 章 预备知识

2.1 数据操作 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 张量表示一个由数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(…

S-Clustr-Simple 飞机大战:骇入现实的建筑灯光游戏

项目地址:https://github.com/MartinxMax/S-Clustr/releases Video https://www.youtube.com/watch?vr3JIZY1olro 飞机大战 这是一个影子集群的游戏插件,可以将游戏画面映射到现实的设备,允许恶意控制来完成游戏。亦或者设备部署在某建筑物中,来控制…