TCP建立连接和断开连接流程

18 篇文章 1 订阅
6 篇文章 0 订阅
一、基本描述
  • TCP协议为提供面向连接的服务,需要先建立连接,然后才可以通信,通信结束时,需要断开连接。
二、建立连接流程
  • 建立连接的过程也叫做三次握手,流程如下:
    这里写图片描述

  • 首先,一定是由客户端发起连接请求,服务端来接收连接请求。客户端发起连接请求后,会先给服务端发送一个SYN包。SYN包可以有可选项,包含允许的MSS值。

  • 服务端收到SYN包,会回复SYN的ACK,同时再回复SYN,但SYN和ACK是一起发送的。

  • 客户端收到了SYN+ACK包,完成了客户端到服务端单向连接的建立,然后给服务端回复ACK包。SYN包可以有可选项,包含允许的MSS值

  • 服务端收到客户端发来的ACK包,完成了服务端到客户端单向连接的建立。

说明:
  • SYN包会报告TCP需要用到的一些参数。
  • 服务器在收到SYN后,会将连接放入SyncQueue里(Linux默认2048)。
  • 服务器在收到ACK后,会将连接放入AcceptQueue里(Linux最大128,应用层可以传入backlog,两者的较小值为AcceptQueue的最大长度)。
抓包如下图:

在这里插入图片描述

三、断开连接流程

  • 断开连接的过程也叫四次挥手,流程如下:
    这里写图片描述
  • 断开连接时,发起方可以是客户端也可以是服务端。发起方会先发送一个FIN包,就进入FIN_WAIT_1状态,此时就不能发送用户数据,等待响应方回复ACK。
  • 响应方收到FIN包后,就给发起方回复ACK。此时,响应方进入CLOSE_WAIT状态,因为响应方还有待发送的数据,需要等待发送完毕,才能关闭连接(发起方在发送FIN前,会保证已经发送完数据)。
  • 发起方收到ACK后,就进入FIN_WAIT_2。此时还能继续接收数据,直到收到响应方的FIN。
  • 响应方等数据发送完毕后,就给发起方发送FIN包。
  • 发起方收到响应方的FIN包后,就进入TIME_WAIT状态。
  • 响应方收到ACK后,就进入CLOSED状态,完成了断开流程。
  • 发起方的TIME_WAIT状态会持续2MSL(最大报文生存时间)。然后,进入到CLOSED。
四、为何建立连接是三次握手,而断开连接需要四次挥手?
  • 下图是TCP协议头的结构:
    这里写图片描述
    里面有专门的位来标记SYN包,FIN包,ACK序号是否有效。
  • 三次握手时的SYN和ACK,是可以通过一个TCP包来发送的。
  • 四次挥手时为何没有将SYN和ACK一起发送,是因为响应方还有待发送的数据,需要等数据发送完成才能发送SYN包。
五、为何需要TIME_WAIT状态?
  • 一个重要的原因是在发起方发送了ACK后,不能保证响应方一定能收到ACK。响应方在发送FIN后,就等待发起方的ACK,在等待一段时间后,如果没有收到ACK,就会重发FIN包。发起方在TIME_WAIT的时间内(等待ACK的时间+重发FIN最大需要2MSL),如果又收到了响应方的FIN包,就会再发ACK包。
六、Linux下TCP的状态类型
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING,	/* Now a valid state */
TCP_NEW_SYN_RECV,

TCP_MAX_STATES	/* Leave at the end! */
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值