赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十一)

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(四十)-CSDN博客

八十一、tcp为什么要三次握手,两次不行吗?为什么?

TCP(传输控制协议)使用三次握手(Three-way Handshake)来建立一个可靠的连接。这个过程确保了两端的发送和接收通道都是可用的。以下是三次握手的步骤和原因:

三次握手步骤:

  1. SYN(同步序列编号):客户端发送一个带有SYN标志的TCP段到服务器以初始化一个连接。这个SYN段包含客户端的初始序列号(seq=x)。

  2. SYN-ACK(同步-确认):服务器收到这个SYN段后,如果同意建立连接,则会发送一个SYN-ACK段作为响应。这个段包含服务器的初始序列号(seq=y)和对客户端序列号的确认(ack=x+1)。

  3. ACK(确认):客户端收到服务器的SYN-ACK段后,会发送一个确认段(ACK段),包含对服务器序列号的确认(ack=y+1)。

为什么需要三次握手,而不是两次?

  1. 初始化序列号:三次握手允许客户端和服务器各自选择一个初始序列号(ISN),而不是仅仅依赖于服务器的初始序列号。这增加了连接的安全性,因为使用随机的ISN可以防止第三方预测连接的序列号,从而防止某些类型的攻击。

  2. 防止过时的连接请求:考虑一个场景,客户端发送了一个连接请求,但因为网络延迟或其他原因,请求在网络中滞留了很长时间。如果只有一个或两个握手步骤,这个过时的连接请求可能在客户端已经放弃连接后到达服务器,导致服务器错误地初始化一个不存在的连接。

  3. 确保双方都准备好发送数据:三次握手确保双方都准备好接收和发送数据。客户端通过SYN向服务器表明它准备好发送数据,服务器通过SYN-ACK表明它准备好接收数据,客户端的ACK表明它准备好接收数据。

  4. 防止资源浪费:如果只有两次握手,服务器可能在收到客户端的SYN后立即为连接分配资源,但如果客户端没有收到服务器的SYN-ACK(可能是因为网络问题),客户端将不会发送ACK,服务器上的资源就会被浪费。

总结:

三次握手是建立TCP连接的一种可靠机制,它确保了连接的双方都准备好进行通信,并且提供了一个双方都认可的序列号。这不仅提高了连接的可靠性,还增加了安全性,并防止了资源的浪费。两次握手可能无法提供足够的信息来确保双方都准备好进行通信,并且无法防止过时的连接请求。

八十二、说一下tcp粘包是怎么产生的?

TCP粘包是指在使用TCP协议进行数据通信时,发送方发送的多个数据包在接收方接收时粘在一起,形成一个较大的数据包,导致数据无法正确解析。这种现象通常是由于TCP协议的特性和网络环境的复杂性导致的。以下是TCP粘包产生的主要原因:

  1. TCP是面向流的协议: TCP协议本身是面向流的,它不保留数据包边界。TCP负责将数据从发送方传输到接收方,但它不会自动将数据分割成独立的包。因此,在接收方,连续的数据流可能看起来像是单个数据包。

  2. 缓冲区大小: 发送方和接收方的TCP缓冲区大小可能会影响粘包。如果发送的数据超过了接收方缓冲区的容量,剩余的数据可能会被保存在另一个缓冲区中,导致粘包。

  3. 网络环境: 网络延迟、拥塞或其他网络条件的变化可能导致数据包延迟或丢失,从而影响数据包的顺序和完整性。

  4. 发送和接收速率不匹配: 如果发送方发送数据的速率远大于接收方处理数据的速率,接收方可能来不及处理所有接收到的数据,导致多个数据包在接收缓冲区中累积,形成粘包。

  5. 应用层协议: 应用层协议的设计也可能导致粘包。如果应用层协议没有明确定义数据包的边界或大小,接收方可能无法正确地将连续的数据流分割成独立的数据包。

如何解决TCP粘包问题:

  1. 使用应用层协议: 设计应用层协议时,应明确数据包的边界或大小。例如,可以在每个数据包的开始处添加长度字段,以指示每个数据包的大小。

  2. 使用固定长度的数据包: 如果可能,使用固定长度的数据包可以简化数据包的分割和处理。

  3. 使用特殊的分隔符: 在数据包之间使用特殊的分隔符或标记,如换行符或特定的字节序列,以帮助接收方识别数据包的边界。

  4. 使用消息队列: 使用消息队列或中间件(如消息队列服务)可以在一定程度上缓解粘包问题,因为它们通常提供了更明确的数据包边界和大小。

  5. 优化网络条件: 改善网络环境,减少延迟和丢包,可以降低粘包发生的概率。

  6. 调整缓冲区大小: 适当调整发送方和接收方的TCP缓冲区大小,以适应数据传输的速率和网络条件。

  7. 使用其他传输层协议: 对于对粘包非常敏感的应用,可以考虑使用其他传输层协议,如UDP,它保留了数据包边界,但需要应用层协议来处理可靠性和顺序性。

总结: TCP粘包是由于TCP协议的面向流特性、缓冲区大小、网络环境、发送接收速率不匹配以及应用层协议设计等多种因素共同作用的结果。解决粘包问题通常需要在应用层协议设计和网络优化方面进行努力。

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

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

相关文章

【Linux网络】Shell脚本语句

目录 一、条件语句 1.1 测试 1.2 比较整数数值 1.3 字符串比较 1.4 双中括号 1.5 ()与{} 1.6 if语句 1.7 case语句 1.8 echo命令 二、循环语句 2.1 for循环 2.2 while循环 2.3 until循环 一、条件语句 1.1 测试 格式一:test 条件表达式 格式二&#x…

