TCP建立连接和断开连接

 建立TCP连接需要三次握手才可以建立,断开连接则需要四次握手。
 图1:

 

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,进入SYN_SENT状态,等待服务器确认,
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态,
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
注:

SYN_RECV:一个连接请求已经到达,等待确认
 

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态    

首先Client端发送连接请求报文,Server段接收连接后回复ACK报文(Acknowledgement,确认发来的数据已经接收完毕),为此次连接分配资源。Client端在收到ACK报文后也向Server端发送ACK报文,并分配资源,如此TCP连接就建立了。

补充知识

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。  

断开连接详解图如下(关闭连接可以是 Client 也可以是 Server
图2:
 
我们假设 Client 发送中断请求( Fin ), Server 接到请求后表示关闭连接,但可以不必着急关闭通信(Socket),可以继续发送数据,所以 Server 先发送 ACK ,表明关闭请求已收到,但为了保证数据接收完成,请等待,稍后会给 client 消息,此时 Client 进入 FIN_WAIT1 状态,等待 server FIN

 
(这里讲一下 FIN_WAIT 状态, Client 发出 FIN ,同时进入 FIN_WAIT1 状态, Server 响应 ACK ,从而使 Client 变成 FIN_WAIT2 状态,接着 Server 会发出 FIN Client 响应 ACK ,同时变成 TIME_WAIT 状态,这就是关闭连接时 FIN_WAIT 状态的变化)

Server 端确定数据已经发送完成,则会向 Clinet 发送 FIN 报文,意思是告诉 Client ,我这边已经准备完毕,可以关闭连接, Client 接收到 FIN 报文以后就明白可以关闭连接了,但为了防止网络问题,所以发送 ACK 后进入 FIN_WAIT 状态, Server 如果没有收到 ACK 也可以重传,当 Server 收到 ACK 后就可以断开连接了, Client 等待 2MSL 后没有收到重传则证明 Server 已经正常关闭

(再讲一下
2MSL Maximum Segment Lifetime ,译为报文最大生存时间,是用来补救的,确认无误 ACK 没有丢失,如果 TCP client 端最后一次发送的 ACK 丢失了,它将在等待时间内重新发送。)

这样 Client 端也会关闭, OK ,  TCP 连接经过四次握手后也正常关闭。

转载于:https://www.cnblogs.com/GetAlert/p/4807042.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值