Java网络编程之TCP协议核心机制(一)

目录

题外话

正题

TCP协议核心机制

1.确认应答机制

2.超时重传

3.连接管理

 三次握手(建立数据连接)和四次挥手(断开连接)

三次握手

三次握手的意义

为什么不能是四次挥手和两次挥手呢???

四次挥手(断开连接)

四次挥手的意义

四次挥手能变为三次挥手吗?

小结


 

题外话

最近进入了迷茫期了,可能是我学习能力和心态不足,在宿舍总是静不下心学习,调整调整,正好把最近学的内容再整理复习一遍

正题

本篇博客要讲的TCP协议核心机制属于网络通信中的内容,大多都是概念性内容,也是面试时肯定会考的问题

TCP协议核心机制

关于TCP协议核心机制这里,我也看了好多好多视频什么的,但是感觉讲的不太细致

TCP协议核心机制是保证TCP功能特点创造出来的

TCP协议和UDP协议是传输层(TCP/IP参考模型中的一种)的两种协议,这里直接展示下两种协议的功能特点

1.确认应答机制

此机制实际就是为了保证传输的可靠性 

我们从客户端发送到服务器的数据是通过数据的一串连续的序列号表示的

服务器会向客户端发送数据序列号最后一位加1也就是ACK应答报文来确认数据包是否丢失

如果发生丢包服务器不会返回应答报文,这样就可以保证传输可靠性

如下图(演示的是没有丢包的情况)

2.超时重传

因为网络问题等一系列原因导致客户端发送数据后服务器没有接收到数据

从而在一定时间间隔内,导致客户端没有收到服务器的确认应答数据,就会开始进行超时重传

如下图

我们要说明两个问题

1.超时重传的设置时间

我们要制定超时重传的时间,如果时间过短(比如数据还没传输完成就开始重传),这样就会导致客户端多次发送重复数据

如果时间过长,如果发生网络等问题引起数据一直发送不过去,又因为设置超时时间过长导致数据不重传一直等待,很影响传输效率

针对这个问题,我们需要通过发送数据大小动态调整超时时间,要让在超时时间内可以完成数据传输,又不会因为网络等问题一直等待数据传输影响效率

2.超时重传的频率问题,如果网络一直有问题(比如网速很慢)

我们在正常网速情况下超时时间内可以完成数据传输,但是在网速很慢的情况下超时时间内就无法完成

所以每当进行一次超时重传的时候,会将超时时间按倍数加长,重传频率会变低

Linux中(BSD Unix和Windows也是如此),超时以500ms为⼀个单位进行控制,每次判定超时重发的 超时时间都是500ms的整数倍

累计到⼀定的重传次数,TCP认为网络或者对端主机出现异常,TCP会强制关闭连接

3.超时重传导致传输多个重复数据问题

TCP接收方在操作系统内核中会存在一个数据结构"接收缓冲区",当数据到达接收缓冲区可能是乱序,因为数据发送前序号是从小到大连续的,所以在缓冲区中会将数据从小到大排序,

TCP这边会针对收到的数据按照序号进行去重

3.连接管理

这里我们需要讲解一下三次握手和四次挥手

我们想传输数据进行通信,一定是要先建立客户端和服务器的连接,建立之后才能传输数据

 三次握手(建立数据连接)和四次挥手(断开连接)
三次握手

简单来说就是客户端和服务器需要互相知道对方能接收自己的数据信息

一般都是客户端主动发送请求

比如甲要给乙用语音打电话

1.甲先给乙打过去电话,甲问乙能不能听到

2.乙说能听到,你那边也可以听到吗

3.甲说我这边也可以听到

这样甲和乙就建立了连接,双方都可以收到对方发送的信息

下面咱们庖丁解牛将三次握手逐层分析一下

客户端需要发送数据开始建立连接

1.首先客户端发送SYN(同步)数据包到服务器

当服务器收到SYN数据包知道客户端要开始建立连接

然后服务器发送SYN数据包和ACK数据包,告诉客户端我已经准备好建立连接

2.服务器同时发送SYN(同步)数据包和ACK(确认同步)数据包到客户端

客户端收到服务器可以建立连接的信息后,要告诉服务器,自己也可以建立连接

3.客户端发送ACK(确认同步)数据包到服务器

