TCP连接的开启和终止

来源:互联网 发布:简单编程教程 编辑:程序博客网 时间:2024/05/21 03:24

引言:

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP位于网络层之上,应用层之下的传输层。开启TCP的Socket只需要指定目的IP地址和本地端口号。

具体的TCP协议图如下所示:


TCP连接的开启:

TCP是可靠的传输层协议,所以TCP连接的开启和终止也是要保证可靠的。因此,TCP通过三次握手来保证连接开启的可靠性,通过四次握手来保证连接关闭的可靠性。

那么首先是三次握手。如图所示,用一种对话方式来表示三次握手,很有意思。


实际上,三次握手的数据包收发是下面这样的:


第一次,客户端发送syn(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

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

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

在上述过程中,还有一些重要的概念:

未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户端的确认包时,删除该条目,服务器进入ESTABLISHED状态。


SYN-ACK:重传次数。服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待时间不一定相同。


TCP连接的终止:

下面介绍四次挥手。首先上图:


客户端发起结束连接,服务器收到后马上确认,服务器准备好了之后再发送消息通知客户端,客户端发送确认然后连接终止。

实际的通信过程是下面这样的:


第一次挥手:主动方发送Fin+ACK报文,Fin=1,发送序号Seq=x。

第二次挥手:被动方发送ACK报文,确认序号Ack=x+1.

第三次挥手:应用进程关闭或,被动方发送Fin报文再挥手一次。Fin=1,顺序号Seq=y.

第四次挥手:主动放发送Ack报文。Ack=y+1;

如下图所示是完整的TCP传输


0 0
原创粉丝点击