TCP数据报文结构:
三次握手主要用到了序列号(seq)&确认号(ack)及两个标志位(ACK&SYN):
- seq:序列号和确认号是tcp传输可靠性的关键部分,序列号的随机取值范围为0-2^32-1 关于为什么不使用固定序列号
- ack:下一个希望收到的序列号且代表之前序列号传输的数据已经被正确的收到,此字段只有ACK标志位为1的时候才有效
- ACK:确认标志位,确认序号标志,为1时表示确认号(ack)有效,建立链接后所有数据的ACK都应为1
- SYN:同步/链接标志位---->当SYN=1且ACK=0时,代表这是一个连接请求报文,TCP规定SYN=1时不能携带数据,但要消耗一个序号
三次握手流程:
第一次握手:
客户端向服务器发送一个请求连接报文
报文数据:
- SYN:我(client)想跟你进行连接
- seq:我(client)这条数据的序列号是100
当服务器解析该条报文为连接请求且可以建立连接时触发第二次握手
第二次握手:
服务器向客户端发送同意连接报文
报文数据:
- SYN:我(server)可以跟你(client)进行连接啦
- ACK:你(client)的确认号有效
- seq:我(server)这条数据的序列号是200
- ack:我(server)已经收到你(client)序列号为100的数据了,下次你(client)给我(server)发的数据序列号应该是101哦
此时client已经知道client发送的数据server可以正常收到,且server发送的数据client也可以正常收到,但是server 并不知道client能不能正常的收到server的数据,由此则衍生出第三次握手
第三次握手:
客户端向服务端发送自己收到服务端可以连接的数据了
报文数据:
- ACK:你(server)的确认号是有效的
- seq:我(client)这条数据序列号是你(server)希望我发的101
- ack:我(client)已经收到你(server)序列号为200的数据了,下次你给我发的数据序列号应该是201哦
至此双端已建立稳定的连接了,之后就可以互相发送数据啦~