11、为什么不需要四次握手?有人可能会说 A 发出第三次握手的信息后在没有接收到 B 的请求就已经进入了连接状态,那如果 A 的这个确认包丢失或者滞留了怎么办?
我们需要明白一点,完全可靠的通信协议是不存在的 。在经过三次握手之后,客户端和服务端已经可以确认之前的通信状况,都收到了确认信息 。所以即便再增加握手次数也不能保证后面的通信完全可靠,所以是没有必要的 。
12、Server 端收到 Client 端的 SYN 后,为什么还要传回 SYN?接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了 。
SYN 是 TCP / IP 建立连接时使用的握手信号 。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement[汉译:确认字符,在数据通信传输中,接收站发给发送站的一种传输控制字符 。它表示确认发来的数据已经接受无误])消息响应 。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递 。
13、传了 SYN,为什么还要传 ACK?双方通信无误必须是两者互相发送信息都无误 。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证 。
14、详细说下 TCP 四次挥手的过程?据传输结束后,通信的双方都可以释放连接 。现在 A 和 B 都处于 ESTABLISHED 状态 。
文章插图
第一次挥手:A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接 。A 把连接释放报文段首部的终止控制位 FIN 置 1,其序号 seq = u(等于前面已传送过的数据的最后一个字节的序号加 1),这时 A 进入 FIN-WAIT-1(终止等待1)状态,等待 B 的确认 。请注意:TCP 规定,FIN 报文段即使不携带数据,也将消耗掉一个序号 。
第二次挥手:B 收到连接释放报文段后立即发出确认,确认号是 ack = u + 1,而这个报文段自己的序号是 v(等于 B 前面已经传送过的数据的最后一个字节的序号加1),然后 B 就进入 CLOSE-WAIT(关闭等待)状态 。TCP 服务端进程这时应通知高层应用进程,因而从 A 到 B 这个方向的连接就释放了,这时的 TCP 连接处于半关闭(half-close)状态,即 A 已经没有数据要发送了,但 B 若发送数据,A 仍要接收 。也就是说,从 B 到 A 这个方向的连接并未关闭,这个状态可能会持续一段时间 。A 收到来自 B 的确认后,就进入 FIN-WAIT-2(终止等待2)状态,等待 B 发出的连接释放报文段 。
第三次挥手:若 B 已经没有要向 A 发送的数据,其应用进程就通知 TCP 释放连接 。这时 B 发出的连接释放报文段必须使 FIN = 1 。假定 B 的序号为 w(在半关闭状态,B 可能又发送了一些数据) 。B 还必须重复上次已发送过的确认号 ack = u + 1 。这时 B 就进入 LAST-ACK(最后确认)状态,等待 A 的确认 。
第四次挥手:A 在收到 B 的连接释放报文后,必须对此发出确认 。在确认报文段中把 ACK 置 1,确认号 ack = w + 1,而自己的序号 seq = u + 1(前面发送的 FIN 报文段要消耗一个序号) 。然后进入 TIME-WAIT(时间等待) 状态 。请注意,现在 TCP 连接还没有释放掉 。必须经过时间等待计时器设置的时间 2MSL(MSL:最长报文段寿命)后,A 才能进入到 CLOSED 状态,然后撤销传输控制块,结束这次 TCP 连接 。当然如果 B 一收到 A 的确认就进入 CLOSED 状态,然后撤销传输控制块 。所以在释放连接时,B 结束 TCP 连接的时间要早于 A 。
15、为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?1. 为了保证 A 发送的最后一个 ACK 报文段能够到达 B 。这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的 B 收不到对已发送的 FIN + ACK 报文段的确认 。B 会超时重传这个 FIN+ACK 报文段,而 A 就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段 。接着 A 重传一次确认,重新启动 2MSL 计时器 。最后,A 和 B 都正常进入到 CLOSED 状态 。如果 A 在 TIME-WAIT 状态不等待一段时间,而是在发送完 ACK 报文段后立即释放连接,那么就无法收到 B 重传的 FIN + ACK 报文段,因而也不会再发送一次确认报文段,这样,B 就无法按照正常步骤进入 CLOSED 状态 。
2. 防止已失效的连接请求报文段出现在本连接中 。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失 。这样就可以使下一个连接中不会出现这种旧的连接请求报文段 。
推荐阅读
- 鹿晗|鹿晗说减肥太难了不想减!赴港递表,收入下降,失踪人口鹿晗近况
- 计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别
- 电脑的几个基本常识
- 鹿晗|鹿晗晒金发直拍发文:“减肥太难了,不想减了”
- 二进制世界的秘密
- 计算机体系基础
- MySQL数据库锁理论
- 计算机基础必考知识 计算机基础试卷
- 眼睛干涩、视力模糊太难受?缓解视疲劳妙方请收好
- 浅谈计算机中的hosts文件