文章目录

  • I TCP 连接建立流程 ( 三次握手 )
  • II SYN 和 ACK 中的随机值
  • III TCP 连接建关闭流程 ( 四次挥手 )
  • IV TCP 连接断开的保证
  • V 四次挥手的必要性

I TCP 连接建立流程 ( 三次握手 )


1. 连接两端点 : 客户端 , 发起连接 ; 服务器端 , 等待客户端的连接 ;

2. 初始状态 : 客户端发起连接 , 服务器端处于被动等待连接状态 ;

3. 客户端发送 SYN 命令 : 客户端发起连接时 , 向服务器端发送 SYN 命令 ;

  • ① 发送命令 : 客户端向服务器端发送 SYN 命令 ( 连接请求命令 ) ;
  • ② SYN 参数 : 该命令会携带一个随机值参数 x , 该命令发送给服务器 ;

4. 服务器端收到 SYN 命令并处理 ( 第一次握手 ) : 服务器端收到 SYN 命令 , 向客户端会送 SYN ACK 命令 ;

  • ① 校验命令 : 服务器端收到客户端发送的 SYN 命令 , 会校验该命令的正确性 ;
  • ② 命令回送 : 如果 SYN 命令校验通过 , 服务器端会送一条 SYN ACK 命令 ;
  • ③ 命令组成 : 该 SYN ACK 指令包含两个指令 , 即 接收到的 SYN 指令 , 和服务器端生成的 ACK 指令 ;
  • ④ SYN 指令处理 : 服务器端收到客户端发送的 SYN 指令 , 该指令有一个随机值 x , 服务器端会送时 , 会将该 x 执行 +1 操作 ; 即会送的参数是 x + 1 ;
  • ⑤ ACK 指令参数 : ACK 指令会自带一个随机值参数 y ;

5. 客户端接收并处理 SYN ACK 命令 ( 第二次握手 ) : 客户端收到服务器端会送的 SYN ACK 命令后 , 会先进行校验 , 将 ACK 中的 y 参数执行自增操作 , 再次将 SYN ( x + 1 ) ACK ( y + 1 ) 命令发送给服务器端 ;

6. 服务器端收到 SYN ACK 命令 ( 第三次握手 ) : 服务器端再次收到客户端的命令 , 校验这两个命令 , 校验通过后 , 连接正式建立 ;

II SYN 和 ACK 中的随机值


1. 服务器对应多个客户端 : 服务器是需要接收很多客户端的连接 , 那就需要针对不同的客户端进行区分操作 , 这里从客户端发送的随机数有效的将该客户端与其它客户端进行了区别 ;

2. 连接举例 : 客户端 A 向服务器 S 发送 SYN 命令携带了随机参数 X , 客户端 B 向服务器 S 发送 SYN 命令携带参数 Y , X 和 Y 一定不能相同 ;

  • ① 客户端 A 发送 SYN 携带随机数 X , 服务器 S 向客户端 A 回送 X + 1 ;
  • ② 客户端 B 发送 SYN 携带随机数 Y , 服务器 S 向客户端 B 回送 Y + 1 ;
  • ③ 如果服务器 S 回送的指令相同 , 那么连接的可靠性便不能保证了 ;

III TCP 连接建关闭流程 ( 四次挥手 )


1. 客户端和服务器端都可以发起连接关闭的操作 , 这里拿客户端发起关闭连接操作举例 ;

2. 第一次挥手 ( 客户端 -> 服务器端 ) : 客户端当前状态是已连接状态 ( ESTABLISHED ) , 发送 FIN 命令 , 其会携带随机参数 seq = u 的值 ;

SYN 是发起连接的命令 , FIN 是断开连接的命令 ;

3. 第二次挥手 ( 服务器端 -> 客户端 ) : 服务器端当前状态也是已连接状态 ( ESTABLISHED ) , 接收到 FIN 命令后 , 会向客户端会送一条 ACK 命令 , 该 ACK 命令携带参数 ack = u+1 ;

4. 此时的服务器端状态 : 客户端发送请求断开命令后 , 服务器端并不能马上响应断开 , 如果数据还没有传输完 , 服务器端是不能断开的 , 只能等到服务器端剩余数据传输完毕之后 , 服务器端才能第三次挥手 ;

