TCP 三握四挥

序列号、确认号及标志位含义
序列号 seq占 4 个字节,用来标记数据段的顺序,TCP 把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本机随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号
确认号ack占 4 个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号 +1 即是确认号
确认ACK占1个比特位,仅当 ACK=1,确认号字段才有效。ACK=0,确认号无效
同步SYN连接建立时用于同步序号。当 SYN=1,ACK=0 表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用 SYN=1,ACK=1。因此,SYN=1 表示这是一个连接请求,或连接接收报文,SYN 这个标志位只有在 TCP 建立连接才会被置为 1,握手完成后 SYN 标志位被置为 0
终止FIN用来释放一个连接

理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)
在这里插入图片描述

seq 是序列号,这是为了连接以后传送数据用的,ack 是对收到的数据包的确认,值是等待接收的数据包的序列号

在第一次消息发送中,A 随机选取一个序列号作为自己的初始序号发送给 B;第二次消息 B 使用 ack 对 A 的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为 x+1 的包,所以 ack=x+1,同时 B 告诉 A 自己的初始序列号,就是 seq=y;第三条消息 A 告诉 B 收到了B的确认消息并准备建立连接,A 自己此条消息的序列号是 x+1,所以 seq=x+1,而 ack=y+1 是表示 A 正准备接收 B 序列号为 y+1 的数据包。同理四次挥手也是通过 seq=x+1、ack=y+1 确认结束

seq 是数据包本身的序列号;ack 是期望对方继续发送的那个数据包的序列号

TCP 三次握手

在这里插入图片描述

  • 第一次握手:
    A 的 TCP 客户进程也是首先创建传输控制块 TCB,然后向 B 发出连接请求报文段,(首部的同步位 SYN=1,初始序列 seq=x),(SYN=1 的报文段不能携带数据)但是要消耗掉一个序号,此时 TCP 客户进程进入 SYN-SENT (同步已发送)状态
  • 第二次握手:
    B 接收到连接请求报文段后,如果同意连接,则向 A 发送确认,在确认报文段中(SYN=1,ACK=1,确认号 ack=x+1,初始序号 seq=y),测试 TCP 服务器进程进入 SYN-RCVD(同步收到)状态
  • 第三次握手:
    TCP 客户进程收到 B 的确认后,要向 B 给出确认报文(ACK=1,确认号 ack=y+1,序号 seq=x+1)(初始为 seq=x,第二个报文段所以要 +1),ACK 报文段可以携带数据,不携带数据则不消耗序号。TCP 连接已经建立,A 进入 ESTABLISHED (已建立连接)状态
TCP 四次挥手

在这里插入图片描述

  • A 的应用进程先向其 TCP 发出连接释放报文段(FIN=1,序号 seq=u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN-WAIT-1(终止等待1)状态,等待 B 的确定
  • B 收到连接释放报文段后即发出确认报文段,(ACK=1,确认号 ack=u+1,序号 seq=v),B 进入 CLOSE-WAIT (关闭等待)状态,此时的 TCP 处于半关闭状态,A 到 B 的连接释放
  • A 收到 B 的确认后,进入 FIN-WAIT-2 (终止等待2)状态,等待 B 发出的连接释放报文段
  • B 没有要向 A 发出的数据,B 发出连接释放报文段(FIN=1,ACK=1,序号 seq=w,确认号 ack=1),B 进入 LAST-ACK (最后确认)状态,等待 A 的确认
  • A 收到 B 的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A 进入 TIME-Wait (时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计时器设置的时间 2MSL 后,A 才进入 CLOSED 状态

FAQ

  • 为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
    这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方ACK和FIN一般都会分开发送。

  • 为什么有2MSL等待状态?
    每个具体的TCP实例必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。

  • 为什么等待?
    1、保证客户端发送的最后一个ACK报文段能够到达服务端。 这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
    2、防止“已失效的连接请求报文段”出现在本连接中。 客户端在发送完最后一个ACK报文段后,再经过2MSL,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用,下一个新的连接中不会出现旧的连接请求报文段。如果前一次连接的某些数据仍然滞留在网络中,而延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。

  • 为什么是2倍?
    假如ACK没有到达服务端,服务端会为FIN这个消息超时重传 timeout retransmit ,那如果客户端等待时间足够,又收到FIN消息,说明ACK没有到达服务端,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:服务端的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值