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. poj1182 and 携程预赛2第一题 带权并查集
  2. vim查看cmd打印的trick
  3. 【算法】剑指 Offer 22. 链表中倒数第k个节点
  4. linux chromium安装falsh插件
  5. 多模块Struts应用程序的几个问题(及部分解决方法)
  6. ADS EM MODEL 问题
  7. 微信小程序——轮播图
  8. c 语言读取硬盘序列号,C++读取硬盘序列号
  9. 数学建模论文的技巧与操作
  10. 滴滴如何调度_怎么看待滴滴的调度小助手?_科技数码通
  11. iCloud数据存储
  12. 镭速介绍关于高速数据传输!
  13. poj求排列的逆序数
  14. 树莓派更改WiFi信息
  15. 每日一题 --- P1093 [NOIP2007 普及组] 奖学金[洛谷][JAVA]
  16. OTA全称为Over-The-Air technology(空中下载技术)
  17. net view 时报错 发生系统错误 6118 解决
  18. java和胧村正差不多的游戏_对外行来说,怎麽把脑中一个游戏构思变成现实?...
  19. 【tensorflow】生成.pb文件
  20. HTML开发 完美解决移动端H5页面pop弹出蒙版后底层滑动问题

热门文章

  1. 【培训教程】bloom特效、炫光、 VSCode + OpenCV 4.4验证与代码升级
  2. Python 字符串与数字之间的转换
  3. MySQL 的数据库迁移
  4. Apache绿色版 官网下载+安装(win7)
  5. 国标GB28181入门
  6. shopee校招笔试考什么?如何准备笔试?
  7. SAR成像(四):多普勒频移的计算
  8. Spring系列学习之Spring Cloud Stream App Starters 应用程序启动器
  9. 动态修改参数cron的值来实现Spring自带定时器动态的执行任务
  10. 【时间序列预测算法】——ARIMA 算法介绍及代码实现