经过以上三次挥手,服务器和客户端双方都确认对方可以建立连接,从而真正建立连接开始通信

三次挥手状态转换详情图

说一下重要的两个状态

LISTEN状态:服务器出现的状态,当服务器绑定一个端口成功之后会进入LISTEN状态,随时可以有客户端连接

ESABLISHED状态:代表建立连接完成,可以随时进行后续通信

三次握手的意义

三次握手可以确保数据在两个设备之间可靠地传输。它可以防止以下情况的发生:

不会丢失:如果没有三次握手,客户端和服务器可能会同时发送数据,导致数据丢失。

不会重复:如果没有三次握手,客户端和服务器可能会重复发送数据,导致数据重复。

不会乱序:如果没有三次握手,客户端和服务器可能会乱序发送数据,导致数据乱序。

为什么不能是四次挥手和两次挥手呢???

1.我们要建立连接一定是客户端和服务器都知道对方要建立连接并且准备好

2.我们要考虑建立连接的安全性和效率问题(一个SYN数据包会经历层层分装和分用)

3.两次挥手是一定不安全的,而四次挥手完全没有必要

4.三次挥手是在安全和效率都得到保证的情况下的方案

四次挥手(断开连接)

客户端和服务器都可以提出断开连接请求

简单来说客户端和服务器有一方提出断开连接,双方都要关闭资源还要整理一些正在传输的数据,这些都执行完,互相通知对方可以关闭连接

这里还是庖丁解牛一步一步讲解一下

1.客户端发送断开连接请求FIN

2.服务器发送ACK应答,代表自己收到断开连接请求

3.服务器要关闭删除一些数据,之后发送FIN表示可以终端连接

4.客户端发送ACK应答,同意关闭连接

四次挥手的意义

四次挥手可以确保数据在两个设备之间可靠地传输。它可以防止以下情况的发生:

如果没有四次挥手,客户端和服务器可能会同时关闭连接,导致数据丢失。

如果没有四次挥手,客户端和服务器可能会重复发送数据,导致数据重复。

如果没有四次挥手,客户端和服务器可能会乱序发送数据,导致数据乱序。

四次挥手能变为三次挥手吗?

常规情况下不能合并,因为服务器收到FIN会立即发送ACK(由内核控制的)

之后还要整理资源,将正在传输的数据整理完成等操作,这也需要时间,然后调用close的时候服务器才会传输FIN到客户端

这两个操作不是同一时机,难以进行合并

在特殊情况下可以合并上述两个操作,TCP中还有一个机制,"延时应答"(这篇博客先不讲了,内容太多了)

在正常情况下,断开连接肯定要经历四次挥手,所以要考虑最常见的情况,称为四次挥手

小结

总结一下博客内容吧

首先,所有的TCP机制都是在保证TCP的功能特点

TCP要先依靠连接管理机制,进行三次挥手(建立连接),然后才能进行数据通信

数据通信过程中,我们要通过确认应答机制保证不会丢失数据包

在数据传输过程中,我们为了保证数据安全性和传输效率还要依靠超时重传机制

这中间还有一些机制下篇博客再讲

当我们关闭数据通信,也要依靠连接管理机制进行四次挥手(断开连接),才能保证数据正确关闭

如果觉得本人写的不错麻烦家人们给个三连吧(点赞关注收藏!!!)

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

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

相关文章

string功能介绍(普及版)

目录 1。初始化(好几种方式),npos和string的使用说明 2。string的拷贝,隐式类型转换,[],size,iterator,begin,end,reverse,reverse_iterator&am…

基于springboot实现的家具销售电商平台

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…

DELL服务器配置ILO(idrac)地址、修改管理员密码

服务器型号:DELL PowerEdge R630 1、重启服务器选择F2进入BIOS 2、重启服务器选择F2进入BIOS 3、选择“Network” 4、配置iDRAC的IP,掩码网关,DNS等信息 5、Esc返回,下滑选择“User Configuration” 6、配置iDRAC的用户名密码以及…

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP,Lightweight Directory Access Protocol,轻量级目录访问协议. LDAP是一种特殊的服务器,可以存储数据数据的存储是目录形式的,或者可以理解为树状结构(一层套一层)一般存储关于用户、用户…

WD—C++课前作业—30题

