三次握手 四次挥手

字段含义
URG紧急指针是否有效。为1,表示某一位需要被优先处理
ACK确认号是否有效,一般置为1。
PSH提示接收端应用程序立即从TCP缓冲区把数据读走。
RST对方要求重新建立连接,复位。
SYN请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN    希望断开连接。

三次握手

首先先说一下ACK和ack的区别,它们一个是确认值(Acknowledgement)ACK,为1表示确认连接;一个是确认编号(Acknowledgement Number),即受到对方主机传过来的seq序列号+1,提示对方我已经成功接收了你上一次发送过来的数据。

(1)客户端发送SYN报文到服务端,并指明自己的seq序列号为x,客户端进入syn-send状态

(2)服务端收到报文后,也会发送自己的SYN报文,以及确认值ACK=1,并指明自己的序列号seq为y,确认ack编号为x+1,表示自己接收到了客户端的连接请求,服务端进入syn-recv状态

(3)客户端收到服务端报文后,发送ACK报文确认连接,并发送自己的seq为x+1(上次是x,这次+1),ack为y+1,客户端服务端都进入established状态,连接建立成功,可以进行数据传输。

四次挥手

发出断开连接请求的可以是服务端也可以是客户端,下面就以客户端发出断开请求为例

(1)客户端发出FIN连接断开报文,序列号seq为u,客户端进入fin-wait-1状态

(2)服务端发送ACK确认,服务端seq=v,ack=u+1,服务端进入close-wait状态,客户端进入fin-wait-2状态

(3)服务端会继续发送数据给客户端,当数据发送完毕后,服务端会发送FIN和ACK报文,seq=w,ack=u+1,此时服务端进入last-ack状态

(4)客户端收到FIN报文后会发送ACK报文,服务端收到后会进入close关闭连接;而客户端会进入TIME-WAIT状态,时长为2MSL(max segment lifeTime),之后才会进入关闭状态

 

1.为什么三次握手不是两次?

假如是两次握手,客户端发送syn报文请求与服务端建立连接,但是服务端没有收到,那么客户端没有收到SYN+ACK确认报文,一段时间后会再次发送syn报文,这次服务端收到了,并回复了ACK报文,此时连接建立;当数据传输完毕,断开连接后,如果第一次发送的syn报文只是因为某些原因滞留了,此时才到达服务端,那么服务端以为是客户端又要再次与它建立连接,就会回复SYN+ACK报文,但是客户端知道自己没有发送,那么就不会应答,此时虽然客户端没有建立连接,服务端却认为连接已经正常建立了,就会一直等待客户端发送数据,浪费资源。

2.三次握手中可以携带数据吗?

在第一、二次握手中没有携带数据,第三次是可以的。假如在第一次握手请求时,可以携带数据,那么如果有人想恶意攻击服务端,就有可能可以发送大量携带数据的SYN请求,并不理会服务端是否正常接收,从而让服务端花费更多的时间和空间处理这些数据。但是在第三次握手请求发出后,客户端状态已经变成了established,可以携带数据。

3.syn攻击是什么?

当客户端发送syn请求后,服务端会将其发在一个半连接队列中,syn攻击就是在短时间内伪造大量不存在ip想服务端发送syn请求,服务端需要回复确认请求,由于伪造ip不存在,无法完成第三次握手,那么服务端会不断重试,发送SYN+ACK确认请求,导致半连接队列被伪造的SYN连接长时间占用,而正常的SYN请求由于半连接队列满了被丢弃,从而发送网络阻塞瘫痪。

检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们可以缩短SYN超时时间,增加半连接队列长度,使用网关过滤、SYN cookies技术等。

4.为什么握手是3次,挥手是4次?

当握手时收到SYN报文时,可以立即发送SYN+ACK报文用以确认连接;但是在挥手时,一方发起FIN请求报文后,另外一方可能还有未发送的数据,所以此时只能发送ACK确认报文,待后续数据发送完成后,才能发送FIN+ACK关闭连接确认,要分成两次发送,所以要4次。

5.4次挥手时最后等待2MSL是为了什么?

MSL指的是max segment lifeTime 报文在传输过程中的最长生存时间。(1)四次挥手最后发出的ACK确认报文对方可能没有收到,那么对方可能会重发FIN报文,那么就需要等待一段时间用以确保该ACK报文对方已经收到;如果在该时间段内又收到了FIN报文,那么还会再次发送ACK报文,并将等待时间重置未2MSL(2)此外,等待2MSL也是为了防止本次连接中有数据传输没有收到,用来等它们都消失,从而是下次连接时,不会存在本次发送的数据。

6.如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
TCP的三次握手和四次挥手是用于建立和终止TCP连接的过程。三次握手是指在建立TCP连接时,客户端和服务器之间需要发送3个包来确认双方的接收能力和同步连接双方的序列号和确认号。这个过程主要是为了确保连接的可靠性和正确性。\[2\] 四次挥手是指在终止TCP连接时,需要经过四个步骤来关闭连接。这是由于TCP的半关闭机制造成的,即连接的一端在结束发送后仍然可以接收来自另一端的数据。在四次挥手过程中,双方会交换最后的数据和确认信息,然后逐步关闭连接。\[1\] 需要注意的是,在三次握手和四次挥手的过程中,并不包含实际的数据传输。只有在连接建立后,双方才开始正式传送数据。而在连接关闭之前,TCP连接将一直保持下去,除非有一方主动关闭连接。\[3\] 总结起来,三次握手是用于建立TCP连接,而四次挥手是用于终止TCP连接。这些过程都是为了确保连接的可靠性和正确性。 #### 引用[.reference_title] - *1* *2* [TCP三次握手四次挥手](https://blog.csdn.net/qq_28345657/article/details/126599058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [计算机网络之TCP](https://blog.csdn.net/RenLJ1895/article/details/122420159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值