三次握手,四次挥手

推荐阅读

面试官,不要再问我三次握手和四次挥手

三次握手

连接过程

服务器和客户端之间的简短对话
服务器端调用listen后进入LISTEN状态, 等待客户端连接。
在这里插入图片描述
第一次连接:(Client)SYN
当客户端发送来SYN连接请求时:“服务器,我想要请求你的服务”。
服务器收到SYN请求之后,将客户端的这个socket请求放在一个半连接队列中。
第二次连接:(Server)SYN+ACK
服务器回复客户端ACK+SYN,“你发送的连接请求我已经收到了,我允许你访问我的服务器,你来吧!”。
第三次连接:(Client)ACK
当客户端收到服务器的SYN+ACK之后,客户端知道了,人家服务器允许我连接它了,我赶紧给人吱一声,回复一个ACK,先占个坑位。
三次握手之后
服务器收到这最后一次连接请求ACK之后,服务器检测到对端是真实IP,服务器和客户端之间相互信任了,服务器为这个socket通信开辟一定的系统资源,维护双方通信。
服务器将连接成功的socket维护在另一个队列中,当服务器调用accept时候,直接从这个已完成连接队列去获取连接成功的socket,然后进行通信。

为什么需要三次握手?(防止DOS攻击)

在网络中的通信时不安全的,服务器在给客户端提供服务的同时,还需要防御DOS攻击。如果有伪造的SYN连接,服务器会开辟大块内存资源用于TCP连接,当这种“占着茅坑不拉屎的行为”数目多到一定程度,服务器资源就会被耗尽,当有正常的TCP连接到来时候就会出现拒绝访问攻击(Denial of Service)。

所以服务器说了,别人来申请我的连接时候,我先不给它开辟资源,我先看看它是不是骗子。服务器在第二次连接报文中嵌入了一个“Opaque Cookie”,如果对端是真实IP,那么它可以收到我的这个SYN+ACK,那在它回复我的报文中,我来检测,第三次报文来了之后,解密之后,判断“Opaque Cookie”是否是真实的。检测通过才开辟内存,维护连接,否则,直接丢弃报文。

SYN泛洪攻击

SYN攻击利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求(SYN),而被攻击端发出的响应报文(ACK+SYN)将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中(半连接挂起等待状态,接收不到攻击端的ACK,就重发ACK+SYN,直到超过时间SYN timeout,才会丢弃连接,释放资源)消耗了资源,如果有成千上万的这种半连接,主机资源将被耗尽,从而达到攻击的目的。SYN泛洪攻击也是DOS攻击的一种方式。

四次挥手

挥手过程

在这里插入图片描述
1.TCP是全双工模式,不仅要拆除客户端对于服务器的连接,还要拆除服务器对于客户端的连接。
2. 主动断开方发送FIN包给被动断开方,被动方知道了主动方要把连接断开了,被动方处于CLOSE_WAIT状态,继续接受主动方的数据,但不再发送数据给主动方,并且给主动方发送ACK确认包。
3. 由于网络中可能还存在双方之前发送的数据,因此,被动方要在保证数据传输完毕了之后,然后给客户端发送FIN包拆除连接。
4. 主动方收到被动方的FIN包之后,发送ACK给被动方,主动方进入TIME_WAIT状态。

挥手过程须知

  1. 正常情况下,调用close(),产生的其中一个效果就是发送FIN,只有双方都调用close(),才会出现正常的四次挥手。
  2. 如果是服务器,发起四次挥手是在关闭accept()返回的套接字,而不是socket()返回的套接字。
  3. 主动调用 close() 一方才会进入 TIME_WAIT。

TIME_WAIT

  1. 主动关闭方在最后一次发送ACK之后,有可能这个ACK会丢失。被动方发送FIN超时未收到ACK,被动方会重传FIN包。因此主动断开方必须在保证连接真正断开了,才能释放资源。
  2. 主动方等待2个MSL时间,确保ACK已经发送到对方。TIME_WAIT时间内,如果收到被动方超时重传的FIN包,计时器重置。(MSL最大报文生存周期)
  3. 在超过2个MSL时间后,主动方再收到FIN包,主动方处于CLOSE状态,这个FIN包将会被丢弃。

TIME_WAIT的好处

  • 有TIME_WAIT,就可以保证最后一个报文在某种程度达到基本可靠,“TIME_WAIT期间没有消息就是好消息”
  • 有TIME_WAIT,把通信信道双方以前的合法数据尽量消散。
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值