-----------------白话理解---------------------------------
1. 第一次握手,客户端问服务器:喂,你听得到吗?
2 第二次握手,服务器向客户端回复:听得到,你听得到我的嘛?
3 第三次握手,客户端回应服务端,听到了,咱们可以说话啦~
---------------------分割线--------------以下是正经程序员叙述:-------------------------------------------------------
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接
PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
第一次握手:最初客户端 TCP进程是CLOSE状态,建立连接时,客户端发送SYN包(连接建立请求报文),随机生成序号seq=x(x不能等于0) 到服务器,此时客户端进入SYN-SEND(准备发送)状态。
第二次握手:服务器收到SYN包,若同意建立连接,确认客户的SYN(确认号 ack=x+1),同时自己发送一个SYN(随机生成序号seq=y),即SYN+ACK包,此时服务器进入SYN_RECV(准备接受)状态。
第三次握手:客户端收到服务器端的ACK+SYN包,向服务器发送确认包ACK(ack=y+1),包的序号仍为seq=x+1,此包发送完毕,客户端和服务器进入ESTABLISHED(已建立连接)状态,完成三次握手。
为什么需要三次握手才能建立连接?
为了初始化Sequence Number的初始值