运输连接概述
- TCP 是面向连接的协议
- TCP 连接有三个阶段:连接建立,数据传送,连接释放
- TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行
TCP 连接建立过程中要解决的三个问题:
- 要使每一方能够确知对方的存在,确认双方接收和发送的功能是能够正常工作的
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
- 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
TCP连接的建立采用的是客户—服务器方式:
- 主动发起连接建立的应用进程叫做客户 (client)
- 被动等待连接建立的应用进程叫做服务器 (server)
TCP的连接建立
- TCP 建立连接的过程叫做握手
- 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手
- 采用三报文握手主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误
三次报文握手的过程:
注意:大写的ACK和小写的ack代表的含义不同,大写ACK代表确认位,小写ack代表确认号,ack=x+1代表之前序号x报文已经正确收到了,并期待收到x+1报文,服务器B也选择了序号seq=y,这里的x和y代表双方各自发送的序号是独立的
注意:当A收到B的确认后还会发送一次确认报文给B,即确认的确认,主要是为了防止已失效的连接请求报文段突然又传送到了,因而产生错误,考虑这样一种情况,比如说A的第一个连接报文由于在某个站点滞留,B收到之后会认为A又重新发了一次连接,这个时候B会发送确认报文同意建立新的连接,当A收到确认连接的报文时由于这个确认是对一个并不存在的连接请求,A不去理睬B的确认,B如果没有收到对确认的再次确认,那么就会误以为连接已经建立好了而等待A去发送数据,但A并没有数据要发送,双方就进入了一个误会的状态,所以第三次的握手对确认的再确认时非常必要的。
TCP的连接释放
- TCP 连接释放过程比较复杂,数据传输结束后,通信的双方都可释放连接
- TCP 连接释放过程是四报文握手
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
四次报文握手的过程:
注意:B接收到了A的释放连接报文,会发出确认报文,ack=u+1表示已经收到了A发出的释放连接报文,而自己的序号seq=v,这里u和v仍然是独立的,意味着B这个时刻不一定需要释放连接,因为B可能还有数据要发送,所以说TCP连接处于半关闭状态
注意:seq=v和seq=w中的v和w是相互独立的,实际上是B在发送数据时,又消耗了一部分字节。在最后一次A到B的确认报文中,seq=u+1这里的u和第一轮B向A发送的确认报文中的ack=u+1的u是一样的
注意:A 必须等待 2MSL 的时间(MSL即报文最长寿命时间)
- 为了保证 A 发送的最后一个 ACK 报文段能够到达 B
- 防止"已失效的连接请求报文段"出现在本连接中,简单来说就是设一个长一点的等待时间,在这段时间内所有请求都消失在网络里,这样让新的请求来的时候不会产生误会