TCP 三次握手与四次挥手
2022年8月1日大约 3 分钟
TCP(Transmission Control Protocol,传输控制协议 )是一种基于连接的、可靠的传输层协议。TCP 协议建立连接的本质是交换双方的状态(比如序号)
UDP(User Datagram Protocol,用户数据报协议)是一种基于非连接的、不可靠的传输层协议
TCP 与 UDP 的区别:
- TCP 基于连接(类比打电话),稳定。常用于文件传输、网页浏览等
- UDP 基于非连接(类比写信),速度快,但不稳定会丢包。常用于语音通话、视频直播。
提示
DDOS(distributed denial of service):分布式拒绝服务。比如 SYN 攻击:通过向服务端不停发送 SYN
请求,但不响应SYN+ACK
报文,从而消耗服务端的资源。
TCP 报文
TCP
被封装在IP
数据报中
序号(seq):在初次建立连接的时候,客户端和服务端都会为本次的连接随机初始化一个序号(解决网络包乱序的问题)
确认号(ack):表示「接收端」告诉「发送端」对上一个数据包已经成功接收(解决网络包丢失的问题)
标志位:SYN/FIN/ACK。SYN
用来同步建立连接,FIN
断开连接,ACK
应答
三次握手
握手过程:
- 客户端向服务端发送
SYN
,seq = x
(x 是客户端随机生成的初始序号ISN
) - 服务端接收到客户端的
SYN
后,向客户端发送SYN
、ACK
,seq = y
,ack = x + 1
。 (y
是服务端随机生成的初始序号ISN
,确认号ack
= 对方的序号 + 1) - 客户端接收到服务端的
SYN
、ACK
后,向服务端发送ACK
,ack = y + 1
。完成握手。
简单理解:
- A:我要跟你通信,你听得到吗?
- B:可以听到,你听得到吗?
- A:我可以听到
为什么需要至少三次握手
为了防止失效的连接请求报文段被服务端接收,从而产生错误。为了在不可靠的信道上建立起可靠连接,必须至少握手三次。
假设两次握手后,建立连接:
- 客户端发送的
SYN
可能在某个网络节点滞留,长时间未收到服务端的ACK
。 - 客户端会再次重发
SYN
,服务端成功接收到后,返回SYN + ACK
,此时成功建立连接,双方进入数据传输状态。 - 但是如果第一次发送的
SYN
因为网络恢复正常,又送达到服务端。服务端会误认为是客户端又发起了一个新的连接,返回SYN + ACK
,服务端进入等待数据状态。 - 最终导致双方状态不一致。
四次挥手
挥手过程:
- 客户端发送
FIN
,表示释放连接 - 服务端收到客户端的
FIN
后,回复ACK
- 服务端可能还有数据要发送给客户端,等服务端确认自己已经没有数据需要发送给客户端之后,就发送
FIN
给客户端 - 客户端收到服务端的
FIN
之后,回应ACK
简单理解:
- A:我要跟你断开通信
- B:知道了,等一下,我还有东西要发给你
- B:好了,我发完了
- A:好的,我知道了
为什么需要四次挥手
服务端接收到客户端的 FIN
,并回复 ACK
之后,可能还有数据要发送,确认没有数据要发送后再发送 FIN
。
为什么需要超时等待 2MSL
MSL:Maximum Segment Lifetime 最大报文寿命,超过这个时间报文将被丢弃。
原因:
- 保证服务端能够收到
ACK
(如果收不到,服务端会重发FIN
) - 确保在下次创建新连接时,不会出现先前连接的报文。