tcp的三次握手和四次挥手
Posted jiezao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcp的三次握手和四次挥手相关的知识,希望对你有一定的参考价值。
1.1重点
首先我们需要明确tcp连接的最大特点或者说目的就是建立可靠的双工通信。也就是说所谓的三次握手和四次挥手都是为了这个目标服务的。
1.1.1三次握手
- 主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。(其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x);
- 主机B收到请求后,会发回连接确认数据包。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认号ack(B)=seq(A)+1=x+1)
- 第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;
上面大概就是教科书上对建立连接(也就是三次握手)的概述了。在这个建立连接的过程,首先我们知道的是建立连接的请求是由客户端发起的,而服务器则是被动响应。然后大概就是三次通信的过程,由于我们需要建立可靠的双向通信,也就是说对于双方而言都需要能够主动的发送数据和接受数据。那么这里双方都需要知道四条信息:
- 第一次发送请求数据包,当服务器接收到消息后:就知道了自己的接功能和对方的发功能正常,这个时候进入准备接收数据。
- 第二次服务器返回数据包,当客户端接收到消息后:知道了自己的发送,接受功能正常。也知道对方的发送接收功能正常。(其实这个时候就已经可以向服务器单方面发送数据了,只不过服务器还不确定客户端是否能够接收数据,所以不会发送数据)
- 第三次客户端发送数据包给服务器,服务器接受到消息后:知道了自己的发送正常和对方的接受正常。这个时候可以向客户端发送数据了。
上面就是我个人对tcp三次握手的理解。对于一些常见问题应该也能够得出答案吧,比如为什么不能够只连接两次。没有第三次连接,这里就会导致服务器不确定自己发出的数据客户端是否能够稳定接收到呀。
1.1.2四次挥手
- 首先客户端A发送一个FIN,用来关闭客户到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。
- 服务器收到这个FIN,它发回一个ACK,确认号ack为收到的序号加1。
- 关闭服务器到客户端的连接:也是发送一个FIN给客户端。
- 客户段收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加1。 首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
其实只要注意连接的建立是由客户端主动提出的,而释放连接则是双方都可以主动提出这个特点结合三次握手的过程就很容易想清楚。
第一次a发送释放请求被b接收:
第二次b响应a的请求被a接收:注意这个时候只是关闭了a->b的发送通道,由于不确定b->a的数据是否发送完成,所以该通道依旧存在。
第三次b发送释放请求被a接收:
第四次a响应b的释放请求被b接收:
以上是关于tcp的三次握手和四次挥手的主要内容,如果未能解决你的问题,请参考以下文章