计算机网络-TCP运输连接管理
1 运输连接概述
- TCP 是面向连接的协议
- TCP 连接有三个阶段:连接建立,数据传送,连接释放
- TCP 连接的管理就是使 TCP 连接的建立和释放都能正常地进行
TCP 连接建立过程中要解决的三个问题:
- 要使每一方能够确知对方的存在,确认双方接收和发送的功能是能够正常工作的
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
- 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
TCP连接的建立采用的是客户—服务器方式:
- 主动发起连接建立的应用进程叫做客户 (client)
- 被动等待连接建立的应用进程叫做服务器 (server)
2 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并没有数据要发送,双方就进入了一个误会的状态,所以第三次的握手对确认的再确认时非常必要的
3 TCP的连接释放
- TCP 连接释放过程比较复杂,数据传输结束后,通信的双方都可释放连接
- TCP 连接释放过程是四报文握手
四次报文握手的过程:
注意:上述操作实际上是A告诉B,A的数据已经发送完了,现在需要把发送方向这个连接释放掉
注意: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
- 第二,防止 “已失效的连接请求报文段”出现在本连接中,简单来说就是设一个长一点的等待时间,在这段时间内所有请求都消失在网络里,这样让新的请求来的时候不会产生误会