当前位置: 首页 > news >正文

高级java每日一道面试题-2024年8月07日-网络篇-你对TCP的三次握手了解多少?

如果有遗漏,评论区告诉我进行补充

面试官: 你对TCP的三次握手了解多少?

我回答:

TCP(Transmission Control Protocol)的三次握手是TCP建立连接的过程,它是TCP/IP协议族中一个关键的概念。三次握手确保了双方之间的连接是双向的,并且能够正常发送和接收数据。下面是详细的三次握手过程:

第一次握手(SYN=1, seq=x)

  1. 客户端发送SYN标志的数据包:客户端(主动发起连接的一方)首先发送一个SYN(Synchronize)标志位被设置的TCP数据包到服务器。这个数据包包含了客户端的初始序号(ISN, Initial Sequence Number),这个序号用于之后的数据包确认和排序。

第二次握手(SYN=1, ACK=1, seq=y, ack=x+1)

  1. 服务器响应SYN-ACK:服务器在接收到客户端的SYN数据包后,如果同意建立连接,就会发送一个SYN-ACK(Synchronize-Acknowledge)数据包作为响应。这个数据包包含了服务器的初始序号,并且确认了客户端的序号(ACK, Acknowledgment)。此时,服务器进入SYN_RECEIVED状态。

第三次握手(ACK=1, seq=x+1, ack=y+1)

  1. 客户端发送ACK:客户端接收到服务器的SYN-ACK数据包后,发送一个ACK数据包确认服务器的序号。这个数据包不包含数据,仅仅是一个确认,表明客户端已经接收到服务器的SYN-ACK,现在双方都可以开始发送数据了。此时,客户端和服务器都进入ESTABLISHED状态,连接建立完成。

为什么需要三次握手?

三次握手的主要目的是确保双方都能够正常接收和发送数据,以及同步序列号。如果省略了任何一步,可能会导致以下问题:

  • 确认丢失:如果第二次或第三次握手的ACK数据包丢失,连接一方可能认为连接没有建立成功,而另一方可能已经准备好接收数据,这会导致数据丢失或乱序。

  • 同步序列号:序列号的同步是为了保证数据包的正确排序和确认。如果序列号不同步,接收方可能无法正确地组装数据流。

关于三次握手的额外说明

  • 超时重传:如果在三次握手过程中任何一个数据包没有得到响应,发送方会重传这个数据包,直到收到响应或达到最大重传次数。

  • SYN Flood攻击:三次握手过程可能被恶意利用,如SYN Flood攻击,攻击者发送大量的SYN数据包给服务器,但不发送后续的ACK,导致服务器的半开放连接积压,消耗服务器资源,最终可能导致服务器无法响应合法的连接请求。

总结

TCP的三次握手是TCP/IP协议中建立可靠连接的重要机制。通过三次握手,可以确保客户端和服务器之间的通信能力正常,避免旧连接和重复连接的影响,同步双方的初始序列号,从而保证后续数据传输的可靠性和有序性。在Java高级面试中,对TCP三次握手的深入理解是展现面试者网络基础知识扎实程度的重要方面。

相关文章:

  • OOP经典设计模式
  • Docker 入门全攻略:安装、操作与常用命令指南
  • Java 实现括号匹配:栈的应用与优化
  • zabbix的主/动模式自定义监控项
  • LCM红外小目标检测
  • 【人工智能】Transformers之Pipeline(八):文生图/图生图(text-to-image/image-to-image)
  • C语言之“ 分支和循环 ” (2)
  • 阿里云CDN-边缘脚本EdgeScript的CI/CD实践
  • MTK Android12 SystemUI 手势导航 隐藏导航栏底部布局
  • Tomcat 使用和配置文件(详解)
  • Spring Boot - 通过ServletRequestHandledEvent事件实现接口请求的性能监控
  • <数据集>停车场空位识别数据集<目标检测>
  • LabVIEW位移检测系统
  • 【CPP】slt-list由认识到简化模拟实现深度理解~
  • 储能集装箱动环监控系统,动环监控在集装箱的应用方案@卓振思众
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • conda常用的命令
  • docker-consul
  • Git学习与使用心得(1)—— 初始化
  • HTTP中GET与POST的区别 99%的错误认识
  • Linux后台研发超实用命令总结
  • oldjun 检测网站的经验
  • V4L2视频输入框架概述
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 飞驰在Mesos的涡轮引擎上
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给Prometheus造假数据的方法
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用SAX解析XML
  • -- 数据结构 顺序表 --Java
  • 由插件封装引出的一丢丢思考
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ###C语言程序设计-----C语言学习(3)#
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #图像处理
  • (4.10~4.16)
  • (a /b)*c的值
  • (C++17) optional的使用
  • (汇总)os模块以及shutil模块对文件的操作
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .NET Core WebAPI中封装Swagger配置
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [C++内存管理]new,delete,operator new,opreator delete
  • [CF482B]Interesting Array
  • [Google Guava] 1.1-使用和避免null
  • [idea]关于idea开发乱码的配置