TCP 头部标识符意义解读
- SYN:建立连接
SYN=1,ACK=0 表示一个连接请求
SYN=1,ACK=1 表示同意建立一个连接
- FIN:关闭连接
FIN=1 表示发端完成发送任务
注意:表明发送方已经没有数据发送 但不代表之前的数据发送完毕
- ACK:置1时表示确认
- seq:发送序列号
- ack (number):确认码 更多关于TCP 和 UDP 的详细内容见 计算机网络系列 -- TCP和UDP
标识符的作用在于:1. 确认对方接收到我上一次发送的消息;2. 表达此次握(挥)手的目的
TCP 三次握手
过程通俗理解
A—>B:哈喽,你那边听得到吗
B->A:我这边听得到,你那边可以听到我吗
A->B:可以听到
过程图示
过程的详细解读
(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】是否正确;
若正确则完成建立连接,此包发送完毕。此时客户端和服务器进入已连接状态,完成三次握手,客户端与服务器开始传送数据
通过 SYN 来表达握手目的,通过 seq、ack 来确认对方是否接收到消息
TCP 三次握手的目的
- 建立客户端和服务器之间的连接,确认各自的收发能力是否正常
- 对准好 TCP 包的序号问题,为保证可靠传送
- 如果是 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洪泛攻击
为什么要三次握手而不是四次?
四次握手的过程:
- 第一次:客户端发送【SYN = 1,随机序列号seq = u】到服务器,用来请求开启客户A到服务器B的数据传送;
- 第二次:服务器B收到这个SYN,它发回【ACK = 1、确认序号ack=u+1】表示同意;
- 第三次:服务器开启与客户端的连接,发回标识位【SYN = 1,ACK = 1,,确认码ack =u+1】给客户端;
- 第四次:客户端发送【ACK = 1,确认码ack number=w+1】到服务器。
很明显,第二次和第三次没有分开的必要,可以合并,而且还能
提高建立连接时的效率
TCP 四次挥手
过程通俗理解
A->B,我要关电脑了
B->A:稍等一下,我这边还没传完
B->A:OK,我弄完了,我也关电脑了,拜拜
A->B:好的,拜拜
过程图示
过程的详细解读
(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目的:保证第四次挥手正常进行
- 若第4次挥手的报文段丢失了
- 服务器就会超时重传第3次挥手的报文段
- 客户端就会重新给服务器发送第4次挥手的报文
- 最后,客户端、服务器才真正断开连接 为什么客户端关闭后不能再发一下就行?
不能保证新、老连接端口号一致