TCP三次握手
TCP是面向连接的传输层协议,发送数据前必须建立连接。
- 客户端发送:SYN=1,序列号=x
- 服务端发送:SYN=1,ACK=1,序列号=y,确认应答号=x+1
- 客户端发送:ACK=1,确认应答号=y+1
- TCP要求连接每一方随机选择一个初始序号,防止黑客猜测出初始序号进行攻击。
- 第三次握手可以携带数据,前两次不能
⭐ 为什么是三次握手,不是两次、四次?
- 三次握手可以防止重复历史连接的初始化
- 两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端建立一个无用的历史连接,导致资源浪费
- 三次握手的情况下,如果网络延迟,第一次握手发生网络阻塞,客户端会重新发送一个新的握手,如果此时旧的握手先到达服务端,服务端不会建立连接,而是发送第二次握手用于确认,客户端收到后发现不是自己期望的ACK,会发送RST报文中止历史连接
- 三次握手可以同步双方的初始序列号
- 两次握手只保证一方的初始序列号能被对方成功接收,没法保证双方的初始序列号都能被确认接收
- 三次握手可以避免资源浪费
- 两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端建立一个无用的历史连接,导致资源浪费(同原因1)
不需要四次握手是因为三次握手是理论上最少的可靠连接建立次数。
为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?
- 防止历史报文被下一个相同四元组的连接接收,造成数据错乱
- 为了安全性,防止黑客伪造相同序列号的报文被对方接收
第一次握手丢失,会发生什么?