目的
保证双方互相建立了连接。
场景
发生在客户端连接服务器的时候,当调用connect();时,底层会通过TCP协议进行三次握手。
- 客户端发送 和 服务器接收
- 客户端确定服务器可以收发,自己可以发送
- 服务器确定客户端可以收发,自己可以收发
至少三次握手,四次握手也是可以的。四次握手可以将三次握手的第二次拆分。
第一次握手:
- 客户端将SYN标志位置1
- 生成一个随机32位的序号seq = j,这个序号后边是可以携带数据(数据的大小)
第二次握手:
- 服务器端接收客户端的连接:ACK = 1
- 服务器会回发一个确认序号:ack = 客户端的序号+数据长度+SYN/FIN(按一个字节算)
- 服务器端会向客户端发起连接请求:SYN = 1
- 服务器会生成一个随机序号:seq = k
第三次握手:
- 客户端应答服务器请求:ACK = 1
- 客户端回复收到了服务器端的数据:ack = 服务器序号+数据长度+SYN/FIN(按一个字节算)
SYN、ACK:标志位
seq:序号(生成规则查一下)
ack:确认号
seq = m(3)
ack = m+1(仅仅在SYN = 1\FIN = 1 的时候)
确保数据完整,并确保数据顺序
TCP头部结构
SYN:建立连接
ACK:确认