三次握手和四次挥手

本文详细介绍了TCP建立连接的三次握手过程及其原理,并解释了为何采用三次而非两次或四次握手的原因。同时,文章还阐述了TCP断开连接的四次挥手过程。

TCP建立连接的三次握手

三次握手,是指建立一个TCP连接时,需要客户端与服务端之间总共传递三个包
三次握手同步了连接双方的序列号和确认号并交换了TCP窗口大小信息,客户端执行connect()时,自动触发三次握手

1.第一次握手:建立连接时,客户端A发送SYN包到服务端B,并进入SYN_SEND状态,等待服务端确认

2.第二次握手:服务端B收到SYN包,确认客户端的SYN后,向客户端发送一个SYN+ACK包,发送后服务端B进入SYN_RECV状态

3.第三次握手:客户端A收到服务端B的SYN+ACK包,向服务端发送确认包ACK,发送接收完毕,服务端和客户端进入ESTABLISHED状态,完成第三次握手

为什么TCP连接是三次握手,不是两次握手?为什么不是四次握手?
答:这主要是为了防止已经失效的连接请求忽然有传送到了,从而产生错误
假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理 又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手:此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源。 如果是三次握手:由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接
其中ACK和SYN只是两个标志位,没必要分成两个报文发送

第三次握手失败(ACK丢失)如何处理?
服务端等待最后一个ACK超时后,向客户端恢复RST报文,关闭socket,避免SYN泛洪攻击
在这里插入图片描述

TCP断开连接的四次握手

四次挥手,是指TCP断开连接时客户端和服务端之间需要传递四个包
客户端与服务端都可以发起挥手动作,在编程中,任意一方执行close()都可以产生挥手动作
1.第一次挥手:客户端A发送一个FIN,用来关闭客户端A到服务器B的数据传送

2.第二次挥手:服务器B收到FIN,发挥一个ACK,确认序号为收到的序号加1

3.第三次挥手:服务端B关闭与客户端A的连接,发送一个FIN到客户端A

4.第四次挥手:客户端A发回ACK报文确认

为什么建立连接协议是三次握手,而关闭连接是四次握手呢

答:TCP关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值