一、运输连接三个阶段
-
TCP是面向连接的协议
-
运输连接有三个阶段:
- 连接建立
- 数据传送
- 连接释放
-
连接建立过程中要解决以下三个问题
- 要使每一方都能够确知对方的存在
- 要允许双方协商一些参数(如最大报文长度,最大窗口大小等)
- 能够对运输实体资源进行分配
-
客户服务器方式
- TCP的连接的建立采用客户服务器方式
- 主动发起连接建立的应用进程叫做
客户(client)
- 被动等待建立连接的应用进程叫做
服务器
二、TCP的连接建立
- TCP建立连接的过程叫做
握手
- 握手需要在客户和服务器之间交换三个TCP报文段。称之为
三报文握手
(发送–>确认–>再确认)
第一步
:图片已经给出,其中SYN字段请求建立连接的标志位,这段报文数据字节的序号是x(这个x是随便定的,在释放连接中这个seq序号是不能随便定的
),但实际上是没有数据字节存在的,只有一个首部,数据部分是空的。第二步
:B的TCP收到请求报文段后,如果同意,则发回确认,B在确认报文段中应使用SYN = 1 ,使ACK = 1(标志确认号有效
) , 其确认号ack = x+1(确认号是指期望收到的下一个字节序号,这里也说明了前面x个已经收到了
),自己这段报文的序号seq = y。数据部分仍然是空。第三步:
A收到此段报文后向B发送报文,其ACK = 1, 确认号ack=y+1(同样,也可以表明B发的y个字节收到了)。连接建立成功:
A的TCP通知上层应用进程,连接已经建立。
TCP连接的释放
- 释放过程比连接过程要复杂
- 数据传输结束后,通信双方都可以释放连接(客户端或服务端)
- TCP连接释放过程是
四报文握手
- A正在向B传送数据,突然就不想再和B继续下去了,准备分手。
- A停止向B发送数据,A主动关闭TCP(之前正在传输的数据)
- A向B发送数据报文段,请求报文中,FIN = 1(
标志着这段报文是请求释放连接的报文
) ,seq =u(这个u不是随便定的,因为前面A和B是在传输数据的,传输的数据字节的最后一个序号就是u
),等待B的确认。 - B向A发送确认报文,ACK =1 ,seq=v,ack = u+1。TCP服务器进程通知高层应用进程(
告诉它们A不会再发数据过来了
)。 这时A到B这个方向的连接就释放了,TCP连接处于半关闭状态。B若发送数据,A仍要接收
。 - 若B也没有要向A发送数据了,其应用进程就像刚刚A一样发送断开连接请求,重复以上过程。
- 当A或B发出确认断开连接的确认报文后,不能马上关闭连接,必须等2MSL时间后才能关闭。(MSL----Maximum Segment Lifetime 最长报文寿命)
1. 为了保证发出去的最后一个确认报文段能够到达另一方。
2. 为了让本连接期间所有产生的报文段都会从网络中消失(传丢了或者到达了。)