TCP三次握手四次断开及11种状态转变

  • 置位概念: 根据TCP的包头字段,存在三个重要的标识ACK、SYN、FIN
  • ACK: 表示验证字段
  • SYN: 位数置为1,表示建立TCP连接
  • FIN: 位数置为1,表示断开TCP连接

1、三次握手


建立过程:

  1. 由客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中SYN字段置为1,表示需要建立TCP连接。
  2. 服务端会回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将回复报文的SYN字段置1,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到了验证。
  3. 客户端收到服务端发送的TCP建立验证请求后,会使自己的seq序列号加1表示,并且再次回复ACK验证请求,ACK在服务端发送过来的seq基础上加1,进行回复。

建立过程状态机转变:

  1. 一开始建立连接之前服务端和客户端的状态都为CLOSED
  2. 服务端创建socket后开始监听,变为LISTEN状态。
  3. 客户端建立请求连接,向服务端发送SYN报文,客户端的状态变为SYN_SENT
  4. 服务端收到客户端的报文后会向客户端发送ACK和SYN报文,此时服务端的状态变为SYN_RCVD
  5. 然后,客户端收到ACK和SYN,会向服务器发送ACK,客户端状态变为ESTABLISHED,服务端收到客户端的ACK 后也变为ESTABLISHED
  6. 至此,TCP3次握手完成,建立连接!

tcpdump抓包分析tcp三次握手和四次断开:

命令:

tcpdump port 22 -Stn -c 3

参数说明:

port:指定端口
-S:用绝对而非相对数值列出TCP关联数
-t:在每列倾倒资料上不显示时间戳记
-n:不把主机的网络地址转换成名字
-c <数据包数目>:收到指定的数据包数目后,就停止进行的操作

Flags说明:

[S]代表seq
[S.]代表seq和ack
[.]代表ack
[F]代表FIN
[P]代表有DATA数据传输
[R]代表连接重置
[E]代表ECN-Echo(不了解)
[w]代表ECN CWR(不了解)

  • 看Flags标识:
  • 10.0.0.1 > 10.0.0.77:Flags为[SEW],这里看S即可,为SYN连接请求
  • 10.0.0.77 > 10.0.0.1:Flags为[S.E],这里看S和.即可,S代表SYN回复,.代表ack
  • 10.0.0.1 > 10.0.0.77:Flags为[.],即为ack确认,此时TCP三次握手建立成功

2、四次断开

断开过程:

  1. 服务端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中FIN字段置为1,表示需要断开TCP连接。
  2. 客户端会回复服务端发送的TCP断开请求报文,其中包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值,是在服务端发过来的seq序列号基础上加1进行回复,以便服务端收到信息时,知晓自己的TCP断开请求已得到了验证。
  3. 客户端在回复完服务端的TCP断开请求后,不会马上就进行TCP 连接的断开,客户端会先确保断开前,所有传输到服务端的数据是否已经传输完毕,一旦确认传输数据完毕就会将回复报文的FIN字段置1,并产生随机seq序列号。
  4. 服务端收到客户端的TCP断开请求后,会回复客户端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在客户端的TCP断开请求的seq基础上加1,从而完成客户端请求的验证回复。
  5. 至此TCP断开的4次挥手过程完毕!

断开过程状态机转变:

由于TCP连接是全双工的,断开连接会比建立连接麻烦一点点。

  1. 服务端先向客户端发送FIN报文,请求断开连接,其状态变为FIN_WAIT1
  2. 客户端收到FIN后向服务端发送ACK,客户端状态变为CLOSE_WAIT
  3. 服务端收到ACK后就进入FIN_WAIT2状态。此时连接已经断开了一半了。如果客户端还有数据要发送给服务端,就会继续发送。
  4. 直到发完了,就发送FIN报文,此时客户端会进入LAST_ACK状态。
  5. 服务端收到客户端的FIN后,会马上发送ACK给客户端,此时服务端进入TIME_WAIT状态
  6. 再过了2MSL长的时间后服务端进入CLOSED状态。客户端收到服务端的ACK后也进入CLOSED状态。
  7. 至此,还有一个状态没有提及: CLOSING状态。

CLOSING 状态表示:

  • 客户端发送了FIN,但没有收到服务器的ACK,却收到了服务器的FIN。这种情况发生在服务器发送的ACK丢包的时候,因为网络传输有时会有意外发生。

由于断开过程中会有数据传输,故在tcpdump -c指定抓包次数的时候值给大点,不然抓不到FIN断开的包。