怎么会手和脚都在桌子上 目录 31,声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的逆序存放,成员函数 void print()实现 head 内字符串的输出。…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 编写Java源代码文件。使用…

Python轻量级Web框架Flask(14)—— 自己做Flask项目总结

0、前言: 本文意在记录自己在做毕业Flask项目开发时遇到的一些问题,并将问题解决方案记录下来,可做日后查询本文也会记录自己做FLask项目时实现的一些功能,作为开发工作的进程记录注意:用Flask开发的前提是已经设计好…

Java | Leetcode Java题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> grayCode(int n) {List<Integer> ret new ArrayList<Integer>();for (int i 0; i < 1 << n; i) {ret.add((i >> 1) ^ i);}return ret;} }

mongodb备份还原指南

MongoDB 提供的命令行实用程序mongodump和mongorestore创建备份和恢复数据的过程。 一、数据备份 mongorestore和mongodump实用程序可处理BSON数据转储&#xff0c;对于创建小型部署的备份非常有用。要实现弹性且无中断的备份&#xff0c;请将文件系统快照或区块级磁盘快照与…

串联所有单词的子串 ---- 滑动窗口

题目链接 题目: 分析: 我们上次做的题目, 是找到所有字符的异位词, 和这道题有些类似, 使用记录有效字符的个数找到子字符, 此题无非是把字符变成了字符串题目回顾 有一下几方面不同, 我们以示例1为例: 1. 哈希表 上次我们使用的是哈希数组, 因为数组的下标可以是字符, 现…

常类API(Math,System,Runtime)

1、Math 是帮助我们用于进行数学计算的工具类私有化构造方法&#xff0c;所有的方法都是静态的 方法名 说明public static int abs(int a) 获取参数绝对值 public static double ceil(int a)向上取整public static double floor(int a)向下取…

java项目之教学辅助平台(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教学辅助平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 教学辅助平台的主要使用者分…

如何在 Ubuntu 12.10 上使用 Python 创建 Nagios 插件

介绍 Python 是一种在 Linux 上默认可用的流行命令处理器。 我们之前已经介绍过如何在 Ubuntu 12.10 x64 上安装 Nagios 监控服务器。 这一次&#xff0c;我们将扩展这个想法&#xff0c;使用 Python 创建 Nagios 插件。 这些插件将在客户 VPS 上运行&#xff0c;并通过 NR…

Java String转JSONObject时保持字段顺序不变

Java String转JSONObject时保持字段顺序不变 问题背景解决方案 问题背景 在业务接口开发过程中&#xff0c;有一个新增接口&#xff0c;需要支持批量新增数据&#xff0c;这时入参就需要用到 json 格式数据&#xff0c;且包含 list 集合&#xff0c;比如这样的数据格式&#x…

windows11 Django环境安装

相关文档 1、验证python和pip3环境 C:\Users\Administrator>python Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for…

基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..............................................................I0 imresize…

QX----mini51单片机学习---(7)矩阵键盘

目录 1矩阵键盘的识别 2相关c语言 3实践编程 1矩阵键盘的识别 假设按列扫描按下S6P30&#xff1a;0P34&#xff1a;1然后高流向低&#xff0c;P34&#xff1a;0&#xff0c;刚开始是0xf0&#xff1a;1111 0000 后面是0xe0&#xff1a;1110 0000 &#xff0c;当是0xe0能确…

MySQL用SQL取三列中最大的数据值

1、有如下数据&#xff1a; ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式&#xff1a; ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…

Spring Cloud系列—Spring Cloud Gateway服务网关的部署与使用指南

Gateway网关 文章目录 Gateway网关1. 网关基本简介1.1 什么是网关1.2 为什么需要网关&#xff1f; 2. 快速搭建gateway网关2.1 创建新模块2.2 引入依赖2.3 编写启动类2.4 配置路由规则2.5 测试 3. 路由过滤4. 过滤器4.1 简介4.2 网关过滤器4.2.2 种类 4.3 自定义过滤器4.3.1 自…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一&#xff0c;退一还三”的机制&#xff0c;平衡三进制与之类似&#xff0c;但就是偏移了一下变得对称了&#xff0c;平衡三进制与标准三进制可以相互转换&#xff0c;但这样显得有点多余了&#xff0c;所以这里只讲平衡三进制与十进制的转换。 数字系统的…