计算机网络第二弹——三次握手和四次握手

三次握手建立连接:

  1. 第一次握手:client将标志位SYN置为1,随机产生一个seq=x,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认;
  2. 第二次握手:server收到数据包后由标志位SYN=1知道client请求建立连接,server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给client以确认连接请求,server进入SYN_RCVD状态;
  3. 第三次握手:client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=k+1,并将该数据包发送给server,serverr检查ack是否为k+1,ACK是否为1,如果正确则建立连接成功,client和server进入ESTABLISHED状态,完成三次握手,随后client和server之间可以开始传输数据了。

计算机网络第二弹——三次握手和四次握手_第1张图片

四次握手断开连接:

  1. 第一次握手:client发送一个FIN,用来关闭client到server的数据传送,client进入FIN_WAIT_1状态;
  2. 第二次握手:server收到FIN后,发送一个ACK给client,确认序号为收到序号+1,server进入CLOSE_WAIT状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,客户端仍要接收;
  3. 第三次握手:server发送一个FIN,用来关闭server到client的数据传送,server进入LAST_ACK状态;
  4. 第四次握手:client收到FIN后,client进入TIME_WAIT状态,接着发送一个ACK给server,确认序号为收到序号+1,server进入CLOSED状态,完成四次握手。

计算机网络第二弹——三次握手和四次握手_第2张图片

为什么TCP连接不采用一次握手?

如果采用一次握手,客户端只要发送了连接请求就认为TCP连接上了,也许服务器根本不存在或未打开,如果继续发送数据的话,浪费带宽;而且客户端需要服务器传来的初始序号和很多选项,这个都做不到。

为什么TCP连接需要三次握手而不采用两次握手?

当采用两次握手,如果客户端发送的连接请求报文延迟到连接释放以后的某个时间才到达server,到达后server误以为是client发出的一个新的连接请求,于是就向客户端发送确认数据包,新的连接就建立了。由于此时client并未发出建立连接的请求,并不会理睬server的确认与之通信,但server却以为新的连接已经建立,一直等待client发来数据,server的很多资源就白白浪费了。如果采用三次握手建立连接,在这种情况下,由于server没有收到来自客户端的确认,就会知道client没有要求建立连接,连接就不会被建立。即三次较两次对这种情况可以防止server端一直等待,浪费资源。

从Dos攻击角度,只有两次握手的话,服务器可能会因为遭遇恶意攻击而瘫痪,客户端可以发送大量伪造源地址的连接请求,服务器确认后会误以为连接已经建立,最后会耗尽资源,进而拒绝所有合法的请求连接,无法提供正常的服务。

采用三次握手就能避免恶意攻击吗?

即使采用三次握手,服务器也可能被恶意攻击而瘫痪,不过难度增加很多。黑客可以控制许多主机对一台服务器进行泛洪攻击,发送大量连接请求去请求服务器服务,耗尽服务器资源,使其无法为合法用户提供服务,从而使服务器瘫痪。(DDoS攻击)

为什么断开连接需要四次握手而不是三次握手,中间发送FIN和ACK为什么不一起发送?

因为TCP是全双工模式,接收到FIN意味着将没有数据再发来,但是还是可以继续发送数据。所以需要先发送ACK到客户端再发送FIN,否则可能存在FIN先接收完毕然后无法接收ACK的情况。

客户端不断进行请求连接会怎样?

客户端会为每个请求创建一个连接,并向其发送确认报文,然后等待客户端进行确认。DDoS(Distributed Denial of Service)分布式阻断服务攻击:

  • 客户端向服务端发送连接数据包
  • 服务端向客户端发送确认数据包
  • 客户端不向服务端发送确认数据包,服务器一直等待来自客户端的确认。

DDoS预防(没有彻底根治的办法,除非不使用TCP):

  • 限制同时打开SYN半连接的数目
  • 缩短SYN半连接的Time out时间
  • 关闭不必要的服务


主要参考:点击打开链接

你可能感兴趣的:(计算机网络)