一、三次握手
1.什么是三次握手?
在进行TCP数据传输时要确保数据传送的稳定性,三次握手就是对数据与数据段进行协商跟踪是数据的发送与接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。
2.三次握手过程
第一次握手
B的TCP服务区进程先创建传输控块TCB,准备接受用户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待用户的连接请求。
第二次握手
A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN 报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户端进程进入SYN-SENT状态。
第三次握手
B收到连接请求报文段后,如同意连接,则向A发送确认。在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选一个初始序号seq=y。这个报文段也不携带数据,同样需要消耗一个序号,此时TCP服务器进程进入SYN-RCVD状态。
3.为什么要进行三次握手?
1.为了防止已过期的连接再次传回主机
如果采用两次握手也许会引发一些故障,比如,若A要连接到B,但由于某些原因信息未能传到B主机,于是A又发了一次,于是连接建立了,但在A与B正在进行数据传输时,失去的连接突然又传到B主机,B主机认为连接是建好的,于是在发送完信息后等待A发送东西过来。
2.可以预防发生死锁
考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分 组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
二、四次挥手
1.什么是四次挥手?
四次挥手即连接终止协议,是用来确保TCP能正常释放的。
第一次挥手:
TCP客户端先发来一个fin,用来关闭客户到服务器之间的连接;
第二次挥手:
服务器收到这个fin,将会发回一个确认号,确认号是ack=u+1;
第三次挥手:
服务器关闭到客户的连接,并发送一个fin给客户端;
第四次挥手:
客户端发回一个ACK确认报文,并且确认号为ack=u+1。
2.为什么要进行四次挥手?
由于TCP是全双工的,因此在接收到fin时知道将不会有数据传过来,但它却依然可以传送数据,因此在客户端收到fin后再向服务器端发送确认信号,之后服务器端再断开与客户端的连接,然后客户端再发出确认信号,这样整个连接才能被释放,如果少一次挥手的话,则虽然一方已经将连接断开,但另一方依然可以接收它所发送的数据,这样连接就没有被完全断开,因此要进行四次挥手。