1、TCP三次握手网络
第一次握手:Client 将标志位 SYN=1 ,随机产生一个值 seq=J ,并将该数据包发送给 Server 。此时,Client 进入SYN_SENT 状态,等待 Server 确认。
第二次握手:Server 收到数据包后由标志位 SYN=1 知道Client请求创建链接,Server 将标志位 SYN 和 ACK 都置为 1 ,ack=J+1,随机产生一个值 seq=K ,并将该数据包发送给 Client 以确认链接请求,Server 进入 SYN_RCVD 状态。此时,Server 进入 SYC_RCVD 状态。
第三次握手:Client 收到确认后,检查 ack 是否为 J+1 ,ACK 是否为 1 。
若是正确,则将标志位 ACK 置为 1 ,ack=K+1 ,并将该数据包发送给 Server 。此时,Client 进入 ESTABLISHED 状态。
Server 检查 ack 是否为 K+1 ,ACK 是否为 1 ,若是正确则链接创建成功。此时 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间能够开始传输数据了。
Client 和 Server 互相作了一次 SYNC 和 ACK 。spa
问题:TCP为何须要三次握手,为何不是两次?3d
为了防止已失效的链接请求报文忽然又传送到了服务端,于是产生错误。
客户端发出的链接请求报文并未丢失,而是在某个网络节点长时间滞留了,以至延误到连接释放之后的某个时间才到达 Server 。code
若不采用“三次握手”,那么只要 Server 发出确认数据包,新的链接就创建了。因为 Client 此时并未发出创建链接的请求,因此其不会理睬 Server 的确认,也不与 Server 通讯;而这时 Server 一直在等待 Client 的请求,这样 Server 就白白浪费了必定的资源。
若采用“三次握手”,在这种状况下,因为 Server 端没有收到来自客户端的确认,则就会知道 Client 并无要求创建请求,就不会创建链接。
2、TCP四次挥手server
第一次挥手:Client 发送一个 FIN=M ,用来关闭 Client 到 Server 的数据传送。此时,Client 进入 FIN_WAIT_1 状态。 第二次挥手,Server 收到 FIN 后,发送一个 ACK 给 Client ,确认序号为 M+1(与 SYN 相同,一个 FIN 占用一个序号)。此时,Server 进入 CLOSE_WAIT 状态。注意,TCP 连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。 第三次挥手,Server 发送一个 FIN=N ,用来关闭 Server 到 Client 的数据传送。此时 Server 进入 LAST_ACK 状态。 第四次挥手,Client 收到 FIN 后,此时 Client 进入 TIME_WAIT 状态。接着,Client 发送一个 ACK 给 Server ,确认序号为 N+1 。Server 接收到后,此时 Server 进入 CLOSED 状态,完成四次挥手。
问题:TCP为何须要四次挥手?blog
首先TCP 是全双工模式,须要双向都断开链接。
当主机 1 发出 FIN
报文段时,只是表示主机 1 已经没有数据要发送了,主机 1 告诉主机 2 ,它的数据已经所有发送完毕了;可是,这个时候主机 1 仍是能够接受来自主机 2 的数据;资源
当主机 2 返回 ACK
报文段时,表示它已经知道主机 1 没有数据发送了,可是主机 2 仍是能够发送数据到主机 1 的。class
由于主机 2 此时可能还有数据想要发送给主机 1 ,因此挥手不能像握手只有三次,而是多了那么“一次”!cli
当主机 2 也发送了 FIN
报文段时,这个时候就表示主机 2 也没有数据要发送了,就会告诉主机 1 ,我也没有数据要发送了,以后彼此就会愉快的中断此次 TCP 链接。请求
问题:为何须要TIME_WAIT?
由于在第四步的时候,client发送的ACK可能丢失并致使server从新发送FIN消息,TIME_WAIT维护链接状态.若是执行主动关闭的一方client不进入到TIME_WAIT状态就关闭链接那会发生什么呢?当重传的FIN消息到达时,由于TCP已经再也不有链接的信息了,因此就用RST(从新启动)消息应答,致使server进入错误的状态而不是有序终止状态,若是发送最后ACK消息的一方处于TIME_WAIT状态并仍然记录着链接的信息,它就能够正确的响应对等方server的FIN消息了.