tcp连接时三次握手与四次挥手 SYN+ACK FIN+ACK

三次握手

《tcp连接时三次握手与四次挥手 SYN+ACK FIN+ACK》

SYN-->				//请求同步信号 (server端收到后 确认client能发)
	<--ACK ,SYN		//确认接收信号,+ 请求同步信号 (client端收到后 确认自己能收能发,service能收能发)
ACK-->				//确认接收信号 (service端收到后 确认自己能收能发,client能收能发 )

seq=x -->			//seq自己发的序列号 
	<-- seq=y,ack=x+1	//ack应答号 ack=x+表示自己接到了对面seq=x的消息
seq,ack-->			//由上两步也可以推出 seq=x+1 ack=y+1

四次挥手

《tcp连接时三次握手与四次挥手 SYN+ACK FIN+ACK》

FIN-->			//请求结束
 	<--ACK		//确认应答
 	;;;;		//server 发还没有发完的消息(这就是为什么有四次握手的原因)
 	<--ACK,FIN	//server 请求结束
ACK-->			//确认应答

seq=x-->
	<--seq=y,ack=x+1
	<--seq=y+n,ack=x+1
seq,ack-->			// seq=x+1 ack=y+n+1;

问题总结:

为什么是3次握手,不是2次
2次握手可能出现的情况:
《tcp连接时三次握手与四次挥手 SYN+ACK FIN+ACK》
如上图:
第一个丢失的报文段延误后到达服务端,此时服务端误认为客户端又发出一次新的连接请求,同意建立连接。
只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据。

什么是半连接:
第一次握手后,服务端不确定客户端能不能接受,先把连接请求放入半连接队列中,进入SYN_RECV状态(连接请求已接收状态),
完成三次握手再把连接放到全连接队列中。
一直没收到第三次握手,service端发重传包,达到规定次数,从半连接队列里删除。(发重传包间隔时间一般指数增长)

为什么有四次挥手,
service端收到FIN请求后要先应答ACK,
等发完未发的数据,然后再发FIN;

什么是2MSL,为什么要等2MSL
MSL:maximum segment lifetime——最大报文生命周期
1:让client接受完service在第2-3次挥手期间发的内容
2:保证本次连接所有报文从网络中消失。(不影响下一次连接)

    原文作者:hhzxzy
    原文地址: https://blog.csdn.net/qq_42948022/article/details/102485614
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