TCP三次握手和四次挥手

在可靠的TCP网络通信中,客户端和服务器端通信建立连接的过程可以简单表述为:三次握手(连接建立阶段) 四次挥手(释放连接阶段)

两个序号和三个标志位:

  (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
  (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
  (A)URG:紧急指针(urgent pointer)有效。
  (B)ACK:确认序号有效。
  (C)PSH:接收方应该尽快将这个报文交给应用层。
  (D)RST:重置连接。
  (E)SYN:发起一个新连接。
  (F)FIN:释放一个连接。

 在可靠的TCP网络通信中,客户端和服务端通信建立连接的过程可简单表述为三次握手(建立连接的阶段)和四次挥手(释放连接阶段)。

在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,

因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;

第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

 不管哪一方先发起连接请求,一旦连接建立,就可以实现双向的数据传输而不存在主从关系。

为什么需要第三次握手?

还要发送一次确认是为了防止已失效的连接请求报文段突然又传到了B。

假设只有两次连接的情况下:A发出请求连接,B做出回应,连接正常建立。但是如果A发送一个报文段后,节点可能会产生滞留情况从而导致延误到达,当到达后,B会发出回应;

但A知道自己并没有发送连接的请求,所以不会理睬B的这个确认。这时,A也不会发送任何数据,而B却以为新的连接建立起来了,一直在等待A给自己发送消息,这就会导致B的资源会被白白浪费。

而如果采用了第三次握手,A知道自己发送失误后,就不会发送给B的第二次确认,那么B也不会收到A的确认,也就知道连接并没有成功建立!

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,

收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。

首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT(终止等待)状态。
 (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号ack+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT(半关闭)状态。

 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
 (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么TCP释放连接需要四次?

由于TCP存在半关闭的状态(单方向的关闭)造成的。因为TCP的连接时全双工的,所以在关闭时需要在每个方向上单独就行关闭。当一方完成它的数据发送任务,就发送一个FIN来告知另一方要终止这个方向的连接。

注:发送了FIN只是表示这端不能继续发送数据,但是还可以接收数据;

原文地址:https://www.cnblogs.com/laurarararararara/p/12157993.html