1.13k likes | 1.37k Views
第 8 章 传输层协议. 8.4 传输控制协议 TCP. 主要内容: TCP 概述 TCP 的端口号和套接字地址 TCP 的报文段 TCP 的数据编号与确认 TCP 的连接管理 TCP 的连接管理状态转换图 流量控制 傻瓜窗口综合症 差错控制 拥塞控制 定时器管理. 8.4.1 TCP 概述. 面向连接的服务 要获得 T C P 服务,在一个应用进程向另一个应用进程开始发送数据之前,必须先在双方之间建立一条连接,数据传送结束后要释放连接 。. 8.4.1 TCP 概述. 发送端. 接收端. . . 应用进程.
E N D
8.4 传输控制协议 TCP 主要内容: • TCP概述 • TCP的端口号和套接字地址 • TCP的报文段 • TCP的数据编号与确认 • TCP的连接管理 • TCP的连接管理状态转换图 • 流量控制 • 傻瓜窗口综合症 • 差错控制 • 拥塞控制 • 定时器管理
8.4.1 TCP概述 • 面向连接的服务 要获得T C P服务,在一个应用进程向另一个应用进程开始发送数据之前,必须先在双方之间建立一条连接,数据传送结束后要释放连接。
8.4.1 TCP概述 发送端 接收端 应用进程 应用进程 向发送缓存 写入数据块 从接收缓存 读取数据块 … … 端口 端口 TCP TCP 发送缓存 接收缓存 … 报文段 报文段 报文段 发送TCP报文段
全双工服务 TCP连接提供全双工服务,所有TCP连接都是点到点的。 • 字节流传递服务 一个TCP连接就是一个字节流,即:两个建立了TCP连接的应用进程之间交换的是字节流。端到端之间不保留消息的边界。 例如:一方的应用程序发送两个1024B的报文,连接的另一方将无法了解发送方每次发送了多少字节。当2048B到达接收方时,接收这2048B,而并不知道这是两个1024B的消息,还是一个2048B的消息。
8.4.2TCP的端口号和套接字地址 • TCP和UDP都采用16bit的端口号来标识应用程序
8.4.2TCP的端口号和套接字地址 • TCP和UDP对端口号的使用彼此独立,即:同一个端口号可以有两种不同的用途。 例如:如果一个应用程序可以使用TCP和UDP,就对这个应用程序分配相同的端口号。
8.4.2TCP的端口号和套接字地址 • 套接字地址有一个IP地址与一个端口号组成,共48bit。 • 要使用TCP服务,首先要在发送端的套接字和接收端的套接字之间建立一条连接,即建立一对套接字地址:客户套接字地址和服务器套接字地址。 • 一个套接字可能同时用于多个连接。
8.4.3TCP的报文段 • TCP报文段由首部和数据两部分组成。 • 首部前20字节是固定部分,后面有4N字节是根据需要而增加的选项(N必须是整数,若不是整数则需加0填充)。 • 选项部分最多是40字节(4N)。 固定部分20B 首部
8.4.3TCP的报文段 • TCP报文段既可以用来传送数据,也可以用来建立连接和应答(连接的建立和终止时,双方交换的报文段仅有TCP首部)。 固定部分20B 首部
32 bit 比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节的 固定首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 TCP 首部 TCP 数据部分 TCP 报文段 发送 IP 首部 IP 数据部分
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 源端口和目的端口字段——各占 2 字节。源端口号和目的端口号:分别标识发送和接收这个报文段的应用程序的端口。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 序号字段——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号(由随机数产生器产生,并非从0开始)。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 已知一个报文段的序号为301,报文段中共有100B,即其最后一个字节的序号是400。因此在下一个报文段的序号为401。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 确认号字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 TCP的确认号是“累计的”。 例如:接收端正确地接收了一个报文段,其序号字段的值是2001,而数据长度是1000B,表明序号在2001~3000之间的数据均已收到,则确认号应是3001,即接收端期望收到的下一个字节的序号。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 TCP无法对一个报文段进行否认。 例如:如果收到1025~2048字节的报文段,但它的校验和错,那么TCP接收端所能做的就是发回一个确认号为1025的确认报文。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 数据偏移(首部长度)——占 4 bit,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,即:表明TCP首部的长度共有多少个4B(以4 字节为计算单位)。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 保留字段——占 6 bit,保留为今后使用,但目前应置为 0。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 控制字段 ——定义了6个不同的控制位。用于TCP的流量控制、连接的建立和终止以及表示数据的传送方式等。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 紧急比特 URG —— 当 URG 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 确认比特 ACK —— 只有当 ACK 1 时确认号字段才有效。当 ACK 0 时,确认号无效。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 推送比特 PSH (PuSH) —— 接收 TCP 收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 复位比特 RST (ReSet) —— 当 RST 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 同步比特 SYN —— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 SYN结合ACK对报文进行区分。 • 报文段的SYN=1,ACK=0 表示TCP连接请求报文 • 报文段的SYN=1,ACK=1 表示对方同意建立连接请求的确认报文
当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号ISN,一个SYN占用一个序号。当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号ISN,一个SYN占用一个序号。 • 例如: 1)当主机A的TCP向主机B的TCP发出连接请求报文段时,其SYN位置1,同时选择一个初始序号X为1200; 2)当主机B对主机A的SYN报文段进行确认时,这个报文段中的ACK序号为X+1=1201。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 终止比特 FIN (FINal) —— 用来释放一个连接。当FIN 1 时,表明此报文段的发送端的数据已发送完毕,并要求释放传输连接,但接收端还可以继续接收数据。
比特 0 8 16 24 31 窗口大小字段 —— 占 2 字节。窗口大小字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 紧急指针字段 —— 占 16 bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。当URG(紧急标志位)置1,该字段才有效,指示这个报文段中包括紧急数据。
比特 0 8 16 24 31 源 端 口 目 的 端 口 MSS 是 TCP 报文段中的数据字段的最大长度。 数据字段加上 TCP 首部 才等于整个的 TCP 报文段。 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 选项字段 —— 长度可变。在TCP首部中有40字节的可选信息。 最重要的选项,即最大报文段长度 MSS (Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
选项:在TCP首部中有40字节的可选信息。最重要的选项是MSS(Maximum Segment Size) 。 代码:2 长度:4 最大报文段长度 (8bit) (8bit) (16bit) 选项MSS的格式
选项字段 连接建立过程中,连接的双方都要宣布各自的MSS(在SYN报文段中给出MSS选项),并且查看对方给出的MSS。 在以后双方的数据传输过程中,MSS取双方给出的最小值。如果一方没有指明这个选项,则默认它的MSS为536B。
比特 0 8 16 24 31 源 端 口 目 的 端 口 序 号 20 字节 固定 首部 确 认 号 TCP 首部 数据 偏移 U R G A C K P S H R S T S Y N F I N 窗 口 大 小 保 留 检 验 和 紧 急 指 针 选 项 (长 度 可 变) 填 充 填充字段 ——长度不定,用于填充以保证TCP头部的长度为4字节的整数倍,值全为0。
8.4.3 TCP 的数据编号与确认 • TCP 协议是面向字节流的。TCP 将所要传送的报文看成是字节组成的数据流,并使每一个字节对应于一个序号。 • TCP采用字节序号:字节流中的每一个字节都分配一个序号,使接收端TCP能把接收到的这些字节按正确的顺序重新装配起来交付到终点。 • 在连接建立时,双方要商定初始序号。TCP 每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。 • TCP 的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加 1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。
8.4.4 TCP 的连接管理1. 传输连接的三个阶段 • 传输连接就有三个阶段,即:连接建立、数据传送和连接释放。传输连接的管理就是使传输连接的建立和释放都能正常地进行。 • 连接建立过程中要解决以下三个问题: • 要使每一方能够确知对方的存在。 • 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。 • 能够对传输实体资源(如缓存大小,连接表中的项目等)进行分配。
客户服务器方式 • TCP 的连接和建立都是采用客户服务器方式。 • 主动发起连接建立的应用进程叫做客户(client)。 • 被动等待连接建立的应用进程叫做服务器(server)。
1)建立连接 TCP协议中建立连接采用三次握手(three-way handshake)的方式实现。 主动打开 被动打开 报文段1:SYN 连接请求 报文段2:SYN+ACK 确认 报文段3:ACK 确认 TCP协议建立连接三次握手的过程
建立 TCP 连接 • A 的 TCP 向 B 发出连接请求报文段,其首部中的同步比特 SYN 应置为 1,并选择序号 x,表明传送数据时的第一个数据字节的序号是 x。 • B 的 TCP 收到连接请求报文段后,如同意,则发回确认。 • B 在确认报文段(ACK置1)中应将 SYN 置为 1,其确认号应为 x 1,同时也为自己选择序号 y。 • A 收到此报文段后,向 B 给出确认(ACK置1),其确认号应为 y 1,序号是x+1。 • A 的 TCP 通知上层应用进程,连接已经建立。 • 当运行服务器进程的主机 B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程,连接已经建立。
连接请求碰撞:两个主机同时向对方发出主动打开命令,同时要求和对方建立连接。连接请求碰撞:两个主机同时向对方发出主动打开命令,同时要求和对方建立连接。 此种情况下,两个TCP都向对方发送SYN+ACK报文段,在双方之间建立一条连接。(注意:仅建立一条连接,而不是两条。) 主动打开 主动打开 时间
思考题 • 若TCP使用两次握手的方法来建立连接,是否可能产生死锁?试举例说明。
我已经没有数据要发送了。但你如果还发送数据,我仍接收。我已经没有数据要发送了。但你如果还发送数据,我仍接收。 2)释放连接 TCP连接释放四次握手的步骤: 报文段1:FIN 报文段2:ACK 报文段3:FIN 报文段4:ACK
连接释放 TCP连接释放四次握手的步骤: 1)首先进行关闭的客户端TCP发送第一个报文段,终止比特FIN标志置1。将执行主动关闭,不再发送数据。 2) 服务器端TCP发送第二个报文段,用来确认从客户发来的FIN报文段。 3)当服务器端没有数据发送时,它就发送第三个报文段,终止比特FIN标志置1。 4) 客户端TCP发送第四个报文段, 用来确认从服务器端TCP收到了FIN报文段。
如果一个TCP连接的两端同时主动关闭(同时发送FIN报文段)。这两个报文段按常规方法被确认,然后连接被释放。这与两台主机按顺序先后释放连接没有本质区别。如果一个TCP连接的两端同时主动关闭(同时发送FIN报文段)。这两个报文段按常规方法被确认,然后连接被释放。这与两台主机按顺序先后释放连接没有本质区别。
3) 连接复位 • 连接复位表示撤销当前的连接。只要连接复位,双方的数据传输就都立即终止。 • 当TCP需要连接复位时使用RST报文段,其复位比特RST置1。 • 发生连接复位的3种情况: (1)一端的TCP请求连接到并不存在的端口,另一端的TCP就可以发送一个复位报文段来取消这个请求。 (2)一端的TCP出现异常,而愿意把连接异常终止,它就可以发送复位报文段来关闭这一连接。 (3)一端的TCP可能发现在另一端的TCP已经空闲了很长时间,则它可以发送复位报文段把这个连接撤销。 • 复位报文段不需另一端做出任何响应,也不需要另一端进行确认。
8.4.5TCP的连接管理状态转换 • TCP的11种连接状态名称及其描述: CLOSED:没有任何连接状态 LISTEN:服务器侦听来自客户的TCP的连接请求SYN-SENT:在发送连接请求后等待确认SYN-RECEIVED:收到连接请求ESTABLISHED:已建立连接,可传输数据FIN-WAIT-1:应用进程请求关闭连接,已发出FIN,等待对方同意释放连接的确认FIN-WAIT-2:已收到对方同意释放连接的确认,等待对方关闭连接 TIME-WAIT:等待足够的时间以确保该连接的所有报文段消失CLOSING:双方同时开始关闭连接,双方都在等待对方同意自己关闭连接的确认 CLOSE-WAIT:服务器等待自己的应用进程要求释放连接LAST-ACK:服务器等待客户端对服务器端释放连接请求的确认
8.4.5TCP的连接管理状态转换 • 用有限状态机描述TCP的各种连接状态以及各状态之间可能发生的转换。 • 在任何时刻,机器只处于某一种状态,并一直保持这个状态,直到某个事件发生。发生的事件使机器进入一个新的状态,即事件可使机器完成某种操作。 • 状态转换表示一个状态到另一个状态的迁移,包括迁移的条件和迁移的动作。
连接状态 本地 IP 地址 本地端口 远地 IP 地址 远地端口 连接 1 连接 2 连接 n 8.4.5TCP的连接管理状态转换 • 为了管理因特网,在网络管理中心设有管理信息库 MIB (Management Information Base)。 • 管理信息库存放着各主机的 TCP 连接表。 • TCP 连接表对每个连接都登记了其连接信息。除本地和远地的 IP 地址和端口号外,还要记录每一个连接所处的状态。
8.4.5TCP的连接管理状态转换 • TCP的11种连接状态名称及其描述: CLOSED:没有任何连接状态 LISTEN:服务器侦听来自客户的TCP的连接请求SYN-SENT:在发送连接请求后等待确认SYN-RECEIVED:收到连接请求ESTABLISHED:已建立连接,可传输数据FIN-WAIT-1:应用进程请求关闭连接,已发出FIN,等待对方同意释放连接的确认FIN-WAIT-2:已收到对方同意释放连接的确认,等待对方关闭连接 TIME-WAIT:等待足够的时间以确保该连接的所有报文段消失CLOSING:双方同时开始关闭连接,双方都在等待对方同意自己关闭连接的确认 CLOSE-WAIT:服务器端等待自己的应用进程要求释放连接LAST-ACK:服务器端等待客户端对服务器端释放连接请求的确认