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可在缓冲区对收到的消息根据序列号进行整队.
超时重传
网络传输可能会出现丢包的情况:
- 发送的数据报接受方没有收到
- 接受方收到后,发回的ack报文传输过程中丢失.
应对策略
发送方没有收到ack应答报文,就会隔一段时间进行报文重发,随着重发次数的增加,间隔时间也会增长,连续多次重传后还是无法获取ack报文,此时tcp就会尝试重置连接,如果重置失败,则会释放连接(TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间).
如果收到重发数据,数据重复,tcp会根据收的数据序号自动进行去重
问tcp如何实现可靠性的?
答:确认应答+超时重传
连接管理
三次握手
上述过程由内核自动完成,应用程序干预不了.
握手☞的是通信双方进行一次网络交互,相当于客户端与服务器端,通过三次交互,建立了连接(双方各自记录对方的信息)
三次握手的目的就是为了投石问路,验证客户端和服务器端,各自的发送能力与接受能力是否正常!
客户端向服务器发送SYN报文问服务器你准备好了没,服务器返回SYN+ACK报文说我准备好了,你呢?客户端发送ACK告诉服务器我准备好了,到此连接建立成功.
四次挥手
进行断开连接,断开连接服务器与客户端都有可能先进行发起FIN结束报文.
为什么是四次挥手而不是三次挥手呢?
ack与fin有一定概率合并成为一个的!!但通常情况下不能合并!
ack与fin是不会同时触发的,因为ack是系统内核完成的,而fin而是由应用程序来进行控制的,调用socket的close方法才会触发fin!!!
滑动窗口
发送方一次发多条数据到一定程度停止发送,发送方一次等待多个ack,收到一条ack报文发送一条数据,形似一个滑动的窗口.
出现丢包情况:
- 数据包到达,ACK报文丢失
这种情况没啥影响,只要最后几个ack报文收到,就表明前面的ack也都收到了(确认序号的含义表示的是该序号之前的所有数据都已经收到). - 数据包未到达
如果是这种情况,应答报文一直显示已经接受到了1001,1001到2000会超时重传,而后面数据的接受是不会受影响的,当1001到2000接受到后,会直接返回已接受数据的最后一个字节的下一个字节的序号.
上述超时重传称为快述重传.
流量控制
本质就是让接收方来限制一下发送方的速度-根据接收端的处理能力,来决定发送端的发送速度.
当ACK报文头部的ack位为1时,报头的窗口大小字段就会生效,返回一个窗口大小来决定发送方发送的速度.
当发送方,发现对方接收缓冲区满了之后,就会暂停发送,但仍然会每隔一段时间触发一个"窗口探测"报文,如果探测一会发现窗口大小不为0,则继续发送.
拥塞控制
TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据.
衡量了传输路径的处理能力–木桶效应(传输路劲上某一个路由器可用传输速率很小,那么这个路由器的传输能力即为传输路径上的最大传输能力)
通过实验的方式,找到一个合适的发射速率–先开始以一个较小的速率发送,不丢包的情况下提高速率,如果丢包,立即调小速率. 达到一个动态平衡.
实际发送的窗口大小=将拥塞窗口和接收端主机反馈的窗口大小(流量控制窗口)做比较,取较小的值作为
实际发送的窗口
此图描述: 拥塞窗口先以一个较小值进行传输,无丢包情况下速率开始以指数形式增长,达到一定阈值后以线性进行增长(避免一下子超过上限很多),当开始出现丢包情况时认为当前窗口已达路径上限,且窗口回到一个较小值,阈值更新为为上限的一半;
延迟应答
延时应答的核心在于让ACK应答报文稍微延时一会儿应答,那么此时应答报文中的接受方缓冲区大小大概率比立即返回大一点(应用程序一直从接收缓冲区读取数据),此时发送方可发送的数据就会多一点.
窗口越大,网络吞吐量就越大,传输效率就越高,在保证网络不拥塞的情况下尽量提高传输效率
数量限制:每隔N个包就应答一次;
时间限制:超过最大延迟时间就应答一次;
捎带应答
接收方的应答报文ack稍等一会接收方的响应报文 二者合并为一个数据报进行发送可提高效率.
捎带应答的效果----四次挥手有可呢三次挥完.
面向字节流
粘包问题
A连续给B发送了多个应用层数据报,这些数据就会堆积在B的接收缓冲区,此时B的应用程序再去读这些数据报就会很难分清楚那个是一个完整的数据报,很容易读半个(在TCP的协议头中,没有如同UDP一样的 “报文长度” 这样的字段,站在应用层的角度,看到的只是一串连续的字节数据,不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包).
解决方法:
- 约定分割符.
- 约定长度(例如约定数据的前四个字节,用来表示数据报的长度).
异常问题
- 进程关闭/进程崩溃
进程没有了,socket是文件,随之关闭,虽然进程没有了,但是连接还在,可进行正常四次挥手. - 主机关机
所有用户进程被关闭,触发四次挥手,如果没有挥完,比如服务器端发来fin ,客户端没来及ack就关机了.
此时对端就会重转fin…重传几次后发现没有ack后尝试重置连接,没有成功后就释放连接. - 断电/断网
- 如果对方是发送方
对方就会收不到ack=>超时重传->重置连接->释放连接 - 如果对方是接受端
对方是无法立即知道,你这边是没来得及发数据还是直接没了
这使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实现兜底方法——验证手机号码是否注册功能
一、整合过程 在项目添加依赖:添加位置 <!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 在需要的服务中添加启动注…...

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

MySQL-数据库,数据表的基本操作
数据库,数据表的基本操作 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 认证测试报告 系统版本:银河麒麟桌面操作系统V10 厂商名称: 广州荣士电子有限公司 认证产品:IC-14W网络IC卡读写器 测试日期: 2022-11-04 …...

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

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

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

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

操作系统原理 —— 什么是中断?(四)
我们先来看看早期的计算机的工作流程: 如上图,在早期的计算机假设有三个程序需要执行,执行顺序是:先执行程序1,等待程序1结束之后,再开始执行程序2,以此类推,所以它们是串行执行的…...

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

基于Java+Springboot+Vue+elememt美食论坛平台设计实现
基于JavaSpringbootVueelememt美食论坛平台设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…...

Go Etcd
基本操作 go get go.etcd.io/etcd/client/v3# 此处使用的 版本是: # go.etcd.io/etcd/client/v3 v3.5.8这里使用的是 "go.etcd.io/etcd/client/v3" 而不是 "go.etcd.io/etcd/clientv3" 我们不使用 etcd/clientv3,因为它与grpc 最新…...

01、Cadence使用记录之新建工程与基础操作(原理图绘制:OrCAD Capture CIS)
01、Cadence使用记录之新建工程与基础操作(原理图绘制:OrCAD Capture CIS) 硕士学电磁场去了,写点博客记录下学习过程。 参考的教程是B站的视频:allegro软件入门视频教程全集100讲 本科的时候就对Cadence有所耳闻&am…...

Redis数据结构与对象-链表和字典
1、链表 其实个人感觉redis的链表内容和其他的差不多。就是一个listNode结构,里面又指向前置节点和后置节点的指针。 然后redis链表可以保存各种不同类型的值。 链表被广泛用于实现redis的各种功能,比如列表键、发布与订阅、慢查询、监视器等。 2、字典…...

学系统集成项目管理工程师(中项)系列08a_合同管理(上)
1. 合同(Contract) 1.1. 契约 1.2. 广义概念 1.2.1. 以确定各种权利与义务为内容的协议,即只要是当事人之间达成的确定权利义务的协议均为合同,不管它涉及哪个法律部门及何种法律关系 1.2.2. 合同除应包括民法中的合同外&…...

【Linux 裸机篇(四)】I.MX6ULL C语言 LED 驱动
文章目录 一、汇编搭建 C 语言环境二、C 语言编写三、编写 Makefile四、链接脚本 一、汇编搭建 C 语言环境 实际工作中是很少用到汇编去写嵌入式驱动的,大部分情况下都是使用 C 语言去编写的。只是在开始部分用汇编来初始化一下 C 语言环境,比如初始化 D…...

我也曾经因安装库而抓狂,直到我遇到了
入门教程、案例源码、学习资料、读者群 请访问: python666.cn 大家好,欢迎来到 Crossin的编程教室 ! 几乎所有的 Python 学习者都遇到过“安装”方面的问题。这些安装问题包括 Python 自身环境的安装、第三方模块的安装、不同版本的切换&…...

DDPG算法详解
DQN算法详解 一.概述 概括来说,RL要解决的问题是:让agent学习在一个环境中的如何行为动作(act), 从而获得最大的奖励值总和(total reward)。 这个奖励值一般与agent定义的任务目标关联。 agent需要的主要学习内容:第一是行为策略…...

继续学c++
由于c里面有很多和c语言很像的东西,这里就来总结一点不像的或者要注意的,或者是我已经快忘记的; 先来一个浮点型也就是实型类型的总结; 知道浮点型有这两个类型:float和double型; 然后float型占四个字节…...

Day949.遗留系统之殇:为什么要对遗留系统进行现代化? -遗留系统现代化实战
遗留系统之殇:为什么要对遗留系统进行现代化? Hi,我是阿昌,今天学习记录是关于遗留系统之殇:为什么要对遗留系统进行现代化?的内容。 不知道你是否跟曾经一样,身处一个遗留系统的漩涡之中&…...