计算机网络-----TCP三次握手相关面试题扩展

1. TCP三次握手

直接上图 TCP三次握手

在这里插入图片描述

一些专业缩写单词

解释
TCP 传输控制协议(TCP,Transmission Control Protocol)
SYN 同步序列编号
SYN_SENT Client请求连接
ESTABLISHED 含义TCP:连接成功
ACK (Acknowledge character)即是确认字符,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
SYN_RCVD SYN_RCVD是TCP三次握手的中间状态,是服务端口(监听端口,如应用服务器的80端口)收到SYN包并发送[SYN,ACK]包后所处的状态
RST TCP首部中的6个标志比特之一,表示重置连接、复位连接。复位RST,当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接;
ISN 初始序列号(Initial Sequence Number)
FIN 来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放;
  • 最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

第一次握手

  • 客户端Client将SYN(同步序列编号)赋值为1,并随机产生一个初始序列号seq发送给服务端Server,进入到SYN_SENT状态。
  • SYN_SENT表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED

第二次握手

  • Server服务端收到客户端Client的SYN(同步序列号)之后,知道客户端Client请求建立连接,将自己的SYN赋值为1,ACK赋值为1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端,服务器端进入SYN_RCVD状态;客户端进入ESTABLISHED状态。

第三次握手

  • 客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。

2. TCP三次握手可以变为两次握手吗?

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

3. TCP可以采用四次握手吗?

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

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

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

  1. Server端:
	由于Server没有收到ACK确认,因此会重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),
	Client收到后会重新传ACK给Server。
  1. Client端,两种情况:
	1. 在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
	2. 在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答。

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

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

6. 初始序列号是什么?

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

猜你喜欢

转载自blog.csdn.net/weixin_45480785/article/details/114136987