TCP的三次握手四次挥手过程原理

  • A+
所属分类:WEB应用

三次握手

TCP的三次握手四次挥手过程原理

原理:

  1. 第一次握手: Client将标志位syn设置为1,随机产生一个Number值seq=100,并将数据发送给Server,Client进入SYN_SENT状态,等待Server确认;
  2. 第二次握手: Server收到数据包后Client设置的标志位syn=1知道Client要求建立连接,Server将标志位syn和ack都置为1,并且发送一个确认序号ack=100+1,然后随机产生一个值seq=130,并将该数据包发送给CLient以确认连接请求,Server进入SYN_RCVD状态。
  3. 三次握手 Client收到确认后,检查ack状态是否为100+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=130+1,并将该数据包发送给Server,Server检查ack是否为130+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

    一个完整的三次握手也就是请求—应答—再次确认

四次挥手

TCP的三次握手四次挥手过程原理

原理:

  1. 第一次挥手: Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  2. 第二次挥手: Server收到FIN后,发送一个ACK给Client,确认序号为ack=100+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  3. 第三次挥手: Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  4. 第四次挥手: Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为131+1,Server进入CLOSED状态,完成四次挥手。

Q/A(Copy过来的)

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

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

  • 为什么建立连接要三次握手?

目的: 防止已经失效的连接请求到达服务端,创建无效的连接,浪费资源。
说明: 当客户端发出的第一个连接请求在网络上的某个节点被滞留了(网络会存在许多不可靠的因素),过一段时间后突然又到达了服务端,服务端误以为这是一个新的建立连接的请求,于是就会向客户端发出确认包并建立连接。
实际上客户端当前并没有发出创建连接的请求,就会丢弃服务端的确认包。而服务端却创建了连接并等待客户端发送数据,浪费了相关的资源。

  • SYN攻击

在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect)。此时服务器处于SYN_RECV状态,当收到ACK后,服务器转入ESTABLISHED状态.

SYN攻击就是:攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复ACK确认包,并等待客户的确认从而建立连接。由于源地址是不存在的,不会再发送ACK确认包,所以服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

SYN攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击

  • 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
admin

发表评论

您必须登录才能发表评论!