您的位置:首页 > 职场人生

面试——三次握手四次挥手详解

2019-07-01 20:45 190 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_39979037/article/details/94405323

开始前的知识

TCP报文段的首部格式

这里仅仅解释几个在建立连接和释放连接中使用到的

  • 序号(seq):本报文段数据第一个字节的序号
  • 确认号(ack):期望收到对方下一个报文段的第一个数据字节序号,意味着此号之前都已收到
  • 确认ACK:为1时才有效,建立连接后所有传送的报文段都必须置为1
  • 同步SYN:在建立连接时用来同步序号,后面会详细描述应用场景
  • 终止FIN:用来释放一个连接,后面会详细描述应用场景

建立连接要解决什么问题

  1. 要使每一方能够确知对方存在;
  2. 要允许双方协调一些参数;
  3. 能够对运输实体资源进行分配。

其他

TCP中主动发起连接建立的叫客户,被动等待连接建立的叫服务器

三次握手

 

  • 首先,B创建传输控制模块处于LISTEN状态
  • A创建传输控制模块,向B发出连接请求报文段(SYN = 1,客户端初始序号seq = x),无数据但是消耗一个序号。进入SYN-SENT状态
  • B接收,如同意,向A发送确认(SYN = 1,ACK = 1,服务端初始序号seq = y,确认号ack = x + 1),无数据但是消耗一个序号。进入SYN-RCVD状态。
  • A收到B的确认,还要向B给出确认(ACK = 1, 自己的序号seq = x + 1,确认号ack = y + 1),可以有数据,无数据不消耗序号。进入ESTABLISHED状态。
  • B收到A的确认进入ESTABLISHED状态。

为什么

A最后一次确认是为了防止实效的连接请求突然又传到了B而产生错误。

第一次请求因为滞留未到达,A又发一次请求,建立连接并完成了数据传输。之后第一次请求到达,如果不需要A的确认,B就以为又一个连接建立了,开始等待数据。但是A并不理会B的确认,造成资源浪费。

四次挥手

  • 数据传输结束,双方都可以释放连接。都处于ESTABLISHED状态。
  • A先发送连接释放报文段(FIN = 1,A的序号seq = u(u是最后一个字节序号 + 1)),停止发送数据。A进入 FIN-WAIT-1 状态,等B确认。此报文不携带数据,消耗一个序号。
  • B收到就发出确认(ACK = 1,B的序号seq = v(最后一个字节序号 + 1),ack = u + 1)。B计入CLOSE-WAIT 状态。TCP处于半关闭状态,A不发数据,B如有要发的数据A要接收。可能会持续一段时间。
  • A收到B的确认,进入 FIN-WAIT-2 状态。等待B发出释放报文段。
  • B发完数据,发送连接释放报文段(FIN = 1,ACK = 1,B的序号seq = w(又传了一些数据,序号改变),ack = u + 1(重复上次))。B就进入了 LAST-ACK 状态。等A确认。
  • A在收到B的连接释放报文段后,发出确认(ACK = 1, A的序号seq = u + 1,ack = w + 1)。进入 TIME-WAIT 状态。
  • 这时,TCP连接还没有释放。必须经过 时间等待计时器 设置的时间 2MSL(可修改)后,A才进入CLOSED状态。A撤销相应的传送控制块TCB后,TCP连接结束。

四次挥手也可以视为两个两次握手。

为什么

A为什么要等 2MSL?

  1. 为了保证A发送的最后一个ACK报文段能到达B。A最后的ACK有可能丢失,留两分钟以防B重新发送连接释放报文段得不到相应,每次都会重置等待。
  2. 防止新的TCP连接中会收到上一个连接中已经失效的连接请求报文段。

除此之外

TCP还有一个 保活计时器。当已经建立连接,客户端除出了故障,保活计时器会设置两小时间隔,两小时后向客户端发送探测报文段,后没间隔75min发一次,共10次。都没有响应,服务器确认客户端故障,关闭连接。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: