首先来看一个关于可靠通信的例子。
占据东边和西边两个山顶的蓝军与驻扎在这两个山之间的山谷的白军作战。其力量对比是:一个山顶上的蓝军打不过白军,但两个山顶的蓝军协同作战就能战胜白军。东边蓝军拟于次日正午向白军发起攻击,于是通过计算机电文通知西边的友军。由于通信线路不好,报文可能丢失或出错,因此要求友军在收到电文后必须给予回复。同样,回复的电文也可能丢失或出错。那么,是否能够设计出一种100%可靠的通信机制来保证蓝军协同作战呢?
如果东边的蓝军发送了攻击请求,并等待西边的蓝军确认;西边的蓝军收到电文后加以确认。
然而,现在两边的蓝军都不敢贸然决定进攻。因为,西边的蓝军不知道确认电文对方是否正确收到。于是需要东边的蓝军对友军的确认报文进行再确认。同样,东边的蓝军也不知道对确认报文的确认信息是否被西边的友军正确接收。因此,即使双方不断确认下去,最终也无法让双方确定友军会在次日正午发起进攻。
由此看出,不可能建立100%可靠的通信协议,只能在一定程度上通过确认机制来保证通信的可靠性。
类似的,TCP连接建立在不可靠的分组交付服务的基础上,报文可能出现丢失、延迟、重复或乱序等情况,于是,TCP协议采用三次握手的机制来建立连接。具体建立连接的过程如下图所示:
如果连接请求丢失,TCP协议利用超时机制来重传丢失的建立连接的请求。如果某个连接请求因为延迟而在新的连接建立以后到达,则该重复连接请求将被丢弃。
TCP是面向连接的协议,其建立和释放是每一次面向连接的通信中必不可少的过程。因此,连接过程有三个阶段,即连接建立,数据传送和连接释放。在连接建立过程中要解决以下三个问题:
1、要使每一方能够确知对方的存在。
2、要允许双方协商一些资源。(如最大报文段长度,最大窗口大小,服务质量等)。
3、能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。