什么是三次握手和四次握手

news/2024/11/7 6:45:53/

什么是三次握手和四次握手

  • 1. 三次握手
    • 1.1 什么是三次握手 (three-way handshake)?
    • 1.2 TCP建立连接可以两次握手吗?为什么?
    • 1.3 可以采用四次握手吗?为什么?
    • 1.4 第三次握手中,如果客户端的ACK未送达服务器,会怎样?
    • 1.5 如果已经建立了连接,但客户端出现了故障怎么办?
    • 1.6 初始序列号是什么?
  • 2. 四次挥手
    • 2.1 什么是四次挥手?
    • 2.2 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)?
    • 2.3 如果第二次挥手时服务器的ACK没有送达客户端,会怎样?
    • 2.4 客户端TIME_WAIT状态的意义是什么?

1. 三次握手

1.1 什么是三次握手 (three-way handshake)?

在这里插入图片描述

  • 第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态;
  • 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态;
  • 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。

1.2 TCP建立连接可以两次握手吗?为什么?

不可以。有两个原因:

  • 首先,可能会出现已失效的连接请求报文段又传到了服务器端。
    client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。
  • 其次,两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号。

1.3 可以采用四次握手吗?为什么?

可以。但是会降低传输的效率。

四次握手是指:第二次握手:Server只发送ACK和acknowledge number;而Server的SYN和初始序列号在第三次握手时发送;原来协议中的第三次握手变为第四次握手。出于优化目的,四次握手中的二、三可以合并。

1.4 第三次握手中,如果客户端的ACK未送达服务器,会怎样?

Server端:
由于Server没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),Client收到后会重新传ACK给Server。

Client端,两种情况:

  • 在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
  • 在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答。

1.5 如果已经建立了连接,但客户端出现了故障怎么办?

服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

1.6 初始序列号是什么?

TCP连接的一方A,随机选择一个32位的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002…三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时,B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。

2. 四次挥手

2.1 什么是四次挥手?

在这里插入图片描述

  • 第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
  • 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
  • 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;
  • 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。

2.2 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送。

2.3 如果第二次挥手时服务器的ACK没有送达客户端,会怎样?

客户端没有收到ACK确认,会重新发送FIN请求。

2.4 客户端TIME_WAIT状态的意义是什么?

第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。

MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。


http://www.ppmy.cn/news/180481.html

相关文章

手签

手签 <template><a-modalv-model"showModel":closable"false":maskClosable"false"title"在以下区域内签名"cancel"onClosePopup"ok"save"><div><div><canvas class"canvas&quo…

6种手势

1.手势UIGestureRecognizer UIGestureRecognizer是一个抽象类我们不能直接使用&#xff0c;他有6个子类&#xff08;tap,pan,swip,long,scale,raition)。他的父类NSObject。 2.常用属性和函数 //函数 创建-(instancetype)initWithTarget:target action(SEL)action单独添加ta…

什么是三次握手、什么是四次握手

在上一篇我们了解的TCP的报文格式和TCP连接管理机制&#xff1a;TCP初认识 今天来理解什么是三次握手&#xff0c;什么是四次挥手 图1 TCP连接管理 什么是三次握手 在网络数据传输中&#xff0c;传输层协议TCP(传输控制协议)是建立连接的可靠传输&#xff0c;TCP建立连接的过程…

什么是三次握手?

文章目录 三次握手三次握手的目的&#xff1a;名词解释&#xff1a;具体流程&#xff1a; 三次握手 三次握手的目的&#xff1a; 当两台主机要通信时&#xff0c;确认两台主机都具备发送和接收的能力。 名词解释&#xff1a; SYN 1 表示请求建立连接 SYN 0 …

孩子快抓住妈妈的手

孩子快抓住妈妈的手 说明&#xff1a;来自网络 孩子 快抓紧妈妈的手 去天堂的路 太黑了 妈妈怕你 碰了头 快 抓紧妈妈的手 让妈妈陪你走 妈妈 怕 天堂的路 太黑 我看不见你的手 自从 倒塌的墙 把阳光夺走 我再也看不见 你柔情的眸 孩子 你走吧 前面的路 …

都握手了,怎么能少得了挥手嘞

四次挥手只有一个目的&#xff1a;让双方都知道对方想要断开连接并且把该传输的数据都传输完 假设是由有客户端发起的断开请求&#xff1a; 第一次挥手&#xff1a;客户端给服务器端发送一个FIN标志位和seq&#xff0c;就像是在告诉服务器&#xff0c;"我想跟你断开连接&a…

练手~~~

文本操作 逆转字符串——输入一个字符串&#xff0c;将其逆转并输出。 拉丁猪文字游戏——这是一个英语语言游戏。基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay&#xff08;譬如“banana”会变成“anana-bay”&#xff09;。可以在维基百科上了解…

三次握手~

在TCB传输中为了保证文件传输的可靠性&#xff08;可靠性不等于安全性&#xff0c;可靠性是指A发送的信息&#xff0c;A知道B是否收到&#xff0c;安全性是指传输的数据会不会被发生截取和篡改&#xff09;做了一系列操作&#xff0c;其中包括了确认应答&#xff08;核心&#…