5. 此时的客户端状态 : 客户端接收到服务器端会送的 ACK 命令 ( ack = u + 1 ) , 此时客户端的输出连接就可以断开了 , 客户端不能进行输出操作 , 此时无法向服务器端发送数据了 , 但是客户端的输入功能没有关闭 , 客户端还可以接收服务器端的数据 ;

6. 服务器端操作 : 服务器端有可能还有残留数据没有完全送达客户端 , 此时将剩余数据传输给客户端 , 客户端目前是有接收功能的 ( 没有发送功能 ) , 直到送达之后才会执行下一步操作 ;

TCP 是可靠传输 , 必须保证数据全部正确可靠 , 这个步骤是必须的 ;

7. 第三次挥手 ( 服务器端 -> 客户端 ) : 服务器端将所有数据送出完毕后 , 向客户端发送 FIN 命令 , 表示服务器端想要关闭连接了 ;

8. 第四次挥手 ( 客户端 -> 服务器端 ) : 客户端收到服务器端的 FIN 命令后 , 再次向服务器端会送 ACK 命令 , 表示服务器端可以断开连接了 ;

第一次第二次挥手是客户端向服务器端申请断开连接 , 客户端发送断开请求命令 , 服务器端会送响应命令 ;
第三次第四次挥手是服务器端向客户端申请断开连接 , 服务器端发送断开请求命令 , 客户端会送响应命令 ;

IV TCP 连接断开的保证


1. 服务器端保证第三次挥手能到达客户端的机制 : 当服务器端向客户端发送 FIN 命令后 ( 第三次挥手 ) , 服务器端会进入等待状态 , 在等待状态中 , 服务器端会以一个间隔周期持续发送 FIN 命令 , 这个间隔是一帧数据发送所需的最长时间 ( SML 默认 30 秒) , 如果超过 30 秒服务器端没有收到客户端会送的 ACK 命令 ( 第四次挥手 ) , 服务器端会再次发送 FIN 命令 ( 多次第三次挥手 ) , 直到收到客户端会送的 ACK 命令 ( 第四次挥手 ) ;

2. 客户端保证第四次挥手能到达服务器端机制 : 如果客户端一直不向服务器端回送 ACK 命令 ( 第四次挥手 ) , 或者 ACK 命令未到达服务器端 , 服务器端会一直向客户端发送 FIN 命令 ( 第三次挥手 ) , 客户端不断的收到 FIN 命令 , 不停地向服务器端发送 ACK 命令 , 直到服务器端收到 ACK 命令 , 停止向客户端发送 FIN 命令 ;

V 四次挥手的必要性


1. 全双工断开 : 四次挥手保证了全双工连接的安全断开 , 全双工指的是客户端既可以接收服务器端的信息 , 也可以像服务器端发送消息 , 半双工只能发送或者接收消息 , 不能同时发送和接收消息 ;

2. 前两次挥手 : 这里的前两次挥手是断开客户端向服务器端发送数据的连接 , 客户端主动发起断开 , 因此其不会再向服务器端写出数据了 , 但是服务器端可能正在传输数据 , 因此这里还需要单独处理客户端接收数据的连接断开的操作 ;

3. 传输剩余数据 : 前两次挥手之后 , 客户端就丧失了向服务器端发送消息的能力 , 但是服务器端还可以向客户端发送消息 ; 利用这个空档 , 客户端需要将剩余的残余数据发送给客户端 , 然后主动发起断开与客户端的发送连接 ;

4. 后两次挥手 : 后两次挥手就是断开服务器端向客户端传输数据的连接 , 因此是服务器端发送断开请求指令 ;

5. 不能是三次挥手 : 第二次和第三次挥手不能合并 , 因为第二次挥手后 , 无法保证服务器端可以马上关闭连接 , 如果服务器端正在向客户端发送数据 , 要确保最后一批数据能完整的送达客户端 , 因此第二次挥手仅能代表客户端向服务器端的连接关闭 , 不能强行关闭服务器端向客户端传输数据的通道 , 需要等待数据传输完毕后 , 才能发起第三次挥手 , 第二次挥手和第三次挥手中间有一定的时间间隔 , 服务器端要利用这个间隔将剩余数据传输完毕 ;

6. 不能是五次挥手 : 目前需要断开两个连接 , 分别是发送和接收两个双工连接 , 每个连接段考只需要发送请求 FIN 指令 和 会送 ACK 指令即可完成 , 四次就可以完成两个连接的断开操作 , 多余的指令没有必要 ;

