HTTP的三次握手与四次挥手

第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。服务器

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;code

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP链接成功)状态,完成三次握手。队列

完成三次握手,客户端与服务器开始传送数据,在上述过程当中,还有一些重要的概念:同步

未链接队列请求

在三次握手协议中,服务器维护一个未链接队列,该队列为每一个客户端的SYN包(syn=j)开设一个条目,该条目代表服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的链接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。程序

关闭TCP链接:改进的三次握手(四次挥手)通信

对于一个已经创建的链接,TCP使用改进的三次握手来释放链接(使用一个带有FIN附加标记的报文段)。TCP关闭链接的步骤以下:数据

第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。客户端

第二步,主机B收到这个FIN报文段以后,并不当即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知本身相应的应用程序:对方要求关闭链接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。协议

第三步,主机B的应用程序告诉TCP:我要完全的关闭链接,TCP向主机A送一个FIN报文段。

第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示链接完全释放。

问题1: 为何要三次握手?

答:三次握手的目的是创建可靠的通讯信道,说到通信,简单来讲就是数据的发送与接收,而三次握手最主要的目的就是双方确认本身与对方的发送与接收机能正常。

第一次握手:Client什么都不能确认;Server确认了对方发送正常

    第二次握手:Client确认了:本身发送、接收正常,对方发送、接收正常;Server确认了:本身接收正常,对方发送正常

    第三次握手:Client确认了:本身发送、接收正常,对方发送、接收正常;Server确认了:本身发送、接收正常,对方发送接收正常

因此三次握手就能确认双发收发功能都正常,缺一不可。

问题2:为何要发送特定的数据包,随便发不行吗?

答:三次握手的另一个目的就是确认双方都支持TCP,告知对方用TCP传输。

第一次握手:Server 猜想Client可能要创建TCP请求,但不肯定,由于也多是Client乱发了一个数据包给本身

    第二次握手:经过ack=J+1,Client知道Server是支持TCP的,且理解了本身要创建TCP链接的意图

    第三次握手:经过ack=K+1,Server知道Client是支持TCP的,且确实是要创建TCP链接

注释:SYN是标志位,SYN=1表示请求链接;

相关文章
相关标签/搜索