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,一经查实,立即删除!

相关文章

leetcode题目9

回文数 简单 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数:是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 思路 对于数字进行反转&a…

基础环境配置

IP地址设置 修改Ip地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" # 设置为静态ip static DEFROUTE"yes" IPV4_FAILURE_FATAL"no&qu…

「TypeScript系列」TypeScript 运算符

文章目录 一、TypeScript 运算符二、TypeScript 算术运算符1. 基本算术运算2. 复合赋值运算符3. 自增和自减运算符4. 幂运算符 三、TypeScript 关系运算符四、TypeScript 逻辑运算符五、TypeScript 位运算符六、TypeScript 赋值运算符七、相关链接 一、TypeScript 运算符 Type…

string功能介绍(普及版)

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

WLAN技术

冲突域:连接在同一传输线缆上的所有工作站的集合,或者说是同一物理网段上所有节点的集合共同竞争网络资源形成的域叫冲突域。 在OSI模型中,冲突域被看作是第一层的概念,连接同一冲突域的设备有中继器、集线器(hub&…

Redis:常用命令

文章目录 get和setRedis全局命令keysexistsdelexpirettlRedis的删除策略 本篇开始对于Redis的命令进行学习,当然只是学习一些常见的 get和set Redis中是使用键值对来进行存储的,所以get是根据key来取Value的,而set是来设置键值对的 set s…

mysql--表管理

mysql–表管理 查看建表语法:help create table; 查看建表语句:show create table xxxx; 查看表结构信息: show columns from xxxx 或desc xxxx; 查看索引信息 : show index from mysql.db; 查看修改表的语法 : help alter table; 添加列 : alter table users add (email…

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

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

Flutter 中的 GridTile 小部件:全面指南

Flutter 中的 GridTile 小部件:全面指南 在Flutter的Material组件库中,GridTile是一个用于创建网格列表项的组件,它允许开发者以网格的形式展示信息,通常用于展示图片、图标或者一些关键信息。GridTile常用于GridTileBar中&#…

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

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

Mybatis INSERT ... ON DUPLICATE KEY UPDATE 语句进行批量插入或更新时

Product.java public class Product {private Integer productId;private String productName;private Integer quantity;// getters and setters ... }ProductMapper.xml <mapper namespace"com.example.mapper.ProductMapper"><!-- 其他的SQL映射和操作…

Spring Boot集成Ldap快速入门Demo

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

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

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

01基础篇

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

Linux chkconfig命令教程:管理系统服务的利器(附实例详解和注意事项)

Linux chkconfig命令介绍 chkconfig命令在Linux中用于列出所有可用的服务并查看或更新它们的运行级别设置。简单来说&#xff0c;它用于列出服务的当前启动信息&#xff0c;更新服务的运行级别设置&#xff0c;以及从管理中添加或删除服务。 Linux chkconfig命令适用的Linux版…

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

0、前言&#xff1a; 本文意在记录自己在做毕业Flask项目开发时遇到的一些问题&#xff0c;并将问题解决方案记录下来&#xff0c;可做日后查询本文也会记录自己做FLask项目时实现的一些功能&#xff0c;作为开发工作的进程记录注意&#xff1a;用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;} }

2024面试算法题目(go)

文章目录 xiaomi xiaomi 1 三数之和 &#xff08;注意去重的边界条件&#xff0c;过几天再刷几次&#xff09; 2 长度最小的子数组 (代码随想录题目&#xff0c;滑动窗口) 3 用链表实现栈 package mainimport ("errors""fmt" )// Node 定义链表节点 type…

mongodb备份还原指南

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

(delphi11最新学习资料) Object Pascal 学习笔记---第12章第1节 ( 类数据、Virtual类方法和隐藏的self参数)

12.1.1 类数据 ​ 类数据是所有类对象之间共享的数据&#xff0c;提供全局存储但具有类特定的访问权限&#xff08;包括访问限制&#xff09;。您如何声明类数据&#xff1f;只需在类中定义一个标记为“class var”的部分&#xff1a; type TMyData class private class …