“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
所谓的“三次握手”:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。[1]
为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。
关键字说明:
- SYN:Synchronize Sequence Numbers,同步序列编号
- ACK:Acknowledge Character,确认字符
- SEQ:Sequence Number,序列号
第一次握手:客户端发起,发送SYN请求报文,序列化:X;服务器收到SYN请求报文。
第二次握手:服务器端发起,发送ACK确认报文,确认号:X+1;发送SYN请求报文,序列号Y,客户端收到SYN/ACK请求确认报文。
第三次握手:客户端发送ACK确认报文,确认号Y+1,服务器端收到ACK确认报文。
ok,知道了TCP的三次握手的基本工作原理之后,就可以解释为什么TCP需要三次握手?为什么不设计成两次握手就可以?
比如在网络环境比较复杂的情况,客户端可能会连续发送多次请求。如果只设计成两次握手的情况,服务端只能一直接收请求,然后返回请求信息,也不知道客户端是否请求成功。这些过期请求的话就会造成网络连接的混乱。
所以设计成三次握手的情况,客户端在接收到服务端SEQ+1的返回消息之后,就会知道这个连接是历史连接,所以会发送报文给服务端,告诉服务端。
所以TCP设计成三次握手的目的就是为了避免重复连接。
然后可以设计成四次握手?五次握手?不可以?
答案是也是可以的,不过为了节省资源,三次握手就可以符合实际情况,所以就没必要设计成四次握手、五次握手等等情况