当前位置: 首页 > news >正文

JavaEE-轻松了解网络原理之TCP协议

目录

  • TCP协议
    • TCP协议数据格式
    • TCP原理
      • 确认应答
      • 超时重传
      • 连接管理
        • 三次握手
        • 四次挥手
      • 滑动窗口
      • 流量控制
      • 拥塞控制
      • 延迟应答
      • 捎带应答
      • 面向字节流
      • 异常问题

TCP协议

TCP,即Transmission Control Protocol,传输控制协议.

TCP协议数据格式

在这里插入图片描述

  • 16位源端口号与16位目的端口号表示数据从那个进程来要到那个进程去.
  • 32位序号表示一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号(TCP将每个字节的数据都进行了编号,称为序列号).
  • 32为确认序号表示接收方对发送的tcp报文段的响应。 其值是收到的TCP报文段的序号值加1.
  • 4位TCP报文长度表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大长度是15 * 4 = 60字节.

6位标志位:
URG:表示紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:表示复位连接,也就是重新建立连接
SYN:表示同步,把携带SYN标识的称为同步报文
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

  • 16位窗口大小:表示接收端TCP 能最大提供65535个字节的缓冲.
  • 16位校验和:发送方通过以TCP报头与报文数据进行一定数学计算得到的结果填充于此,接收方以相同数学方法进行计算,如果校验和相同则校验成功.
  • 16位紧急指针:标识哪部分数据是紧急数据.

TCP原理

确认应答

接收到发送方的数据后,会返回发送一个带有接收数据的最后一个字节的下一个字节序号的ACK报文.

比如接收到的最后一个字节序号为1000,则返回的序号为1001,代表前1000个字节数据已经全部收到.

为解决后发先至,tcp会有一个接收缓冲区(内核中的内存空间),每个socket都有一份自己的接受缓冲区,tcp可在缓冲区对收到的消息根据序列号进行整队.

超时重传

网络传输可能会出现丢包的情况:

  1. 发送的数据报接受方没有收到
  2. 接受方收到后,发回的ack报文传输过程中丢失.

应对策略
发送方没有收到ack应答报文,就会隔一段时间进行报文重发,随着重发次数的增加,间隔时间也会增长,连续多次重传后还是无法获取ack报文,此时tcp就会尝试重置连接,如果重置失败,则会释放连接(TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间).

如果收到重发数据,数据重复,tcp会根据收的数据序号自动进行去重

问tcp如何实现可靠性的?

  答:确认应答+超时重传

连接管理

三次握手

在这里插入图片描述
上述过程由内核自动完成,应用程序干预不了.
握手☞的是通信双方进行一次网络交互,相当于客户端与服务器端,通过三次交互,建立了连接(双方各自记录对方的信息)
三次握手的目的就是为了投石问路,验证客户端和服务器端,各自的发送能力与接受能力是否正常!

客户端向服务器发送SYN报文问服务器你准备好了没,服务器返回SYN+ACK报文说我准备好了,你呢?客户端发送ACK告诉服务器我准备好了,到此连接建立成功.

四次挥手

在这里插入图片描述
进行断开连接,断开连接服务器与客户端都有可能先进行发起FIN结束报文.
为什么是四次挥手而不是三次挥手呢?
ack与fin有一定概率合并成为一个的!!但通常情况下不能合并!
ack与fin是不会同时触发的,因为ack是系统内核完成的,而fin而是由应用程序来进行控制的,调用socket的close方法才会触发fin!!!

滑动窗口

发送方一次发多条数据到一定程度停止发送,发送方一次等待多个ack,收到一条ack报文发送一条数据,形似一个滑动的窗口.
在这里插入图片描述

在这里插入图片描述
出现丢包情况:

  1. 数据包到达,ACK报文丢失
    这种情况没啥影响,只要最后几个ack报文收到,就表明前面的ack也都收到了(确认序号的含义表示的是该序号之前的所有数据都已经收到).
  2. 数据包未到达
    在这里插入图片描述

如果是这种情况,应答报文一直显示已经接受到了1001,1001到2000会超时重传,而后面数据的接受是不会受影响的,当1001到2000接受到后,会直接返回已接受数据的最后一个字节的下一个字节的序号.
上述超时重传称为快述重传.

流量控制

本质就是让接收方来限制一下发送方的速度-根据接收端的处理能力,来决定发送端的发送速度.
当ACK报文头部的ack位为1时,报头的窗口大小字段就会生效,返回一个窗口大小来决定发送方发送的速度.
当发送方,发现对方接收缓冲区满了之后,就会暂停发送,但仍然会每隔一段时间触发一个"窗口探测"报文,如果探测一会发现窗口大小不为0,则继续发送.

拥塞控制

TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据.
衡量了传输路径的处理能力–木桶效应(传输路劲上某一个路由器可用传输速率很小,那么这个路由器的传输能力即为传输路径上的最大传输能力)
通过实验的方式,找到一个合适的发射速率–先开始以一个较小的速率发送,不丢包的情况下提高速率,如果丢包,立即调小速率. 达到一个动态平衡.

    实际发送的窗口大小=将拥塞窗口和接收端主机反馈的窗口大小(流量控制窗口)做比较,取较小的值作为

实际发送的窗口
在这里插入图片描述
此图描述: 拥塞窗口先以一个较小值进行传输,无丢包情况下速率开始以指数形式增长,达到一定阈值后以线性进行增长(避免一下子超过上限很多),当开始出现丢包情况时认为当前窗口已达路径上限,且窗口回到一个较小值,阈值更新为为上限的一半;

延迟应答

延时应答的核心在于让ACK应答报文稍微延时一会儿应答,那么此时应答报文中的接受方缓冲区大小大概率比立即返回大一点(应用程序一直从接收缓冲区读取数据),此时发送方可发送的数据就会多一点.
窗口越大,网络吞吐量就越大,传输效率就越高,在保证网络不拥塞的情况下尽量提高传输效率
数量限制:每隔N个包就应答一次;
时间限制:超过最大延迟时间就应答一次;

捎带应答

接收方的应答报文ack稍等一会接收方的响应报文 二者合并为一个数据报进行发送可提高效率.
捎带应答的效果----四次挥手有可呢三次挥完.

面向字节流

粘包问题
A连续给B发送了多个应用层数据报,这些数据就会堆积在B的接收缓冲区,此时B的应用程序再去读这些数据报就会很难分清楚那个是一个完整的数据报,很容易读半个(在TCP的协议头中,没有如同UDP一样的 “报文长度” 这样的字段,站在应用层的角度,看到的只是一串连续的字节数据,不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包).
解决方法:

  1. 约定分割符.
  2. 约定长度(例如约定数据的前四个字节,用来表示数据报的长度).

异常问题

  1. 进程关闭/进程崩溃
    进程没有了,socket是文件,随之关闭,虽然进程没有了,但是连接还在,可进行正常四次挥手.
  2. 主机关机
    所有用户进程被关闭,触发四次挥手,如果没有挥完,比如服务器端发来fin ,客户端没来及ack就关机了.
    此时对端就会重转fin…重传几次后发现没有ack后尝试重置连接,没有成功后就释放连接.
  3. 断电/断网
    1. 如果对方是发送方
      对方就会收不到ack=>超时重传->重置连接->释放连接
    2. 如果对方是接受端
      对方是无法立即知道,你这边是没来得及发数据还是直接没了
      这使tcp的心眺包 保活机制就体现作用了

接收方定期给发送方发送一个心跳包如果有响应就说明对端还存活,如果没有响应而说明对端已经挂了(心跳包时周期性的并没有那么及时,并且判断也没有那么严格).

相关文章:

JavaEE-轻松了解网络原理之TCP协议

目录 TCP协议TCP协议数据格式TCP原理确认应答超时重传连接管理三次握手四次挥手 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流异常问题 TCP协议 TCP,即Transmission Control Protocol,传输控制协议. TCP协议数据格式 16位源端口号与16位目的端…...

薪资17K是一个怎样的水平?来看看98年测试工程师的面试全过程…

我的情况 大概介绍一下个人情况,男,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,然而到今天都没有收到一份offer!从年后就开始准备简历,年…...

OpenCV3 和 Qt5 计算机视觉:11~12

原文:Computer Vision with OpenCV 3 and Qt5 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,…...

R包编写流程

文章目录 所需工具Step 1: 创建R项目Step 2: 在R文件夹中添加函数Step 3: 编辑元数据Step 4: 文档化Step 5: 检查包Step 6: 打包重要参考: 所需工具 R包的编写需要的工具包有:devtools,Rtools Step 1: 创建R项目 devtools::create_package…...

试验GPT写文章书

试验GPT写文章书 写一本名叫《寻找人生目标的十种方法》 回答 2023/4/22 16:12:31 很高兴为您提供以下内容,这是一本关于寻找人生目标的十种方法的建议和思考。 《寻找人生目标的十种方法》 第一章:明确自己的价值观 了解自己内心真正想要追求的东…...

class与typename的异同

一、class与typename的相同点 typename关键字常用于函数模板,这里首先引入函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本 //函数模板格式…...

OpenCV 图像处理学习手册:6~7

原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,…...

Java中的序列化与反序列化(一)

