计算机网络——TCP协议的三次握手和四次挥手

一、TCP简介

TCP:传输控制协议,属于传输层,为应用程序提供了完整的传输层服务。TCP是一个可靠的流传输协议,流这个词在这里表示面向连接的:在传输的两端可以传送数据以前必须先建立连接。

二、TCP报文格式

在这里插入图片描述
包括20 字节到60 字节的头部,接着是来自应用程序的数据。如果没有选项,那么头部是20 字节;如果有选项,最多是60 字节。

  1. 源端口地址:这是一个16位的字段,它定义了在主机中发送该段的应用程序的端口号。这与UDP头部的源端口地址的作用一样。
  2. 目的端口地址:这是一个16位的字段,它定义了在主机中接收该段的应用程序的端口号。这与UDP头部的目的端口地址的作用一样。
  3. 序列号(seq):这个4个字节的字段定义了一个数,它分配给段中数据的第一个字节,序列号seq就是这个报文段中的第一个字节的数据编号。如前所述,TCP是一种字节流传输协议。为了确保连通性,对要发送的每一个字节都进行编号。序列号告诉目的端,在这个序列中哪一个字节是该段的第一个字节。在连接建立时,每一方都使用随机数生成器产生一个初始序列号(ISN),通常每一个方向的ISN都不同。
  4. 确认号ack:这个4字节的字段定义了段的接收方期望从对方接收的字节号。如果段的接收方成功地接收了对方发来的字节号x,它就将确认号定义为x+1。确认和数据可稍带一起发送。
  5. 头部长度:这个4位的字段指明了TCP头部中共有多少个4字节长的字。头部的长度可以在20字节到60字节之间。因此,这个字段的值在5(5×4=20)到15(15×4=60)之间。
  6. 保留:这个6位的字段保留为将来使用。
  7. 控制:这个字段定义了6种不同的控制位或标记,在同一时间可设置一位或多位。
    1)确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
    2)同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
    3)终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

注意:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

三、三次握手

三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。

  1. 发送端首先发送一个带有SYN(同步序列编号)标志的数据包给接收方。

  2. 接收方接收后,回传一个带有SYN+ACK标志的数据包传递确认信息,表示我收到了。

  3. 最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。
    在这里插入图片描述
    问:为什么要三次握手?两次不行吗?
    答:三次握手可以保证双方做好发送数据的准备,同时允许双方就初始序列号进行协商。防止已经过期的连接请求突然又发送给对方而产生错误。
    如果是两次的话,假设接收方B成功收到发送方A的连接请求并发送了确认应答分组,如果这个确认应答分组在途中丢失了,发送方A就不知道接收方B是否收到了连接请求,而根据两次握手的协定,无论发送方A是否收到确认应答分组都不需要再发送确认信号给B(不然就变成三次握手了),所以B就认为A已经准备好了并开始发送分组。在这种情况下,A认为连接还未建立成功,将忽略B发来的任何数据分组,只等待连接确认应答分组。而B在发出的分组超时后,重复发送同样的分组,这样就形成了死锁。

四、四次挥手

四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。

  1. 发送方A进程发出连接释放报文并停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,发送方A进入FIN-WAIT-1(终止等待1)状态。

  2. 接收方B收到连接释放报文后,发出确认报文:ACK=1,ack=u+1,以及自己的序列号seq=v,此时,接收方B就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,发送方A向接收方B的方向就释放了,这时候处于半关闭状态,即A已经没有数据要发送了,但是B若发送数据,客户端依然要接受。这个状态持续的时间就是CLOSE-WAIT状态持续的时间。

  3. A收到B的确认请求后,A就进入FIN-WAIT-2(终止等待2)状态,等待B发送连接释放报文(在这之前还需要接受B发送的最后的数据)。B将最后的数据发送完毕后,就向A发送连接释放报文,此时B发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,B进入LAST-ACK(最后确认态),等待A的确认。

  4. 发送方A收到回复后,发送确认标志ACK=1,ack=w+1,自己的序号seq=u+1,发送方A进入TIME-WAIT(时间等待)。此时TCP连接还没有释放,A经过2个最长报文段寿命后,进入CLOSE状态;接收方B收到确认后,立刻进入CLOSE状态。接收方B结束TCP连接的时间要比发送方A早一些。

问:为什么要四次挥手?
答:确保数据能够完成传输,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,但未必你所有的数据都全部发送给对方了,所以你可以不会马上会关闭发送数据通道 ,就是说你可能还需要发送一些数据给对方,然后再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。

问:为什么客户端最后还要等待2MSL?
答:客户端需要保证最后一次发送的ACK报文到服务器,如果服务器未收到,可以请求客户端重发,这样客户端还有时间再发,重启2MSL计时。

五、通俗解释三次握手和四次挥手

三次握手:
A:“喂,你听得到吗?”
B:“我听得到呀,你听得到我吗?”
A:“我能听到你,今天balabala……”
四次挥手:
A:“喂,我不说了。”
B:“我知道了。等下,上一句还没说完。Balabala……”
B:”好了,说完了,我也不说了。”
A:”我知道了。”
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”

参考博客:https://blog.csdn.net/qq_38950316/article/details/81087809
https://www.cnblogs.com/jainszhang/p/10641728.html
参考书籍:《数据通信与计算机网络》——佛罗赞

blog:myblog

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值