TCP的三次握手和四次挥手

TCP和UDP是两个重量级的传输层协议。UDP(用户数据报协议)在传送数据之前不需要先建立连接,远程主机在收到UDP报文后,不需要给出任何确认,虽然UDP不提供可靠交付,但在某些情况下UDP的确是一种最有效的工作方式,一般用于即时通信(语音、视频、直播等)。TCP(传输控制协议)提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接,由于TCP要提供可靠的面向连接的服务,这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源,TCP一般用于文件传输、发送和接收邮件、远程登陆等场景

三次握手可以理解为需要三个步骤才能建立握手/连接的机制,进行三次握手的作用是为了确认双方的接收和发送能力是否正常、指定自己的初始化序列号(ISN)为后面的可靠性传输作准备。

刚开始客户端处于Closed(没有任何连接状态)的状态,而服务端处于Listen(侦听来自远方TCP端口的连接请求)状态

1)第一次握手:客户端向服务端发送一个SYN报文(SYN=1),并指明客户端的初始化序列号ISN(x),表示本报文段所发送的数据的第一个字节的序号。此时客户端处于等待匹配的状态

2)第二次握手:服务端收到客户端的SYN报文之后,会发送SYN报文作为应答(SYN=1),并且指定自己的初始化序列号ISN(y),同时会把客户端的ISN+1作为确认号ack的值,表示已经收到了客户端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是x+1,此时服务端处于(在收到和发送一个连接请求后等待对连接请求的确认)的状态

3)第三次握手:客户端收到服务端响应的SYN报文之后,会发送一个ACK报文,也是一样把服务端的ISN+1作为ack的值,表示已经收到了服务端发来的SYN报文,希望收到的下一个数据的第一个字节的序号是y+1,并指明此时客户端的序列号,此时客户端处于 Establised 状态

服务器收到 ACK 报文之后,也处于 Establised 状态,至此,双方建立起了 TCP 连接。

Established:代表一个打开的连接,数据可以传送给用户

ISN是动态生成的:三次握手的其中一个重要功能是客户端和服务端交换ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据,如果ISN是固定的,攻击者很容易猜出后续的确认好

第三次握手的时候,是可以携带数据的。但是第一次、第二次握手时绝对不可以携带数据

SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 则回复确认包,并等待 Client 确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用半连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

服务器发送完 SYN-ACK 包,如果未收到客户端响应的确认包,也即第三次握手丢失。那么服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除

TCP 四次挥手释放连接

建立一个 TCP 连接需要三次握手,而终止一个 TCP 连接要经过四次挥手。这是由于 TCP 的半关闭(half-close)特性造成的,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

TCP 连接的释放需要发送四个包(执行四个步骤),因此称为四次挥手,客户端或服务端均可主动发起挥手动作

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态

 注意 !!!这个时候由服务端到客户端的 TCP 连接并未释放掉,需要经过时间等待计时器设置的时间 2MSL(一个报文的来回时间) 后才会进入 CLOSED 状态(这样做的目的是确保服务端收到自己的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文给服务端)。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。

通俗的来说,两次握手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次握手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿码德乌斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值