一文读懂三次握手与四次挥手(认真看包会)

一文读懂三次握手与四次挥手

三次握手四次挥手

序列号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:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

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

其他字段:

字段含义
URG紧急指针是否有效。为1,表示某一位需要被优先处理
PSH提示接收端应用程序立即从TCP缓冲区把数据读走
RST对方要求重新建立连接,复位

图片放大看,非常清晰

常见面试题(主机A在下面称为客户端,主机B称为服务端)

  1. 为什么连接的时候是三次握手,关闭的时候却是四次挥手?
    首先明白SYN、和FIN是同步报文,ACK是应答报文
    当客户端发送FIN报文(第一次挥手)后,服务器端需要接收还没收到的客户端发送的数据,暂时不能关闭连接,所以需要通知客户端我收到了(第二次挥手),让客户端等等,等待收到完所有数据后,发送FIN通知客户端可以关闭连接(第三次挥手),之后客户端主动中断,并告诉服务端关闭连接了(第四次挥手)。

  2. 为什么TIME_WAIT(超时等待)状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE(连接关闭)状态?
    首先明白2MSL是最大报文段生存时间,其直白理解就是发送一个报文和收到一个回复报文所需要的时间。
    如果在这2MSL内客户端没有再收到服务端发送的FIN和ACK,说明服务端已经收到了客户端主动关闭连接的报文,到了2MSL后客户端不再等待,会关闭连接。
    如果在这2MSL内客户端再次收到了服务端发送的FIN和ACK,说明服务端没有收到客户端主动关闭连接的报文,客户端在第收到服务端发送的FIN和ACK后会再次重发主动关闭连接报文

  3. 为什么不能用两次握手进行连接?
    3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
    这个是大多数的解答(如果没学过操作系统不太容易理解):现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

    【简洁版】:首先明白建立连接时客户端发送的seq=x(随机生成)是客户端要发送数据的初始序列号的协商(第一次握手),也就是建立连接后客户端正式发送的数据序列号从x+1开始,服务端在收到客户端的SYN和seq后,会告诉客户端我收到了会发送SYN和ack=x+1[ack是告知客户端下次正式发送数据时的seq],同时像客户端一样发送一个服务端要发送数据的初始序列号的协商,所以此次发送的还包括seq=y(第二次握手),同样客户端收到了服务端的报文后,知道服务端已经能接受自己的连接了,那么客户端也要以这种方式通知服务端(第三次握手)。如果变成两次握手,那么再第二次握手失败后,服务端会自以为已经成功建立连接,开始发送数据,但是客户端会决绝接收,服务端就会一直重发数据,一直重发! 就是死锁。
    file

  4. 如果已经建立了连接,但是客户端突然出现故障了怎么办?
    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

本文文档部分参考网络再总结,图自己画的,如有错误,还希望各位大佬指点迷津!
参考文档链接:
https://blog.csdn.net/qq_38950316/article/details/81087809
https://blog.csdn.net/lengxiao1993/article/details/82771768

版权声明:
作者:十下
链接:https://blog.edkso.cn/?p=785
来源:十下博客
文章版权归作者所有,未经允许请勿转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值