解答这个问题之前,要先解答为什么需要握手这个操作,能不能不握手? 如果对比一下UDP的通信流程和TCP的通信流程,可以发现,在UDP协议中,是没有握手这个操作的。 这里就引出了TCP与UDP的一个基本区别,TCP是可靠的通信协议,而UDP是不可靠的通信协议。 TCP为什么可靠?接收方收到的数据是完整,有序,无差错的。 UDP为什么不可靠?接收方接收到的数据可能存在部分丢失,顺序也不一定能保证。 TCP协议是为了实现可靠传输,通信双方需要判断自己已经发送的数据包是否都被接收方收到,如果没收到,就需要重发,为了实现这个需求,所以引出序号(sequence)和确认号(ack)的使用。 如上图为TCP三次握手的过程。 由TCP连接发起方(图中Clinent),发送第一个SYN位置1的TCP报文。初始序列号J为一个随机生成的数字,因为没收到过来自PC2的任何报文,所以确认序列号为无。 接收方(图中Server)接收到合法的SYN报文之后,回复一个SYN和ACK置1的TCP报文。初始序列号K为一个随机生成的数字,同时因为此报文是回复给PC1的报文,所以确认序列号为J1; PC1接收到PC2发送的SYN和ACK置位的TCP报文后,回复一个ACK置位的报文确认序列号为K1。PC2收到之后,TCP双向连接建立。 那么为什么TCP需要三次握手,而非两次? 正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步(SYN)序号。需要注意的是,序号并不是从0开始的,而是由发送方随机选择的初始序列号(SequenceNumber,)开始。由于TCP是一个双向通信协议,通信双方都有能力发送信息,并接受响应。因此,通信双方都需要随机产生一个初始的序列号,并且把这个起始值告诉对方。 为了实现可靠的数据传输,TCP协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。