TCP三次握手与四次挥手(一次明白)

TCP基本信息

默认端口号:80

LINUX中TIME_WAIT的默认时间是30s

TCP三次握手
三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态
客户端服务端客户端状态服务端状态
握手前CLOSELISTEN
客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN
二次握手服务端发送带有SYN/ACK标志的数据包到客户端SYN_SENDSYN_RCVD
客户端发送带有ACK标志的数据包到服务端三次握手ESTABLISHEDSYN_RCVD
握手结束ESTABLISHEDESTABLISHED

img

为什么是三次握手,两次不行吗?

三次握手主要是为了建立可靠的通信信道,是客户端和服务端同时具有发送和接收数据的能力.

两次握手只能保证单向连接是畅通的.(为了实现可靠数据传输,TCP协议的通信双方,都必须维护一个序列号,已标志发送出去的数据包中,哪些是已经被对方接收了的.三次握手的过程即是通信双方互相告知序列号起始值,并确认对方已经收到了序列号起始值的毕竟步骤;如果只是两次握手,至多只有连接发起放的起始序列号能够被确认,另一方选择的序列号则得不到确认)

三次握手能防止已经失效的连接请求又传到服务端,建立多余的连接,浪费系统资源.(假设客户端第一次握手时发送的请求报文SYN_1超时,携带Seqnum=90,客户端再次发起第一次握手请求报文SYN_2,携带Seqnum=100,若此时SYN_1先于SYN_2到达客户端.若为两次握手,此时服务端发送SYN_ACK_1到客户端,携带Seqnum=91,建立连接.SYN_2到达客户端,再建立一个连接,因此会造成资源浪费.若使用三次握手,客户端接收到SYN_ACK_1后发现其携带的Seqnum不对,便将其废弃,知道SYN_ACK_2到达,发现其符合条件,发送ACK到服务端,建立连接)

TCP四次挥手

四次挥手过程:

客户端服务端客户端状态服务端状态
挥手前ESTABLISTEDESTABLISTED
客户端发送带有FIN标志的数据包到服务端一次挥手FIN-WAIT-1ESTABLISTED
二次挥手服务端收到这个FIN,它发回一个ACK,确认序号为收到的序号+1FIN-WAIT-1CLOSED-WAIT
三次挥手服务端发送一个FIN数据包到客户端,关闭与客户端的连接FIN-WAIT-2LAST_ACK
客户端收到这个FIN,发挥ACK报文确认,并将确认序号设置为收到的序号+1四次挥手TIME-WAITLAST_ACK
经过2MSL挥手完成CLOSECLOSE

CLOSED-WAIT:表示等待关闭

TIME-WAIT:为了解决网络的丢包和网络不稳定所带来的其他问题,确保连接方能在时间范围内,关闭自己的连接.

  • 挥手前,客户端和服务端的状态都是ESTABLISHED(连接建立)
  • 第一次挥手,客户端发送带有FIN标志的数据包给服务端,客户端状态变为FIN-WAIT-1.
  • 第二次挥手,服务端收到客户端的数据包后,发送ACK确认帧给客户端,服务端状态变为CLOSED-WAIT.
  • 第三次挥手,客户端收到服务端的ACK确认帧后,状态变为FIN-WAIT-2.此时服务端可能有些数据还未处理完,待服务端处理完数据会发送带有FIN的数据包到客户端,此时服务端状态变更为LAST-ACK.
  • 第四次挥手,客户端收到服务端FIN报文后,回应一个ACK确认报文,此时客户端状态变更为TIME-WAIT.服务端收到ACK确认报文后状态变更为CLOSE,至此服务端完成连接的关闭.客户端等待2MSL时间后,自动进入CLOSE状态,至此客户端关闭连接.
参考文章

TCP三次握手

TCP四次挥手

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老布丁~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值