JAVAEE之网络原理(2)_传输控制协议(TCP)、概念、格式、确认应答及超时重传机制

前言

 在上一节中,我们介绍了 UDP (用户数据报) 的相关知识,在这一节中我们将继续介绍传输层中另一种更为重要的协议。


一、什么是TCP协议?

1.1 TCP 基本概念

 TCP协议全称:传输控制协议(TCP,Transmission Control Protocol),它是是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。TCP通信一般指客户端和服务端通信。
 在Java中,一般使用SocketServer和Socket这两个类实现TCP通信,前者为服务端的一个实体,而后者可以认为是一种对连接的封装。一般来说,需要先启动服务端,然后客户端才能向服务端发送连接请求,连接成功后,两端就可以互相通信了。

1.2 TCP协议段格式

在这里插入图片描述

源端口(source port ) 和 目的端口(destination port)

 它们的长度都为 16 位,分别表示报文 发送方 的端口号 和 接收方 的端口号。

序号

 序号( sequence number )字段,长度为 32 位,表示数据首字节的序号。在三次握手阶段,SYN 指令也是通过该字段,将本端选定的 起始序号 告诉接收方。

确认号

 确认号 ( acknowledgement number )字段,长度为 32 位。它表示已确认收到的数据序号,它的值为:已收到数据最后一个字节的序号加一,即接收方期望进一步接收的数据序号。

首部长度

 首部长度 ( header length )字段,长度为 4 位,表示 TCP 报文首部的长度,也可称为 数据偏移 ( data offset )。跟 IP 协议一样,TCP 首部长度字段也不是以字节为单位,而是以 32 位字(4字节)为单位。

字( word )是计算机领域中的一个概念,表示由一系列比特组成的数据单位。字的长度可长可短,常见的有 8 位字、16 位字以及 32 位字等等。

 这个字段长度为 4 位,最大值为 2 4 − 1 = 15 {{2}^{4}}-1=15 241=15 。因此,TCP 头部最大长度只能达到 4 × 15 = 60 4\times 15=60 4×15=60 字节。

6位标志位

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

窗口大小

 窗口大小( window size )字段长度为 16 位,表示当前报文发送者接收窗口的大小,单位一般是 字节 。接收窗口表示接收方还能接收的数据大小,用于实现 TCP 流量控制机制。

校验和

 校验和( checksum )发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。除此之外,TCP 还会在报文段前面拼接一个 IP 伪头部,同时参与校验和计算。

16位紧急指针

标识哪部分数据是紧急数据;

二、TCP原理

 TCP对数据提供的管控机制,主要体现在两个方面:安全和效率。这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率

1. 确认应答机制(安全机制)

在这里插入图片描述
TCP将每个字节的数据都进行了编号。即为序列号。
在这里插入图片描述
 每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

2.2 超时重传机制(安全机制)

在这里插入图片描述

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发。

但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;
在这里插入图片描述
 因此主机B会收到很多重复数据。那么TCP协议需要能够识别出那些包是重复的包,并且把重复的丢弃掉。这时候我们可以利用前面提到的序列号,就可以很容易做到去重的效果。
那么,如果超时的时间如何确定?

  • 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”;
  • 但是这个时间的长短,随着网络环境的不同,是有差异的;
  • 如果超时时间设的太长,会影响整体的重传效率;
  • 如果超时时间设的太短,有可能会频繁发送重复的包。

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间。

  • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定
    超时重发的超时时间都是500ms的整数倍;
  • 如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传;
  • 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增;
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

2.3 连接管理机制(安全机制)

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

三次握手

在这里插入图片描述
握手过程可以简化为下面的四次交互:

  1. clien 端首先发送一个 SYN 包告诉 Server 端我的初始序列号是 X;
  2. Server 端收到 SYN 包后回复给 client 一个 ACK 确认包,告诉 client 说我收到了;
  3. 接着 Server 端也需要告诉 client 端自己的初始序列号,于是 Server 也发送一个 SYN 包告诉 client 我的初始序列号是Y;
  4. Client 收到后,回复 Server 一个 ACK 确认包说我知道了。

总结

 以上就是今天要讲的内容,本文仅仅简单介绍了传输控制协议(TCP)的相关概念,基本报文格式。此外,还介绍了TCP原理,包括确认应答机制,超时重传机制,并且还简单介绍了连接管理机制中的三次握手,在本栏的下一节我们将会继续介绍TCP原理。

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

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

相关文章

Prometheus配置文件与核心功能

Prometheus配置文件与核心功能 环境部署完成以后,我们就需要对产品进行稳定性监控。在知道怎么监控收集数据之前,我们需要知道prometheus的配置文件和核心功能 全局配置文件 首先我们从针对prometheus的全局文件进行说起,首先进入promethe…

springboot宠物医院信息管理系统-计算机毕业设计源码04164

摘 要 现如今在中国,随着人民生活质量的逐渐提高,以及人民群众消费能力的日渐增长,各种各样的家养小动物,已经逐渐成为人类越来越亲密的生活伴侣。并且,现如今社会竞争及其激烈,人们的生活节奏越发急促、紧…

【免费API推荐】:满足您的开发需求,加速项目上线

免费API助力项目开发,为开发者们提供了强大的支持和工具。这些API提供了各种功能和服务,能够帮助项目开发者们快速构建出高质量的应用。无论是地理位置服务、支付接口、社交媒体集成还是图像识别,这些免费API为项目开发者们提供了丰富的功能和…

图解ZGC

