通过错误处理来理解三次握手和四次挥手

通过三次握手建立连接:

第一次握手:客户端向服务器发送连接请求

第二次握手:服务器接受连接后回复ACK报文,并为这次连接分配资源

第三次握手:客户端端接收到ACK报文后也向服务端发生ACK报文,并分配资源

为什么要进行三次握手才能确认连接建立了呢??

首先我们先了解三次握手是怎么处理异常的吧?

情景1:客户端向服务端发送请求,如果服务器没有接到接到请求怎么办呢?

那么客户端应该重发请求。

情景2:客户端向服务器发送请求,服务器接收到了客户端的请求,回复一个ACK报文。假设客户端没有接收到ACK报文,那怎么处理呢??

因为客户端一段时间后还没有接收到ACK回复,那么它就会重新发送连接请求。那么也就会导致服务器再次接收到客户端的连接请求,但是实质上服务器是之前已经接收到了,那么它也就知道自己发的ACK报文客户端并没有接收到(因为客户端如果接收到了就不会在发连接请求了,而是发送ACK报文了),那么它就会重新发送ACK报文给客户端。

情景3:经过一段时间后,客户端终于接收到服务端发过来的ACK报文,客户端回复服务端一个ACK报文,假设服务端没有接收到会怎样?

因为服务端没有接收到客户端的ACK报文,那么它就会重新发送ACK报文给客户端(这里有两种情况,第一种是接收到了请求,那么要判断是不是ACK报文,因为接收的可能是连接请求,如果不是ACK报文,说明还要重新发送。如果是ACK报文说明连接建立了。第二种是一段时间后还没有接收到请求,那么也要重新发送ACK报文),那么就会导致客户端再一次接收到ACK报文,因为又接收到了ACK报文说明服务端还没有接收到客户端发过去的ACK报文,那么客户端给服务端也要重新发送ACK报文了。直到一段时间后再也没有接到服务端的ACK报文为止。(如果没有接到就说明服务端已经接收到了ACK报文,也就是说服务端已经客户端资源已经准备好了,然后接下来就是要发送数据了)

之所以要三次握手是因为要三次握手才能处理建立连接中碰到的各种问题

 

发送数据 :

连接建立之后当然就是发送数据啦~注意除了客户端向服务器发送数据,服务器也要向客户端发送数据来保证客户端发送的数据服务器接收到的都是正确的。而且一般发送一部分数据后,服务端就返回一个数据,然后根据这个数据,判断之前发送的和服务器接收到的是不是一致的,如果是一致的,发送下一部分数据,如果不是一致的,重发本次数据。(之所以要发送一部分就要检验一次,是因为等发送完所有数据再检验,假设发送错了,那么代价太大了,而且数据越多,出错的几率越大~)

 

通过四次挥手断开连接:

四次挥手可以看成是两个二次挥手。

当客户端向服务器发送的数据已经发送完成了,那么客户端此时想服务端发送一个断开连接的请求。假设服务器接收到了断开请求,那么它立即回复一个ACK报文,如果客户端接收到了ACK,那么客户端就不在发送断开连接请求了,也就是开始等待(这里错误处理和三次握手差不多,也就不详细说明了)。

等到服务器把要想客户端发送的数据发送完成了,那么服务器会发送给客户端一个断开请求,假设客户端接收到了就服务端一个ACK报文,如果服务器接收到了ACK,那么连接就可以断开了。

那么为什么不用三次挥手而用四次挥手呢??

请注意在服务器接收到客户端的断开请求时,服务器向客户端发送的数据可能还没有发送完。如果是三次挥手的话,那么要等到服务器将数据发送完,再发送给客户端一个ACK,那么就麻烦了。因为客户端迟迟接收不到服务器的确认,那么就会不断地发送断开请求,这种情况使我们不希望出现的,因为对服务器和客户端都是一种不好的情况。但是如果是四次挥手的话,服务器一接收到断开请求,立即回复给客户端一个ACK,那么客户端接收到了ACK,就不会再发送断开请求了,只需等待到服务器发送完数据,然后通过一个服务器发送到客户端的断开请求来确认断开就ok了,那么上面出现的情况就完美解决了。

 

时间: 2024-11-07 19:59:27

通过错误处理来理解三次握手和四次挥手的相关文章

以后面试官再问你三次握手和四次挥手,直接把这一篇文章丢给他

三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题.很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了. 见过比较典型的面试场景是这样的: 面试官:请介绍下三次握手 求职者:第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了. 面试官:然后呢? 求职者:这就是三次握手的过程,很简单的. 面试官:...... (番外篇:

TCP的三次握手与四次挥手理解及面试题(很全面)

序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文段中的第一个字节的数据编号. 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号:序列号表示报文段携带数据的第一个字节的编号:而确认号指的是期望接收到下一个字节的编号:因此当前报文段最后一个字节的编号+1即为确认号. 确认ACK:占1位,仅当ACK=1时,确认号字段才有效.AC

理解TCP三次握手和四次挥手

TCP相关知识 TCP是面向连接的传输层协议,它提供可靠交付的.全双工的.面向字节流的点对点服务.HTTP协议便是基于TCP协议实现的.(虽然作为应用层协议,HTTP协议并没有明确要求必须使用TCP协议作为运输层协议,但是因为HTTP协议对可靠性的的要求,默认HTTP是基于TCP协议的.若是使用UDP这种不可靠的.尽最大努力交付的运传输层协议来实现HTTP的话,那么TCP协议的流量控制.可靠性保障机制等等功能就必须全部放到应用层来实现)而相比网络层更进一步,传输层着眼于应用进程间的通信,而不是网

TCP的三次握手与四次挥手理解及面试题

原文:https://blog.csdn.net/qq_38950316/article/details/81087809 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文段中的第一个字节的数据编号. 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号:序列号表示报文段携带数据的第一个字节的编号:而确认号指的是期望接收到下一

TCP的三次握手与四次挥手理解

本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文段中的第一个字节的数据编号. 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号:序列号表示报文段携带数据的第一个字节的编号:而确认号指的是期望接收到下一个字节的编号:因此当前报文段最后一个字节的编号+1即为确认号. 确认

TCP的三次握手与四次挥手的理解

本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问    序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后,就给每一个报文段指派一个序号:序列号seq就是这个报文段中的第一个字节的数据编号.    确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号:序列号表示报文段携带数据的第一个字节的编号:而确认号指的是期望接收到下一个字节的编号:因此当前报文段最后一个字节的编号+1即为确

理解TCP/IP三次握手与四次挥手的正确姿势

背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声音,过一会儿之后才会恢复. 中间双方可能就要不断的确认网络是否恢复,但是有时候会: 她:"你可以听到了吗?" 我:"可以了,你呢?". 她:"喂喂,你可以听到了吗?" 我:"可以了,我可以听到了,你呢?" 她:"你可以听

TCP三次握手和四次挥手通俗理解

一.TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内部包含了哪些东西. TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接.TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…) 报文主要段的意思 序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号 确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1.只有ACK=1时才有效. ACK:确认序号的标志,ACK=1表

TCP协议中的三次握手和四次挥手(图解)【转】

建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. [更新于2017.01.04 ]该部分内容配图有误,请大家见谅,正确的配图如下,错误配图也不删了,大家可以比较下,对比理解效果更好.这么久才来更新,抱歉!! 错误配图如下: 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了. 那如何断开连接呢?