(一)三次握手建立连接
(1)首先服务器端进行初始化,由最初的closed状态顺序调用socket、bind、listen后进入listen状态;
(2)客户端进行初始化,由最初的closed状态顺序调用socket、connect主动连接服务器套接字进入SYN_SENT状态(向服务器发送将SYN置为1的同步数据段);
(3)服务器接收到SYN后向客户端发送将SYN置为1的同步数据段和ACK置为1的确认数据段,此时服务器进入SYN_RECV状态;
(4)客户端收到服务器的SYN同步数据段和ACK确认数据段之后进入ESTABILSHED
三次握手图例如下:
注意点:
(1)在客户端第一次向服务器发送ACK时,序号为i,在服务器回复客户端时确认号为i+1,表示服务器向客户端说明下一次想收到的下一次数据段序号为i+1;
(2)同理,在客户端接收到服务器消息后向服务器返回时,确认号为j+1,表示客户端告诉服务器下一次想收到的数据段的序号为j+1;
(二)三次握手中两端同时发起连接的情况
正常情况下,都是由一方主动发起连接,但是我们也不能避免在某一时刻双方同时发起连接,此时就会发生连接碰撞,最终只有一个建立起连接。原因是所有连接都是由其端点标识的,如果第一个连接请求建立起一个由套接字(x,y)标识的连接,而第二个连接也建立起了这样一个连接,在TCP实体内部只有一个套接字表项,这种情况如下图图例:
上图解析如下:
(1)当出现同时发送连接请求时,则两端几乎在同时发送SYN字段置为1的数据段,并都进入SYN_SENT状态;
(2)当每一端收到SYN数据段时,状态都变为SYN_RECV状态,同时他们都分别发送SYN置为1的数据段和ACK置为1的确认数据段,对收到的SYN数据段进行确认;
(3)当两端都收到SYN+ACK的数据段后都进入了ESTABLISHED状态,但是最终建立的是一个TCP连接。
(4)一个双方同时打开的传输连接需要交换4数据段,比正常的传输连接建立所进行的三次握手多交换一个数据段
(三)四次挥手分析
四次挥手如图所示:
四次挥手解析如下:
(1)数据传输结束后,客户端的应用进程先向其TCP发出释放连接请求,不在发送数据。TCP通知对方要释放从客户端到服务器的连接,将发往主机服务器的TCP报文段首部的终止比特FIN置为1,序号u等于已传送数据的最后一个字节的序号加1
(2)服务器的TCP收到释放连接通知后发出确认,其序号为u+1,同时通知应用进程,这样客户端到服务器的连接就释放了,连接处于半关闭状态。服务器不在接受客户端发来的数据;但服务器还向客户端发送数据,客户端若正确接收数据仍需要发送确认;
(3)在服务器向客户端的数据发送结束后,其应用进程就通知TCP释放连接。服务器发出的连接释放报文段必须将终止比特置为1,并使其序号w等于前面已经传送过的数据的最后一个字节的序号加 1,还必须重复上次已发送过的ACK=u+1;
(4)客户端对服务器的连接释放报文段发出确认,将ACK置为1,ACK=w+1, seq=u+1。这样才把从服务器到客户端的反方向连接释放掉,客户端的TCP再向其应用进程报告,整个连接已经全部释放。