ZGC(Z Garbage Collector) 是一款性能比 G1 更加优秀的垃圾收集器。ZGC 第一次出现是在 JDK 11 中以实验性的特性引入,这也是 JDK 11 中最大的亮点。在 JDK 15 中 ZGC 不再是实验功能,可以正式投入生产使用了,使用 –X…

Axure8.0实例|数量编辑器

Axure8.0实例|数量编辑器 一、元件准备 1、添加三个矩形框,分别取名为“减少数量”、“数量背景”、“增加数量”。“减少数量”矩形框中输入“-”号,“增加数量”矩形框中输入“”号,待用; 2、添加一个文本框&#…

高等数学笔记(一):映射与函数

一、映射 1.1 映射的概念 存在一个法则 f ,使得对 X 中每个元素 x ,在 Y 中有唯一确定的元素 y 与之对应(X、Y 非空集) 称 f 为从 X 到 Y 的映射,如图所示 其中 y 称为元素 x(在映射 f 下)的…

通过LotusScript中的NotesDateTime类来进行时间计算

大家好,才是真的好。 今天我们介绍的是时间日期处理,其实以前也讲过,主要是通过LotusScript中的NotesDateTime类来进行时间计算。 但是这里也存在一个问题:就是时间日期类的比较只能计算出秒,不能计算出毫秒。 毕竟…

手写一个JSON可视化工具

前言 JSON 平时大家都会用到,都不陌生,今天就一起来实现一个 JSON 的可视化工具。 大概长成下面的样子: 树展示 相比于现有的一些 JSON 格式化工具,我们今天制作的这个小工具会把 JSON 转为树去表示。其中: 橙色标…

Cloneable接口和对象的克隆——浅拷贝和深拷贝

用Clonable接口实现对象的克隆——浅拷贝和深拷贝 1. 浅拷贝2. 深拷贝 在Object类中提供了clone方法,用来是实现对象的克隆! 1. 浅拷贝 我们首先来尝试用clone方法去克隆一个Person对象 public class Person {public String name;public int age;publi…

数据驱动决策:工单统计工具如何赋能企业精准运营

在当今这个数字化飞速发展的时代,企业对于内部运营效率的追求已经达到了前所未有的高度。你是否曾为了繁杂的工单统计管理而头疼不已?是否曾因为无法准确进行工单统计数据而错失商机?今天,我将向你展示一款革命性的工单统计工具&a…

企业为何需要搭建线上虚拟品牌展厅?

在数字化时代,线上虚拟品牌展厅已成为企业不可或缺的一部分。以下是构建线上虚拟品牌展厅的4大关键理由: 1、迎合在线购物趋势 随着移动互联网的飞速发展和普及,消费者越来越倾向于在线购物。一个线上虚拟品牌展厅能够完美地满足这一需求&am…

一个按钮更改Notes字体大小

大家好,才是真的好。 在说到正文以前,我们还是提两句,上周HCL发布了Notes/Domino 12.0.2FP4补丁,以及在亚马逊云应用市场上架了HCL Domino 14.0。 现在谈谈正文部分。 随着岁月飞逝,使用Notes的人也开始日渐眼花&a…

基于WPF技术的换热站智能监控系统17--项目总结

1、项目颜值,你打几分? 基于WPF技术的换热站智能监控系统01--项目创建-CSDN博客 基于WPF技术的换热站智能监控系统02--标题栏实现-CSDN博客 基于WPF技术的换热站智能监控系统03--实现左侧加载动画_wpf控制系统-CSDN博客 基于WPF技术的换热站智能监…

AI时代的数据治理:挑战与策略

随着人工智能(AI)技术的突飞猛进,我们已迈进智能时代的大门。在这个新时代里,数据无疑成为推动AI创新与进步的核心力量。然而,与此同时,数据治理的紧迫性也日益凸显,它成为确保AI系统有效、公正…

Nginx实战:故障处理_后端服务正常,nginx偶发502(Bad Gateway)

一、故障场景 用户访问服务偶发报错【502 Bad Gateway】,但是服务后端正常运行。架构如下: #mermaid-svg-4dDszusKEuPgIPlt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4dDszusKEuPgIPlt…

mysql8.x安装教程,window版本

mysql8.x安装教程,window版本 1. 安装步骤 1. 安装步骤 下载暗安装包,https://dev.mysql.com/downloads/file/?id528489 双击安装包,然后按照下述步骤操作 选择custom,然后点击next 如图选中,mysql server和mysq…

vuex computed获取mapGetters,字典的值不能实时更新

实际原因,深浅拷贝的问题 字典dicts中包含很多类型字典,是个object,原来代码 修改后代码 computed中通过mapGetters获取

计算机网络5:运输层

概述 进程间基于网络的通信 计算机网络中实际进行通信的真正实体,是位于通信两端主机中的进程。 如何为运行在不同主机上的应用进程提供直接的逻辑通信服务,就是运输层的主要任务。运输层协议又称为端到端协议。 运输层向应用层实体屏蔽了下面网络核心…

视频太大了怎么缩小内存

我们在分享视频的时候,有时候会遇到过视频文件太大,无法发送或者上传的情况,别担心,今天我就来给大家分享一个简单有效的方法,让你的视频变得更小,更方便分享! 打开 “51视频处理官网 的网站。上…

msvcp100.dll已加载但找不到入口点的处理方法,分析比较靠谱的msvcp100.dll解决方法

用户在日常使用中有时会遇到一个错误提示:“已加载 msvcp100.dll,但找不到入口点”。这一信息不仅引发了使用上的不便,也对软件的稳定性产生了质疑。理解并解决该问题不仅对确保计算机正常运行至关重要,也对维护软件的长期稳定性和…