计算机网络——TCP连接的建立(三报文握手)

    TCP是面向连接的协议,它基于运输连接来传送TCP报文段。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP运输连接有以下三个阶段:

  • 建立TCP连接
  • 数据传送
  • 释放TCP连接

    下面介绍TCP的连接是如何建立的。TCP的连接建立需要解决以下3个问题:

  • 使TCP双方能够知道对方的存在。
  • 使TCP双方能够协商一些参数(如最大窗口值、服务质量等)。
  • 使TCP双方能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

    将主动提出TCP连接请求的主机应用进程成为TCP客户,将被动等待TCP连接建立的主机应用进程称之为TCP服务器,将TCP建立连接的过程比喻为握手,握手需要在TCP客户和服务器之间交换3个TCP报文段。
计算机网络——TCP连接的建立(三报文握手)_第1张图片
    刚开始TCP客户和服务器都处于关闭状态,TCP客户进程首先创建传输控制块,用来存储一些如TCP连接表、指向发送和接受缓存的指针、指向重传队列的指针、当前的发送和接受序号等重要信息。接着服务器就进入了监听状态,等待TCP客户发来请求报文。
    TCP客户也首先创建传输控制块,紧接着向TCP服务器进程发送TCP连接请求报文,进入同步已发送状态。其首部中的同步位SYN被设置为1(TCP规定SYN为1的报文段不能携带数据,但要消耗一个序号),序号字段seq被设置了一个初始值x,作为TCP客户进程所选择的初始序号。
    TCP服务器进程收到请求报文后,如果同意建立连接,就向TCP客户进程发送TCP连接请求确认报文段,该报文段首部的同步位SYN和确认位ACK都设置为1,表明这是一个TCP连接请求确认报文段。序号字段seq设置了一个初始值y,作为TCP服务器进程所选择的初始序号,确认号字段ack的值设置成了x+1,这是对TCP客户进程所选择的初始序号的确认。
    TCP客户进程收到TCP连接请求确认报文段后,还会向TCP服务器进程发送一个普通的TCP确认报文段,并进入有连接已建立状态。该报文段首部中的确认位ACK被置1,表明这是一个普通的TCP确认报文段,序号字段seq设置为x+1,这时因为TCP客户进程发送的第一个TCP报文段的序号为x,因此第2个报文段的序号为x+1。而TCP规定,普通的TCP确认报文段可以携带数据,但如果不携带数据,就不消耗序号,所以所发送的下一个数据报文段的序号仍然是x+1。确认号字段ack设置为y+1,这是对TCP服务器进程初始序号的确认。TCP服务器进程收到该报文段后,也进入连接已建立状态。
    现在双方可以进行可靠的数据传输了。
    这里存在一个问题,为什么TCP客户进程最后还要发送一条普通的TCP确认报文段了?是否多余?两报文握手建立连接如何?
计算机网络——TCP连接的建立(三报文握手)_第2张图片
    假设TCP客户进程发送的第一条TCP连接请求存在较大的网络延迟,引起了该报文的重传。新发送的连接请求被TCP服务器进程接收到后,发回一条TCP连接请求确认报文段,假设已经建立起了双方之间的可靠通信,能够进行数据传输了。
    而当双方释放连接后,第一条TCP连接请求到达服务器进程,服务器进程误以为客户进程有建立TCP连接的需求,于是发回请求确认报文。但客户进程并没有连接需求,所以并不理睬该报文,而此时服务器进程已经进入连接已建立状态,等待客户进程的数据传输,造成网络资源的浪费。
    所以,三报文握手是有必要的。

你可能感兴趣的