TCP协议三次握手、四次挥手详解

来源:互联网 发布:知美术馆 编辑:程序博客网 时间:2024/05/30 04:09

本文参考自文章http://blog.csdn.net/whuslei/article/details/6667471/,但文章只给了大致流程(某些部分太大略了)。这里将详细流程记录下来,并添加了自己的理解。同时也在vs2012上实现了TCP在客户端与服务器方面的链接代码。代码可通过该网址进行下载。

TCP建立连接需要三次握手才能完成,而断开连接则需要四次挥手。整个过程如下图所示:

看图之前需要了解一下最基本的TCP连接相关用词:

SYN:同步序列编号(Synchronize Sequence Numbers该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号

ACK:确认标志

FIN:结束标志带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。

一:这里先说一下TCP的三次握手过程:【如下图所示】

第一次握手:建立连接时,客户端发送SYN包。设置SYN=1,同时发送一个校验序列号(这里用seq=client_isn表示)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers

第二次握手服务器收到syn包,必须确认客户的SYN(ack=client_isn+1),同时自己也发送一个SYN包(SYN=1,seq=server_isn表示),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=server_isn+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据

二:TCP四次挥手

【注意】中断连接端可以是Client端,也可以是Server端。

其过程就是客户端发送FIN(我们分手吧),服务器接到后就回复ACK(分吧),于此同时服务器还会再给客户端发送FIN(我们分手吧),客户端接收到信息后回复服务器ACK(分吧)

三:客户端TCP所经历的状态序列:【这里可以看本文第一幅图片,客户端和服务器两条主线上标志的状态,而下一幅图像只是衬托

假设Client端发起中断连接请求,也就是发送FIN报文,进入FIN_WAIT-1状态。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket(套接字,相当于程序的接口,与外界进行通信),可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT-2状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

四:客户端TCP所经历的状态序列


1 0
原创粉丝点击