您的位置:首页 > 理论基础 > 计算机网络

TCP协议三次握手与四次挥手

2016-05-23 18:44 281 查看
TCP协议是应用在传输层的协议。是一种面向连接的、可靠的协议。
TCP协议的特点:
1)面向字节流。
2)TCP是面向连接的运输层协议
3) 每一条TCP链接只能有两个端点
4)TCP提供可靠交付的服务
5)TCP提供全双工通信
下面来谈一下TCP运输连接的建立和释放
TCP连接的建立采用客户服务器模式(CS模式)主动发起连接建立的应用进程叫做客户(client),而被动等待连接建立的应用进程叫做服务器(server)。
TCP连接建立过程(三次握手)


第一次握手:客户端主动发起连接请求,在此期间服务器一直处于监听状态,等待客户端的连接请求。客户端进程向服务器发出连接请求报文段,此时首部中的同步位SYN=1,同时选择一个初始序号x.(TCP规定,SYN报文段不能携带数据,但要消耗一个序号)。这是,TCP客户进程进入SYN-SENT(同步已发送)状态。

第二次握手:服务器收到客户端发送的连接请求后,如同意建立连接,则想客户端发送确认。在确认报文段(此报文段也不能携带数据,但同样要消耗一个序号)应将SYN位和ACK都置为1,确认号是ack=x+1,同时也为自已选择一个初始序号seq=y.这时TCP服务器进程进入SYN-RECV状态。
第三次握手:TCP客户端收到服务器的确认后,还要向服务器发送确认报文。确认报文段的ACK置1,确认号ack=y+1,自己的序号seq=x+1.此时ACK报文段可以携带数据,但如果不携带数据则不消耗序号。这时TCP连接已经建立,客户端进入ESTABLISHE(已建立连接)状态。当服务器收到客户端的确认后,也进入ESTABLISHE(已建立连接)状态。
为什么是三次?最后一次握手是为了防止已失效的连接请求报文段突然又传到了服务器,因而产生错误。所以不能是两次,而多于三次是没有必要的。

TCP连接释放过程(四次挥手)




第一次:客户端应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。客户端把FIN置为1,序号seq=u(等于前面已传送过的数据的最后一个字节的序号加1)。这时客户端进入FIN-WAIT-1(终止等待1)状态,等待服务器的确认。(FIN报文段即使不携带数据,也消耗掉一个序号)
第二次:服务器收到连接释放报文后发出确认,确认号是ack=u+1,seq=v(等于前面已传送过的数据的最后一个字节的序号加1)。然后服务器进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从客户端到服务器的这个方向的连接就释放了,此时TCP连接处于半关闭状态,即客户端已没有数据要发送,但服务器若要发送数据,客户端仍然要接收,即从服务器到客户端这方的连接并未关闭。客户端收到来自服务器的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待服务器发出的连接释放报文段。
第三次:若服务器已没有要向客户端发送的数据,其应用进程应通知TCP释放连接。此时FIN=1。seq=w(假设在半关闭状态下服务器又向客户端发送了一些数据),ack=u+1.这时服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次:客户端在收到服务器的的连接释放报文段后,必须对此发出确认,在确认报文段中把ACK置为1,ack=w+1,seq=u+1(前面发送的FIN报文段要消耗一个序号)然后进入TIME-WAIT状态。现在TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL(MSL:最长报文段寿命)后,客户端才进入CLOSED状态。服务器在收到确认后,就进入CLOSED状态。

为什么客户端在TIME-WAIT状态必须等待2MSL时间??
第一:为了保证客户端发送的最后一个ACK报文段能够到达服务器。
第二:防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK报文段后,再经过2MSL时间就可以使本连接内所产生的所有报文段都从网络中消失。可以使下一个新的连接中不会出现这种旧的连接请求报文段。
为什么是四次??
为了确保数据能够完成传输。关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP连接