三次握手过程
第一次:客户端向服务器发送数据包,服务器端收到了
服务器端可以成功确认发送端的发送功能和服务器端的接收功能正常。
第二次:服务器端向客户端发送数据包,客户端收到了
客户端可以成功确认客人端的发送和接收功能以及服务器端的发送和接受功能均正常
第三次:客户端向服务器端发送数据,服务器端收到了
服务器端可以成功确认客人端的发送和接收功能以及服务器端的发送和接受功能均正常
因此必须经过三次握手才能让客户端和服务器端确认双方的接受和发送功能均正常。
四次挥手过程
第一次:甲方向乙方发送指令(FIN报文段)告知要关闭链接
第二次:乙方收到指令后向甲方回复一个ACK告知已经收到指令
注:此时甲方停止发送数据,但依然可以接受从乙方发来的数据,乙方正常发送数据
第三次:乙方向甲方发送指令(FIN报文段)告知要关闭链接 至此,双方才均关闭链接。
第四次:甲方收到指令后向乙方回复ACK告知已收到指令
之所以乙方收到甲方发来的关闭指令后只是发送ACK确认而不是直接发送关闭指令直接关闭链接是因为结束数据传输的指令必须由上层应用给出。
补充问题:
1.为什么建立连接时是三次握手而关闭连接却是四次挥手?
这是因为服务器端再LISTEN状态下,收到建立连接请求时的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时收到对方的FIN报文时,仅仅表示对方不再发送数据了,但是还能接收数据,己方是否现在关闭发送数据的通道需要上层应用来决定。
2.发送数据时为什么要使用ACK来确认?
这是因为TCP使用IP来传输报文段,而IP不提供重复消除或者保证次序正确的功能,另一方面,TCP是一个字节流协议,绝不会以杂乱的顺序向上层程序发送数据,因此TCP接收端会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号报文段被填满。