计算机网络系列 — TCP的三次握手、四次挥手

我心飞翔 分类:javascript

TCP 头部标识符意义解读

  1. SYN:建立连接
SYN=1,ACK=0  表示一个连接请求  
SYN=1,ACK=1  表示同意建立一个连接
 
  1. FIN:关闭连接
FIN=1 表示发端完成发送任务
注意:表明发送方已经没有数据发送 但不代表之前的数据发送完毕
 
  1. ACK:置1时表示确认
  2. seq:发送序列号
  3. ack (number):确认码

更多关于TCP 和 UDP 的详细内容见 计算机网络系列 -- TCP和UDP

TCP 三次握手

过程通俗理解

A—>B
B收到,B—>A
A收到
 

image.png

过程的详细解读

(1) 第一次握手:客户端发送【SYN = 1,随机序列号seq = x】的数据包到服务器,服务器由【SYN = 1】知道客户端要建立连接;此时客户端进入已发送状态,等待服务器确认

(2) 第二次握手:服务器向客户端发送标【SYN = 1,ACK = 1】和【随机序列号seq = y, 确认码ack number = x+1】的数据包;此时服务器进入已收到状态

(3) 第三次握手:客户端收到后判断【ACK=1】和【收的ack number =发的seq+1】;
若正确,客户端发送标识位【ACK = 1、seq = x + 1】和【确认码ack number = y + 1】(服务器发送的seq+1)到服务器;

服务器收到后判断【ACK=1】和【收的ack number =发的seq+1】是否正确;
若正确则完成建立连接,此包发送完毕。此时客户端和服务器进入已连接状态,完成三次握手,客户端与服务器开始传送数据

TCP 三次握手的目的

  1. 建立客户端和服务器之间的连接,确认各自的收发能力是否正常
  2. 对准好 TCP 包的序号问题,为保证可靠传送
  3. 如果是 https 协议,还会进行解密加密

HTTPS解密解密过程见 计算机网络系列 -- HTTPS加密解密过程

为什么要三次握手而不是两次?

这句话可以转化为第三次握手的意义是什么?

第三次握手的意义在于:`让服务器知道客户端也收到了自己的同步信号`
 

通俗理解

两次握手只能保证`单向`:只知道A能向B发送数据
三次握手能保证`双向`:保证A也能收到B发送的数据
 

第三次握手失败了怎么办?

server端发送了SYN+ACK报文后就会启动一个定时器,等待client返回的ACK报文。如果第三次握手失败的话client给server返回了ACK报文,server并不能收到这个ACK报文。那么server端就会启动超时重传机制,超过规定时间后重新发送SYN+ACK,重传次数默认是5次。如果重传指定次数到了后,仍然未收到ACK应答,那么一段时间后,server自动关闭这个连接。但是client认为这个连接已经建立,如果client端向server写数据,server端将发送RTS报文段,以防止syn洪泛攻击。

syn洪泛攻击

通俗的理解是:当第三次握手没有发送确认信息时,等待一段时间后,主机就会断开之前的半开连接并回收资源,这为dos(deny of service)攻击埋下隐患,当主动方主动发送大量的syn数据包,但并不做出第三次握手响应,server就会为这些syn包分配资源(但并未使用),就会使server占用大量内存,使server连接环境耗尽,这就是syn洪泛攻击
 

为什么要三次握手而不是四次?

四次握手的过程:

  1. 第一次:客户端发送【SYN = 1,随机序列号seq = u】到服务器,用来请求开启客户A到服务器B的数据传送;
  2. 第二次:服务器B收到这个SYN,它发回【ACK = 1、确认序号ack=u+1】表示同意;
  3. 第三次:服务器开启与客户端的连接,发回标识位【SYN = 1,ACK = 1,,确认码ack =u+1】给客户端;
  4. 第四次:客户端发送【ACK = 1,确认码ack number=w+1】到服务器。

很明显,第二次和第三次没有分开的必要,可以合并,而且还能提高建立连接时的效率

TCP 四次挥手

过程通俗理解

A:B 啊,我不想玩了
B:好,知道了,等一下哈,我这边还没好
【注意】这时,只是A不想玩了,即不再发送数据。但是B可能还有未发送完的数据,所以需要等待B也主动关闭
B:好的,我弄完了,我也不玩了,拜拜
A:好的,拜拜
 

image.png

过程的详细解读

(1)第一次挥手:客户端发送【FIN = 1,随机序列号seq = u】到服务器,用来主动关闭客户A到服务器B的数据传送;客户机A进入FIN-WAIT-1状态,等待服务器B发送FIN

(2)第二次挥手:服务器B收到这个FIN,它发回【ACK = 1、确认序号ack number=u+1】表示同意;客户端进入FIN-WAIT-2状态,稍后关闭连接,服务器B进入CLOSE_WAIT,等待关闭连接;

(3)第三次挥手:服务器关闭与客户端的连接,发回标识位【FIN = 1,ACK = 1,,确认码ack number=u+1】给客户端;服务器进入LAST_ACK,等待最后一次ACK确认

(4)第四次挥手:客户端发送【ACK = 1,确认码ack number=w+1】到服务器。客户端进入TIME-WAIT等待2MAL后进入CLOSE可用状态,服务器B进入CLOSE可用状态

TCP 四次挥手的目的

保证客户端、服务器真正断开连接

为什么挥手要四次?而握手只要三次?

B表示收到A的报文之后,可能有未发送完的数据,所以需要把数据全部发送完毕后再来告诉A说可以断开了,所以多了一次

2MSL是什么?目的是什么?

MSL是时间单位 —— 任何报文在网络上存在的最长时间

2MSL目的:保证第四次挥手正常进行

  1. 若第4次挥手的报文段丢失了
  2. 服务器就会超时重传第3次挥手的报文段
  3. 客户端就会重新给服务器发送第4次挥手的报文
  4. 最后,客户端、服务器才真正断开连接

为什么客户端关闭后不能再发一下就行?

不能保证新、老连接端口号一致

回复

我来回复
  • 暂无回复内容