三次握手针对的是TCP协议的创建连接,TCP协议是全双工的通讯方式(即存在两条通讯网络,接收和发送不是同一条网络)。
三次握手图示如下:
其中:SYN:同步标志位,在创建连接时有效;ACK:确认标志位,收到对方的数据包,用于通知对方已收到; seq:序列号;ack:确认号;序列号和确认号之间的依次+1就保证了数据包传输的完整性,如果中间有丢失数据包,能够通过序列号和确认号之间的关系找到是哪一个数据包丢失。
可以形象的记忆为:客户端要和服务器建立连接,使用客户端发送了一个建立的消息(SYN = 1:建立连接,ACK = 0:没有收到你的数据包,seq:我的序列号,即上一个数据包中对方的确认号) ,服务器收到消息之后同意建立连接并也发送一个建立连接的消息(SYN = 1:建立连接,ACK = 1 :确认收到你的数据包,seq:我的序列号,即上一个数据包中对方的确认号,ack:上一个数据包中对方的序列号+1),之后客户端收到这个信息之后,发送连接完成的数据包(SYN = 0:连接网络已完成,不需要置1,ACK = 1:确认收到你的数据包,seq:我的序列号,即上一个数据包中对方的确认号,ack:ack:上一个数据包中对方的序列号+1)之后返回,服务器在接收到这个数据包之后,连接创建完成,并返回。
思考:为什么三次握手只需要三次,而不是两次或者四次?
TCP是基于连接的稳定可靠通讯,每次数据包之间都需要有确认的依据,如果只有两次,客户端给服务器发送数据包,建立了一条通讯网络,之后服务器给客户端再发送一个数据包,建立一条通讯网络,这个就没有之后的确认信号,就会使得全双工通讯变得不够可靠,因为没有后面的一个确认号;为什么不是四个,有三个数据包就能够建立一个稳定的全双工通讯,没必要再多一个数据包,能够加快通讯的速度。这是个人观点,不喜勿喷。