Java后台开发面试实战——TCP三次握手四次挥手

本文来自转载:
地址: https://blog.csdn.net/weixin_43518038/article/details/105208042?utm_source=app

1. 解释一下TCP三次握手四次挥手

图片来源于微信公众号:码农求职小助手
在这里插入图片描述
答: 嗯(稍作思考)…

  • 三次握手详细来说,在数据传输开始前:
    第一次握手:客户端向服务端发送一段用来连接请求的报文,其中SYN=1,ACK=0
    第二次握手:服务器端接收之后,如果同意连接。则返回一段确认的报文,SYN=1,ACK=1
    第三次握手: 客户端收到服务端的确认后,还要再次向服务段给出确认,ACK=1
    三次握手完毕后,客户端与服务器才正式开始传送数据。

第一次握手:SYN=1(seq=x)SYN=1表示请求连接,seq=x为随机选取序号
第二次握手:ACK=1(ack=x+1),ACK=1表示确认连接,返回序列号加1是为了让客户端确认我接受到的信息是你发送的。SYN=1(seq=y),代表服务端也请求连接,并返回一个自己指定的序列号。
第三次握手:ACK=1(seq=x+1,ack=y+1)ACK=1表示确认连接;ack=y+1是为了验证传输的准确性;seq=x+1,?

在这里插入图片描述

  • 四次握手详细来说,在数据传输结束后:
    第一次挥手:客户端发送一个用来关闭客户端到服务端的数据传送的报文。FIN=1
    第二次挥手:服务端收到FIN包后,发送一个确认包给对方,ACK=1
    第三次挥手:服务端发送一个用来关闭服务端到客户端的数据传送的报文,FIN=1,ACK=1
    第四次挥手:客户端收到FIN后,发送一个确认包,ACK=1。之后等待2MSL(MSL最长报文段寿命)后,保证报文段能够达到B,再进入关闭状态。
    至此,完成四次挥手,客户端与服务器才正式结束数据传输。

第一次挥手:FIN=1(seq=u)FIN=1表示要求释放连接;seq=u,u等于前面已经传送过的数据的最后一个字节的序号加1。
第二次挥手:ACK=1(ack=u+1,seq=v)ACK=1表明确认字段才有效;确认号为ack=u+1,seq=v,等于服务端前面已经传送过的数据的最后一个字节的序号加1。
第三次挥手:ACK=1,FIN=1(ack=u+1,seq=w)seq=w(半关闭状态下可能又有数据传入)
第四次挥手:ACK=1(ack=w+1,seq=u+1)seq=w+1(确认序号),seq=u+1(前面发送的FIN报文段需要消耗一个序号)

二. 解释一下SYN、ACK 、FIN 、seq和ack

在这里插入图片描述

  • 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

  • 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。

  • 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

  • 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

  • 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

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

原文链接:https://blog.csdn.net/qq_38950316/article/details/81087809

三. 为什么是三次握手,可以是两次吗?

不可以(非常坚定的语气)。假如以两次握手建立连接,服务端在某一时刻突然收到了一个来自被客户端卡了很久已经丢弃的SYN包,服务端的操作是返回SYN+ACK并且进入工作状态。客户端收到反馈后,无法告诉服务端这是错误的SYN的包,会造成资源的浪费

四. 为什么断开连接需要四次挥手?

答:因为在客户端发送给服务端FIN包后,服务端返回的FIN和ACK包是分开发送的。为什么要分开呢?因为客户端发送给服务端FIN包后,只表示客户端已经没有数据要发送了,但是另一个方向上可能还会有数据传输进来。所以第二次和第三次挥手分开发送,服务端先给出ACK确认信号,表示已经收到FIN请求,然后当自己也可以结束的时候,再次发送FIN信号。是为了为未传输完毕的数据预留时间,所以需要挥手交互需要四次。

五. TCP协议是如何保证可靠传输的?

答: 数据包校验(检测数据在传输过程中的任何变化),对失序数据包重排序丢弃重复数据应答机制(收到另一端的数据后。会发一个确认);超时重发(启动定时器,若不能及时收到确认会重发);流量控制(滑动窗口)。

六. 滑动窗口?

滑动窗口是一种流量控制技术。TCP连接每一方都有固定大小的缓冲空间,滑动窗口的大小意味这接收方有多大的缓存区接受数据。当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知,利用滑动窗口机制有效提高通信效率。

发布了150 篇原创文章 · 获赞 87 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/yyp0304Devin/article/details/105394615