看Flags标识:

  • 10.0.0.77 > 10.0.0.1:Flags为[F.],此为10.0.0.77向10.0.0.1发送的断开FIN请求,和ack确认
  • 10.0.0.1 > 10.0.0.77:Flags为[.],10.0.0.1先发送ack确认
  • 10.0.0.1 > 10.0.0.77:Flags为[F.],10.0.0.1发送FIN确认和ack确认
  • 10.0.0.77 > 10.0.0.1:Flags为[.],10.0.0.77发送ack确认,然后连接成功断开

TCP三次握手四次断开及11种状态转变相关推荐

  1. NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分

    网络层次: OIS网络模型概念:  OSI层次--应用层:  OSI层次--表示层:  OSI--会话层:  OSI--传输层: OSI--网络层: IP地址的概念说明: OSI数据链路层: OSI= ...

  2. TCP三次握手四次断开(图解)

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

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

  4. TCP三次握手四次挥手(图解)

    <TCP-IP协议栈概略图与TCP三次握手四次挥手> 目录 1 TCP过程详解 1.1 三次握手 1.2 四次挥手 2 使用tcpdump分析三次握手的过程 2.1 tcpdump抓包和t ...

  5. TCP三次握手四次挥手过程及其中的状态量

    网上看到过一些有关TCP三次握手四次挥手的过程,觉得有必要总结一下了,对于了解TCP的过程还是有帮助的 1.变量含义 SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DAT ...

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

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

  7. TCP三次握手四次挥手详解

    TCP三次握手四次挥手 1. TCP报文格式 2. TCP连接需要解决的问题 3. 三次握手 4. 四次挥手 5. 一些补充问题 1. TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内 ...

  8. TCP三次握手/四次挥手

    这里写目录标题 三次握手 三次握手过程 三次握手期间调用的系统调用 为什么建立连接使用三次握手而不是两次握手 TCP进行通信时的初始序列号为什么是随机的 如果没有资源限制,一个服务器最多可以承载多少连 ...

  9. [计算机网络][总结][常见问题][TCP][三次握手][四次挥手]

    TCP三次握手 四次挥手 三次握手 目的:保证传输的可靠性,为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误.主要防止资源的浪费. 具体过程:当客户端发出第一个连接请求报文段时并没有丢 ...

最新文章

  1. 巨杉数据库通过“Mpp数据库基础能力认证”,权威技术认证金融级数据库
  2. 1033 To Fill or Not to Fill (25 分)
  3. mac电脑安装python_【mac电脑怎么安装python】mac版python安装教程
  4. tablepc是什么平板电脑_54位平板电脑充电柜长什么样?安和力
  5. matlab波的极化特性,Matlab GUI在电磁波极化特性教学中的应用
  6. 话里话外:项目部如何不再形同虚设
  7. mysql数据库杀掉堵塞_Mysql解决USE DB堵塞详解
  8. Java 关键字 transient
  9. C#LeetCode刷题之#455-分发饼干(Assign Cookies)
  10. ping的时候怎么暂停_dos命令pause教程,?暂停bat批处理脚本程序,?请按任意键继续...
  11. windows10安装ninja过程记录
  12. 非线性动力学_第17届全国非线性振动暨第14届全国非线性动力学 和运动稳定性学术会议在南京召开...
  13. Java编程入门:使用Eclipse快捷键
  14. Cadence orcad 批量设置原理图标题栏
  15. 记录一次Excel表格的误删恢复操作,WPS版
  16. Ubuntu下U盘只读文件系统,图标上锁,文件无法写入
  17. swiper 仿淘宝详情页面 视频图片切换
  18. java操作office和pdf文件java读取word,excel和pdf文档内容
  19. 微信点赞功能测试用例
  20. kube-scheduler

热门文章

  1. java绘制点阵数字(LED数字显示),转载源码
  2. android wear安装不了,Android Wear - WearablePkgInstaller:软件包安装失败returnCode -104
  3. C++ 内存分配与内存对齐
  4. C语言经典100例---实例九:输出国际象棋棋盘
  5. Sql注入的入门教程
  6. GeoMesa源码学习:空间索引
  7. 创新案例分享 | 构建高效、智能人力管理系统,助力公司战略转型
  8. Eclipse免安装/绿色版下载
  9. 点云地面点滤波-progressive TIN densification(PTD)算法介绍
  10. Shopee虾皮SRE工程师二面面经