3.TCP的三次握手和四次挥手

 一、前置知识

  TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在传输数据前通信双方必须建立连接(所谓连接,是指客户端和服务端各自保存一份关于对方的信息,比如ip地址,端口号等)。TCP通过三次握手建立一个连接,通过四次挥手释放一个连接。

  在了解TCP连接前,先了解TCP报文的头部结构:

  TCP报文段的头部结构主要包含以下几个部分:
1.源端口和目的端口(Source port,Destination port):这两个字段用来标识发送端和接收端的端口号,占16位。
2.序列号(Sequence number):占32位,用来标识从TCP源端向目的端发送的字节流。当发起方发送数据时,会对这些数据进行标记,确保数据的有序性和完整性。(seq)
3.确认序号(Acknowledgement number):占32位,只有在ACK标志位为1时,这个字段才有效。它表示接收方已经成功接收到的数据的序列号(ack=seq+1)
4.标志位:占6位,包含URG、ACK、PSH、RST、SYN、FIN等标志。其中ACK表示确认序号有效,FIN表示释放一个连接,SYN表示发起一个新连接。


二、TCP的三次握手

  三次握手就是通过三次数据包的交换,来确认通信双方收发数据的能力。

  1. 一开始,客户端和服务端都处于CLOSE状态,服务端监听客户端的请求,进入LISTEN状态。
  2. 第一次握手(客户端发送连接请求):客户端会向服务端发送一个SYN包,里面包含了客户端的初始序列号。然后客户端进入SYN_SENT状态。
  3. 第二次握手(服务端确认收到了客户端的连接请求):回复客户端一个SYN+ACK包,里面包含确认信息(表示收到了客户端的SYN包)和服务端的初始序列号。然后服务端进入SYN_RCVD(received的缩写)状态。
  4. 第三次握手(客户端收到服务端的确认后,再次向服务端确认):再回复一个ACK包给服务端。然后客户端进入ESTABLISHED状态,当服务端接收到这个ACK包后,也进入ESTABLISHED状态。
  5. 这样客户端和服务端之间就建立了一个可靠的连接,可以开始传输数据。

三、TCP的四次挥手

  1. 数据传输结束后,通信双方都可以主动发起释放连接请求,假设由客户端发起。
  2. 第一次挥手(客户端发送释放连接请求):客户端向服务端发送一个FIN包,并附带一个序列号。然后,客户端进入FIN_WAIT1状态。
  3. 第二次挥手(服务端确认收到了客户端释放连接的请求):回复一个ACK包,同时包含一个确认号。然后,服务端进入CLOSE_WAIT状态(此时服务端还没准备好释放连接,可能还有数据要处理),当客户端收到服务端的这个ACK包后,进入FIN_WAIT2状态。
  4. 第三次挥手(服务端也已经准备好释放连接):向客户端发送一个FIN包,并附带一个序列号。然后,服务端进入LAST_ACK状态,表示等待来自客户端的最后一个ACK包。
  5. 第四次挥手(客户端确认服务端也已经准备好释放连接):就回复一个ACK包,但是此时客户端不会马上关闭连接,而是进入TIME_WAIT状态,等待某个固定时间(2MSL,2 Maximum Segment LifeTime,两倍的最长报文段生命周期),目的是防止这个ACK包丢失,导致服务端没有收到客户端关闭连接的确认,没有关闭连接,就会超时重传FIN包。那么等待这个固定时间后(即是确保服务端已经正常关闭连接后),客户端才关闭连接,进入CLOSED状态。当服务端收到这个ACK包后,就关闭连接,进入CLOSED状态。
  6. 这样就成功释放连接了。

  • 44
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值