假设有主机A和主机B,主机A运行的是客户端程序,B运行的是服务端程序.
最初两端都处于CLOSED状态,而一开始,B的TCP服务器先创建传输控制块TCP(存储了每一个连接中的一些重要信息,如下文的发送接收序号),之后服务器进程就处于Listen状态,等待客户端的连接请求,
而A也是通过创建传输控制块TCP,然后向主机B发送连接请求报文段(这时首部中的同步位SYN=1,同时选择一个初始序号seq=x),这时TCP客户端进入同步已发送状态;
而B收到A的请求报文后,同意建立连接则向A发送确认报文段(把SYN位和ACK位都置为1,确认号是ack=x+1,同时也给自己加一个初始序号seq=y)这时服务器端进入同步收到状态
而客户端A收到B的确认后,还要向主机B给出确认报文(ACK置为1,确认号ack=y+1)则A进入已建立连接状态.
三次握手图解
为什么要三次握手呢?
答:主要是为了防止已失效的连接请求报文段突然又传送到B,因而产生错误
为什么是三次,不是四次?
答:如果要四次握手的话可以把B发送的确认报文分为确认报文段和请求报文段,但其效果和三次握手效果一样,所以只使用三次