TCP三次握手四次挥手

    xiaoxiao2021-03-25  109

    简明理解三次握手和四次挥手

    注:三次握手和四次挥手本身并不复杂,但却可以从很多角度理解这两个过程,本文仅取一个视点解读,如有其它看法欢迎留言交流。

    三次握手与四次挥手分别对应TCP连接建立过程与断开过程,先上TCP报文格式:

    三次握手过程:

    问题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连接

    问题3:上图中的SYN和ACK是什么?

    答:SYN是标志位,SYN=1表示请求连接;

            ACK其实就是ack后面加上的那个数,真正发送的时候不单独发ACK,只发ack,下面四次挥手的图同理

    四次挥手:

    问题1: 为什么要四次挥手?

    答:根本原因是,一方发送FIN只表示自己发完了所有要发的数据,但还允许对方继续把没发完的数据发过来。

            举个例子:A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。

    问题2:为什么双方要发送这样的数据包?

    答:和握手的情况类似,只是为了让对方知晓自己理解了对方的意图。

    参考文章:

    1.http://blog.csdn.net/renzhenhuai/article/details/12105457

    2.http://blog.chinaunix.net/uid-20726927-id-2455485.html

    转载自: 简明理解三次握手和四次挥手

    一,三次握手

    TCP使用三次握手建立一个连接:

    第一次握手:客户端发送SYN包至服务器,并进入SYN_SENT状态,等待服务器确认

    第二次握手:服务器收到客户端的SYN包,发送一个ACK,同时发送自己的SYN,此时服务器进入SYN_RCVD状态

    第三次握手:客户端接收到服务器发送的SYN+ACK后,进入ESTABLISHED状态,并发送服务器SYN包的确认ACK,服务器接收到客户端ACK后,进入ESTABLISHED状态

    当客户端和服务器都进入ESTABLISHED状态后,客户端和服务器之间就可以开始双向传递数据了

    二,四次挥手

    TCP使用四次挥手关闭一个连接:

    第一次挥手:主动关闭方发送一个FIN并进入FIN_WAIT1状态

    第二次挥手:被动关闭方接收到主动关闭方发送的FIN并发送ACK,此时被动关闭方进入CLOSE_WAIT状态;主动关闭方收到被动关闭方的ACK后,进入FIN_WAIT2状态

    第三次挥手:被动关闭方发送一个FIN并进入LAST_ACK状态

    第四次挥手:主动关闭方收到被动关闭方发送的FIN并发送ACK,此时主动关闭方进入TIME_WAIT状态,经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接

    tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 (1)客户端A发送一个FIN,用来关闭客户A到服务器B的 数据传送(报文段4)。 (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。 (3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。 (4)客户端A发回ACK 报文确认,并将确认序号设置为收到序号加1( 报文段7) TCP 采用四次挥手关闭连接如图所示为什么建立 连接协议是 三次握手,而关闭连接却是四次握手呢? 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了, 所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

    转载请注明原文地址: https://ju.6miu.com/read-9318.html

    最新回复(0)