TCP 建立连接的三次握手与关闭连接的 四次握手

建立连接的三次握手


1-CLOSED:起始状态,无任何连接。

2-LISTEN:服务端建立socket之后需要listen进入LISTEN(侦听)模式,侦听来自远方的TCP连接请求。

3-SYN_SENT:客户端建立socket之后需要connect服务器,向服务端发送SYN=j(随机数)申请连接,然后会进入SYN_SENT状态。

报文1:客户端 A 将标志位 SYN 置为 1,随机产生一个值为 seq=J(J 的取值范围为=1234567)的数据包到服务器,客户端 A 进入 SYN_SENT 状态,等待服务端 B 确认;

4-SYN_RCVD:服务端在** 侦听模式 **下收到SYN后会向客户端回应ACK=j+1,同时发送SYN=k,然后进入SYN_RCVD状态。

报文2:服务端 B 收到数据包后由标志位 SYN=1 知道客户端 A 请求建立连接,服务四端 B 将标志位 SYN 和 ACK 都置为 1,ack=J+1,随机产生一个值 seq=K,并将该数据包发送给客户端 A 以确认连接请求,服务端 B 进入 SYN_RCVD 状态。

ACK是确认标志,可以附带进别的消息中,将ACK附带进SYN中,所以只发送一个SYN/ACK

5-ESTABLISHED:客户端收到ACK后进行验证,同时回应服务端发来的SYN,返回ACK=k+1,然后进入ESTABLISHED状态。服务端收到最后一个ACK后验证,然后进入ESBABLESHED。表示双方的连接建立完成,可以进行数据传输。

报文3:客户端 A 收到确认后,检查 ack 是否为 J+1,ACK 是否为 1,如果正确则将标志位 ACK 置为 1,ack=K+1,并将该数据包发送给服务端 B,服务端 B 检查 ack 是否为K+1,ACK 是否为 1,如果正确则连接建立成功,客户端 A 和服务端 B 进入 ESTABLISHED状态,完成三次握手,随后客户端 A 与服务端 B 之间可以开始传输数据了(双向)。


为什需要三次握手?

“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,造成server 端一直等待,浪费资源。

例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”


关闭连接的四次挥手



FIN_WAIT_1:在ESTABLISHED(连接)状态下,主动断开连接会向对端发送FIN,然后进入FIN_WAIT_1状态。

报文1:Client 【主动】发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入FIN_WAIT_1 状态。


CLOSED_WAIT:被动断开连接的一端收到FIN之后,会回应ACK,然后进入CLOSED_WAIT状态,在CLOSED_WAIT状态下,连接只能发送数据不能接收数据。

报文2:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。


FIN_WAIT_2:主动断开连接的一端收到FIN的ACK回应后会进入FIN_WAIT_2状态。此时无法再发送数据但是可以接受数据。

报文3:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入LAST_ACK 状态。

LAST_ACK:被动断开连接的一端在缓冲区数据发送完成后会发送FIN然后进入LAST_ACK状态。如果程序健壮性较差,在socket收到文件结束符之后没有关闭socket,此处不会发出FIN,导致连接停留在CLOSED_WAIT&FIN_WAIT_2状态。

TIME_WAIT:主动断开连接的一端在收到对端的FIN后回应ACK然后进入TIME_WAIT。此状态下连接已断开,但为了避免最后一个ACK在网络中迷路,而导致的状态紊乱,端口会被保留2*MSL的时长。


报文4:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。

CLOSED:在TIME_WAIT状态停留时间达到2*MSL之后进入CLOSED状态,表示无任何连接。

备注:MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值