在建立端到端的虚链路时,最重要的就是理解三次握手的简单实现与规则
三次握手有以下几点重要作用
一:是为了确认服务器以及客户端双方的发送能够与接收能力,所以在三次握手中,双方会进行很多次状态的改变。
二:三次握手确保了双方同步各自的序列号,为了后面更进一步的传输做准备工作
三:三次握手帮助TCP建立了一个稳定的通信通道,让数据方便快捷的传输,且如果有多个链接尝试同时链接,三次握手确保了只有一个连接被建立,这节约了资源
第一次握手 :客户端会给服务器发送一个带有SYN(同步序列编号)的TCP报文,且指明客户端自己的初始化序列号(ISN),此时服务器接收到了报文,这样就让服务器知道了客户端的发送功能正常,但是服务器并不知道客户端的接收功能正常与否,此时的客户端处于SYN_SENT状态
第二次握手 :在第一次的基础上,服务器收到了SYN报文,知道了客户端的发送功能正常后向客户端回答一个SYN+ACK的同步确认报文,其中ACK报文包含的确认号是ISN+1,同时服务器也会设置自己的初始序列号(ISN),所以客户端收到以后就能知道啊服务器的接收与发送能力正常,此时服务器处于SYN_REVD状态
第三次握手:客户端收到服务器的确认报文时,再次给服务器发送一个值为服务器的ISN+1的ACK的报文,并进入ESTABLISHEN状态,当服务器收到此报文时,服务器也进入ESTABLISHED状态,这样双方就完成了三次握手并互相确定了接收与发送功能的正常,双方就此建立了链接
其中,(ISN)是随机生成的一个不固定的值
四次断开(四次挥手)
四次挥手有以下几点的作用
一:通过四次挥手,双方能够释放如内存,文件描述符的资源
二:第一次挥手前确保了双方的数据全部都发送完毕且成功接收
三:四次挥手是有顺序的关闭且防止了已关闭的链接重新出现与尚未送达的的数据丢失
第一次挥手:客户端完成了数据的传输后向服务器发送一个FIN(结束)报文并进入FIN_WAIT_1状态
第二次挥手:服务器收到了FIN报文后,发送一个ACK的报文,该报文的值也是客户端ISN+1,同时服务器也进入CLOSE_WAIT状态
第三次挥手:客户端收到了ACK报文后进入FIN_WAIT_2状态,且服务器向客户端发送FIN报文.
第四次挥手:服务器发送FIN报文给客户端,客户端收到该FIN报文后再次回应一个ACK报文并进入TIME_WAIT状态并且等待一定时间以确保对方收到了ACK报文后再关闭连接进入CLOSED状态,而服务器端收到ACK报文后也进入CLOSED状态
在四次挥手中,理解TIME_WAIT状态极为重要,在客户端接受到服务器发送的FIN报文并回复ACK报文后就进入此状态进行等待,其原因就是确保服务器收到了ACK报文,若服务器未收到,则在TIME_WAIT这段时间内。客户端就会收到服务器因没收到客户端发送的ACK报文而重新发送的FIN 报文。