AI技术如何提升内容生产的效率和质量

随着人工智能(AI)技术的不断发展和应用,内容生产领域也迎来了巨大的变革。AI技术在提升内容生产效率和质量方面发挥着越来越重要的作用,从自然语言处理到生成模型,AI为内容创作者和生产者带来了许多新的机会和挑战。本…

(docker)进入容器后如何使用本机gpu

首次创建容器,不能直接使用本机gpu 在系统终端进行如下配置: 1.安装NVIDIA Container Toolkit 进入Nvidia官网Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.15.0 documentation,安装NVIDIA Container Toolkit …

AI预测福彩3D采取887定位策略+杀断组+杀和尾+杀和值012缩水测试5月12日预测第1弹

前段时间工作太忙,手头上各种事情较多,没有静下心来对我的AI模型预测结果进行进一步分析筛选,导致最近连续几期与实际开奖结果相差较大。当然,客观来说,搞6码定位的确难度比较大,昨天跟几个常年研究3D的彩友…

OpenCV 光流法总结

0.概述 1.原理说明 2.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::cerr << "Usage: " << argv[0] << " <video_path>" << std::endl;…

从零学算法2391

2391. 收集垃圾的最少总时间 给你一个下标从 0 开始的字符串数组 garbage &#xff0c;其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 ‘M’ &#xff0c;‘P’ 和 ‘G’ &#xff0c;但可能包含多个相同字符&#xff0c;每个字符分别表示一单位的金属、纸…

商业时代杂志社投稿信箱邮箱

商业时代杂志投稿信箱邮箱 商业时代杂志 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 《商业时代》、投稿信箱&#xff1a;sysdbjb126.com 咨询电话&#xf…

【RAG 论文】FiD:一种将 retrieved docs 合并输入给 LM 的方法

论文&#xff1a; Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering ⭐⭐⭐⭐ EACL 2021, Facebook AI Research 论文速读 在 RAG 中&#xff0c;如何将检索出的 passages 做聚合并输入到生成模型是一个问题&#xff0c;本文提出了一…

java基础知识点总结2024版(8万字超详细整理)

java基础知识点总结2024版&#xff08;超详细整理&#xff09; 这里写目录标题 java基础知识点总结2024版&#xff08;超详细整理&#xff09;java语言的特点1.简单性2.面向对象3.分布式4.健壮性5.安全性6.体系结构中立7.可移植性8.解释性9.多线程10.动态性 初识java中的main方…

Web前端开发之JavaScript_2

条件语句三元运算符循环语句字符串数组 1. 条件语句 1.1 if语句 if (布尔值){ // “布尔值”往往由一个表达式产生&#xff0c;其中&#xff0c;赋值表达式不具备比较作用 语句; } 1.2 if...else 语句 if...else可成对单独使用&#xff0c;也可多层if...else …

十二届蓝桥杯Python组3月中/高级试题 第三题

** 十二届蓝桥杯Python组3月中/高级试题 第三题 ** 第三题&#xff08;难度系数 3&#xff0c;25 个计分点&#xff09; 提示信息&#xff1a; 心理学用“智力商数”即“IQ”来表示一个人的智力水平。经过研究划分&#xff0c;智力水平可分为7 个等级&#xff1a; 1、IQ≥140…

Java类与对象(一)

类的定义与使用 在Java中使用关键字class定义一个类&#xff0c;格式如下&#xff1a; class 类名{// 成员变量/字段/属性//成员方法/行为 }Java中类和c语言中的结构体有点类似&#xff0c; 在Java中类名一般采用大驼峰&#xff08;每个首字母大写&#xff09;的形式&#xf…

类和对象一(从封装开始讲述)

目录&#xff1a; 一.封装 二.封装扩展之包&#xff0c;自定义包 三.访问限定符 四.static成员 一.封装&#xff1a;封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行 交互。面向对象…

Python | 为列表中的元素分配唯一值

我们可以给列表中的所有数字分配一个唯一的值&#xff0c;重复时它会保留给它的值。这是一个非常常见的问题&#xff0c;在Web开发中&#xff0c;处理物品id时会遇到。让我们讨论一下解决这个问题的一些方法。 1. 使用enumerate() 列表解析 # initializing list test_list …

Reactor Netty TCP 服务器端-响应式编程-011

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform…

Pytorch图像分类模型模型实时在线验证代码

1.训练并保存自己的模型 保存的模型格式为&#xff1a;XXX.pth torch.save(model, "./weight/last.pth")if best_acc <(validation_acc / len_val):torch.save(model, "./weight/best.pth")2.转化为ONNX格式 2.1环境安装&#xff08;window10&#x…

一款简约大气的个人单页介绍主页(附加源码)

一款简约大气的个人单页介绍主页&#xff08;附加源码&#xff09; 效果图部分源码领取源码下期更新预报 效果图 部分源码 .box_bg{width: 100%;height: 100%; }.wenzi{text-align: center;float: left;display: inline;width: 112px;line-height: 48px; } .wenzi2{text-align…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

国内镜像地址 Docker、Conda、Node

国内主要系统、软件、开发框架镜像地址&#xff0c;包括 NPM、Centos、Ubuntu、Docker、PIP、Homebrew等。 Conda镜像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.e…

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全&#xff0c;不仅功能更强大&#xff0c;而且能提升程序员的开发效率加了许多特性&#xff0c;约140个新特性。使得C…