1、概述 大家好,我是欧阳方超。今天来看一下Java序列化与反序列化的问题。 2、序列化与反序列化 2.1、序列化与反序列化的概念 在Java中,序列化是将对象转换为可存储或传输的格式(一般为字节流)的过程,序列化后的字…...

3.函数、结构体、包

一、函数定义和调用 package mainimport ("fmt" )func test() {fmt.Println("hello world") } func main() {test() }二、函数的参数 1.单个参数 func test(n int) {fmt.Println("传递进来的参数是", n) } func main() {test(10) }2.多个参数…...

科普丨关于 A/B 测试的十问十答

你想知道的,都在这里!本文是神策数据「十问十答」科普系列文章的第二期,围绕 A/B 测试展开。 1 Q:什么是 A/B 测试? A:A/B 测试作为互联网企业的核心增长手段之一,其价值已在实际应用中被多次验…...

尚融宝——整合OpenFeign与Sentinel实现兜底方法——验证手机号码是否注册功能

一、整合过程 在项目添加依赖&#xff1a;添加位置 <!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 在需要的服务中添加启动注…...

几种常见的激活函数

文章目录 常见的激活函数介绍Sigmoid函数ReLU函数LeakyReLU函数Tanh函数Softmax函数总结 常见的激活函数介绍 激活函数是神经网络中的重要组成部分&#xff0c;它决定了神经元的输出。在神经网络的前向传播中&#xff0c;输入数据被传递给神经元&#xff0c;经过加权和和激活函…...

MySQL-数据库,数据表的基本操作

数据库&#xff0c;数据表的基本操作 1 数据库的基本操作1.1 创建数据库1.2 删除数据库 2 数据表的基本操作2.1 创建数据表2.1.1 主键约束2.1.2 外键约束2.1.3 非空约束2.1.4 唯一性约束2.1.5 默认约束2.1.6 自增列 2.2 查看数据表结构2.2.1 查看表基本结构语句DESC2.2.2 查看表…...

IC-14W网络IC卡读写器_银河麒麟桌面操作系统V10适配测试报告

银河麒麟操作系统产品NeoCertify 认证测试报告 系统版本&#xff1a;银河麒麟桌面操作系统V10 厂商名称&#xff1a; 广州荣士电子有限公司 认证产品&#xff1a;IC-14W网络IC卡读写器 测试日期&#xff1a; 2022-11-04 …...

面试常见问题

1.自我介绍 面试官您好&#xff0c;我叫**&#xff0c;在招聘网站上看到了公司的介绍和岗位要求&#xff0c;觉得非常有吸引力&#xff0c;结合自己的过往经历&#xff0c;也感觉自己能够胜任&#xff0c;所以很高兴能有这次面试机会。 参与工作已经5年了&#xff0c;18年毕业于…...

matlab数据归一化与反归一化处理

假如数据实际取值范围为 X i ∈ [ − π π ] , i 1 , 2 , 3 X_i \in [-\pi \ \ \pi], i1,2,3 Xi​∈[−π π],i1,2,3&#xff0c;变量服从正态分布 示例如下&#xff1a; %% 数据归一化处理及其概率密度函数 clear clc Mu [0 0 0]; % 均值 Sigma [1 1 1]; % 标准差 C…...

【杂凑算法篇】密码杂凑算法的安全强度

【杂凑算法篇】密码杂凑算法的安全强度 杂凑&#xff08;哈希&#xff09;算法安全强度—【蘇小沐】 文章目录 【杂凑算法篇】密码杂凑算法的安全强度&#xff08;一&#xff09;安全强度&#xff08;Security Strength)&#xff08;二&#xff09;杂凑算法的安全强度与对比总…...

【RobotFramework自动化测试】

robotframework介绍 RF是一个基于Python语言开发的&#xff0c;可扩展的&#xff0c;是以关键字驱动模式的自动化测试框架。RF最新的版本是2019 年7月份发布&#xff0c;7月份之前只支持python2.7&#xff0c;7月之后支持3.X的版本 robotframework的安装 安装python环境&…...

操作系统原理 —— 什么是中断?(四)

我们先来看看早期的计算机的工作流程&#xff1a; 如上图&#xff0c;在早期的计算机假设有三个程序需要执行&#xff0c;执行顺序是&#xff1a;先执行程序1&#xff0c;等待程序1结束之后&#xff0c;再开始执行程序2&#xff0c;以此类推&#xff0c;所以它们是串行执行的…...

SA168 3BSE003389R1

SA168 3BSE003389R1 远程终端控制系统&#xff08;RTU&#xff09;可连接到其他设备。RTU可将设备上的电气信号转换为数字的值&#xff0c;例如一个开关或阀开/关的状态&#xff0c;或是仪器量测到的压力、流量、电压或电流。也可以借由信号转换及传送信号来控制设备&#xff0…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...