首页 > 其他分享 >TCP三次握手与四次挥手

TCP三次握手与四次挥手

时间:2023-11-01 20:26:27浏览次数:28  
标签:ACK 报文 TCP 四次 FIN 握手 服务端 客户端

一、TCP三次握手过程?

​ TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:

TCP 三次握手

  • 一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

第一个报文 —— SYN 报文

  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

第二个报文 —— SYN + ACK 报文

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYNACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

第三个报文 —— ACK 报文

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。

  • 服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。

​ 从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的

二、为什么是三次握手?

​ TCP建立连接时,通过三次握手能防止历史连接的建立能减少双方不必要的资源开销能帮助双方同步初始化序列号。序列号能保证数据不重复,不丢弃和按序传输。

​ 不使用两次和四次握手的原因:

  • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法同步双方序列号;
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

三、TCP四次挥手

​ TCP断开连接时通过四次挥手方式,双方都可以主动断开,断开后主机中的资源将被释放

客户端主动关闭连接 —— TCP 四次挥手

  • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
  • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSE_WAIT 状态。
  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
  • 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
  • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态,至此服务端已经完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSE 状态,至此客户端也完成连接的关闭。

​ 可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手

四、为什么需要四次挥手?

​ 回顾下四次挥手双方发 FIN 包的过程:

  • 关闭连接时,客户端向服 务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

​ 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACKFIN 一般都会分开发送,因此是需要四次挥手。

标签:ACK,报文,TCP,四次,FIN,握手,服务端,客户端
From: https://www.cnblogs.com/dwinternet/p/17804001.html

相关文章

  • tcpdump抓包实例-syslog和ping
    在实际运维过程中经常遇到网络问题,比如发出去的包是否对端收到了,以下通过syslog和ping的两个例子看看tcpdump抓包过程。实例1:syslog测试主机A(本例中129.73)通过syslog发送信息:“123456”,给主机B日志服务器(本例中120.90,需要配置syslog服务514端口的tcp和udp打开),在日志服务器主机B上抓......
  • 抓包指令tcpdump和包处理editcap指令 使用
    editcap的使用按照时间范围进行截取包editcap-A'YYYY-MM-DDhh:mm:ss'-B'YYYY-MM-DDhh:mm:ss'infileoutfile 从infile文件中选取从A-B时间范围内的包输出到outfile中editcap-A'YYYY-MM-DDhh:mm:ss'infileoutfile从infile文件中选取A时间点之后的数据,输出......
  • 通过 TCPView 还发现个流氓 KPKIService.exe 删掉
    叫统一安全中间件,就是个第三方做的key的安全检查,谁知道是哪年装的资料https://baijiahao.baidu.com/s?id=1717384219148345375&wfr=spider&for=pc---------------------------------------------生活的意义就是你自己知道你要做什么,明确目标。没有目标,后面都是瞎扯!https://p......
  • tcp bbr v3
    目前google发布了tcpbbrv2+fixbug===tcpbbrv3https://github.com/google/bbr/blob/v3/README.mdhttps://datatracker.ietf.org/meeting/117/materials/slides-117-ccwg-bbrv3-algorithm-bug-fixes-and-public-internet-deployment-00 http代理服务器(3-4-7层代理)-网络事件......
  • tcp连接断开的四次挥手。
    1.c端将FIN置1,向s端发送请求断开序列号例如是m;2.s端接收到后向c端发送应答将m+1;3.当s端完成数据交换也不需要通信的时候,向c端发送序列号n请求断开;4.c端将n+1后发送应答给s端。 ......
  • tcp三次握手。
    1.c端将SYN置一,然后向s端发送一串序列号例如x,这是第一次握手;2.s端接收到后发送x+1应答,同时发送一个自己的序列号y,这是第二次握手;3.c端收到应答后,将y+1发送给s端,完成第三次握手。注:SYN:同步的缩写,意思是双方保持步调一致。ACK:  确认字符。......
  • TCP基础
    一、TCP基本认识​ 介绍比较重要的部分​ ​ 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。​ 确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个......
  • netty同时支持tcp和websocket
    最近接手了别人的netty框架实现的im的一个项目,基于tcp实现通信,但是领导要求做一个网页版的聊天,接入到目前的系统,由于第一次接触这种项目,百度一圈大部分都是通过websocket实现通信的方式,最后通过chatgpt发现确实可以同时支持tcp和websocket,现在把方式放上Netty是一个高性能、异步事......
  • 03. TCP的3次握手4次挥手
    一、三次握手  TCP是稳定的传输方式,在接收、发送之前,双发需要建立一个虚拟的通道,这个过程称为3次握手。3次握手的流程如下:客户端调用connect()时发送一个带有标记的数据包,我们把建立连接时的第1次数据叫做SYN,其中由1个数字;服务器接收到这个SYN数据包,提取出数......
  • 用springBoot、netty写TCP客户端/服务端,并用TCP工具测试
    1.启动客户端和连接服务端packagecom.pkx.cloud.test.netty;importio.netty.bootstrap.Bootstrap;importio.netty.channel.*;importio.netty.channel.nio.NioEventLoopGroup;importio.netty.channel.socket.SocketChannel;importio.netty.channel.socket.nio.NioSock......