【Java 网络编程】TCP 连接 断开 机制 ( 三次握手 | 四次挥手 )相关推荐

  1. TCP连接管理【三次握手-四次挥手】

    https://www.bilibili.com/video/BV19E411D78Q?p=64 通俗易懂的TCP里面的三次握手以及四次挥手 TCP连接传输三个阶段: TCP连接的建立采用客户服务器方 ...

  2. 网络编程 | tcp协议 | udp协议 | 三次握手与四次挥手

    目录 网络编程 为什么要用网络编程 软件开发的结构 1. C/S架构 2.B/S架构 网络基础 一个程序如何在网络上找到另一个程序? ip地址 什么是端口 远程数据传输发展史 OSI七层网络模型 前言 ...

  3. go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态

    三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说明: ...

  4. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

  5. Linux网络编程(网络七层协议,TCP/IP,三次握手四次挥手,TCP/UDP的区别)

    1.OSI 7层网络模型 1.网络七层协议 (1)OSI定义了网络互连的七层框架(物理层.数据链路层.网络层.传输层.会话层.表示层.应用层),即ISO开放互连系统参考模型. (2)各层功能定义 这里 ...

  6. HTTP HTTPS WEB的cookie机制 TCP UCP(三次握手四次挥手)

    1.HTTP 与 HTTPS 的区别 理解: 1.HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用.(以前网易官网 ...

  7. java锁一次交互二次握手_Java后台开发面试实战(二):TCP三次握手四次挥手

    感谢牛客网网友提供的面试经验! 1. 解释一下TCP三次握手四次挥手 图片来源于微信公众号:码农求职小助手 答: 嗯(稍作思考)- 三次握手简单来说,在数据传输开始前: 第一次握手:客户端向服务端发送 ...

  8. 大剑无锋之HTTP连接、Tcp三次握手四次挥手、Tcp状态

    Http请求: 总的来说: DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 [补充] 三次握手和四次挥手: 第一次握手:建立连接时,客户端发送 ...

  9. Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手)...

    Python进阶----网络通信基础 ,OSI七层协议() ,UDP和TCP的区别 , TCP/IP协议(三次握手,四次挥手) 一丶CS/BS 架构 C/S: 客户端/服务器 定义:       这里 ...

最新文章

  1. 12306系统的秒杀“艺术”:如何抗住100万人同时抢1万张票?
  2. cnn中关于平均池化和最大池化的理解
  3. C 语言内联汇编介绍
  4. zblog php robots,zblog的robots.txt怎么写?zblog的robots.txt文件示例下载
  5. 【渝粤题库】国家开放大学2021春1080工程数学(本)题目
  6. mysql数据库查询源码_超简单php mysql数据库查询类
  7. r语言 plot_R语言直方图绘制hist(),plot()
  8. 主动风险管理:警报如洪水怎么破?
  9. 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
  10. java 释放对象_java基础:对象的销毁
  11. 2020-08-21 第一次面试小结
  12. win10 安装MASM32 遇到的问题DELETE operation of EXE file has failed
  13. 无卡时代存取款的N种姿势:刷脸、扫码、手机Pay
  14. 直流电机调速仿真作业
  15. 华为mate50会用鸿蒙系统吗,华为Mate50Pro概念机:瀑布环绕屏+鸿蒙系统,就算涨价我也劝你买...
  16. 好看的女孩男生拍照姿势大全
  17. 高通芯片联机读取修改串码 meid ESN wifi 蓝牙 sn等参数的操作解析{二}
  18. 44session绑定解绑、钝化活化
  19. 大学生PHP简单网站制作方法 学生PHP网站作业 动态PHP毕业设计 PHP MYSQL在线留言板网站源码
  20. 财务人员的计算机水平怎么描述,财务人员简历怎么写?

热门文章

  1. 日记 [2007年02月03日]邮件退信问题的解决
  2. IDOC 创建,增强,管理,配置
  3. Python笔记_第四篇_高阶编程_正则表达式_3.正则表达式深入
  4. 计算机网络第七版(谢希仁著)课后习题答案
  5. FreeBSD 安装过程
  6. expdp\impdp及exp\imp
  7. 软件开发基本原则(一)—— 策略和因素 (转)
  8. EDM HTML编写建议和规范
  9. 数据库中间件mycat
  10. 总统先生,一路走好!