TCP三次握手四次挥手过程

三次握手

为了建立可靠的TCP连接,握手过程中会初始化Seq的初始值,从而保证通信的顺序性,防止因网络问题而乱序;

TCP三次握手

第一次握手:建立连接时,A发送SYN包(seq=x)到B,并进入SYN_SEND状态,等待B确认;

第二次握手:B收到SYN包,必须向A返回一个ACK包(ack=x+1)确认,同时自己也发送一个SYN包(syn=y),即SYN+ACK包, 并进入SYN_RECV状态;

第三次握手:A收到B的SYN+ACK包,向B发送ACK包(ack=y+1)确认,此包发送完毕,A和B进入established状态;

四次挥手

为了终止TCP连接。

四次挥手

第一次挥手:A发送一个FIN(seq=x)包,ACK(ack=y)包{上图中没有注明]用来关闭A到B的数据传送,A进入FIN_WAIT_1状态;

第二次挥手:B收到FIN后,发送一个ACK(ack=x+1)包给A,并进入CLOSE_WAIT状态,同时通知应用程序,对方A要求关闭连接;

第三次挥手:这时B的应用程序通知TCP可以关闭连接,则会发送一个FIN(seq=y,ack=x+1)包,用来关闭B到A的数据传送,B进入LAST_ACK状态;

第四次挥手:A收到FIN后,A进入TIME_WAIN状态,接着返回一个ACK(ack=y+1包)给B,B进入CLOSED状态,完成四次挥手;

TIME_WAIT状态为什么需要等待2MSL时间?

1) 确保有足够的时间让对方收到ACK包;

        假若第四次挥手的ACK报文段丢失,因而使处在LAST-ACK状态的B收不到对方发送的最后一个ACK包。B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。但如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后就立即释放连接,就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常的步骤进入CLOSED状态。

2) 避免新旧连接混淆;             

        A在发送完ACK报文段后,再经过2MSL时间,就可以使本连接持续的时间所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求的报文段。

关于TCP报文头的说明

TCP报头结构

标识说明:

(1)源端口号(6位)和目的端口号(16位):通信双方的端口号,用来标识不同的应用进程。

(2)序号(32位)、确认序号(32位):使数据包按顺序处理,保证连接的可靠性;

(3)头部长度/数据偏移:最大值为1111。因为TCP报头最多60个字节,但[选项]长度不确定,如何定位到[数据]起始位置,可通过该标识定位。

(4)6位保留:为将来定义新的用途保留,现在一般置0。

(5)6位控制位:0或1:

        URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

        ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

        PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

        RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

        SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

        FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

(6)16位窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。

(7)16位校验和:奇偶校验函数,检验范围包括首部和数据两部分,用来检验传输过程中是否有误,由发送端计算和存储,并由接收端进行验证。

(8)选项/填充:常见的可选项是MSS表示本端所能接受的最大报文段的长度,在第一次握手中指明这个字段。为保证选项长度是32的整数倍,所以填充位会加额外的零。

  • 数据部分:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
发布了9 篇原创文章 · 获赞 2 · 访问量 4078

猜你喜欢

转载自blog.csdn.net/qq_27085429/article/details/104765440