三次握手,四次挥手问题总结
三次握手
一、介绍TCP的三次握手?为什么TCP握手需要三次?
三次握手:
在建立一个TCP连接时,需要客户端和服务器总共发送三个包。
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始序列号为后面的可靠性传送做准备。
实质就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
1、流程:
●第一次握手:
客户端给服务器发送一个SYN报文,并指明客户端的初始化序列号ISN。此时客户端处于SYN_SENT状态。
首部的同步位SYN=1,初始序号seq=X,SYN=1的报文段不能携带数据,但是需要消耗一个序号。
●第二次握手:
服务器收到客户端的SYN报文后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s)。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器处于SYN_RCVD的状态。
在确认报文中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。
●第三次握手:
客户端收到SYN报文后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务器的SYN报文,此时客户端处于ESTABLISED状态。服务器收到ACK报文之后,也是处于ESTABLISHED装态,此时,双方已经建立起了连接。
确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=1,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。
三次握手的最重要目的是保证连接是双工的,可靠更多的是通过重传机制来保证。
2、 TCP三次握手,如果两次握手会怎样
设计上的缺陷
有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。
当A和B通信完成后,这个被A认为失效的消息,到达了B
对于B而言,以为这是一个新的请求链接消息,就向A发送确认,
对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息
这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了。
所以有了三次握手的修订
第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判
二、常见字段含义:
3、三次握手原理图: