5.1 运输层协议概述
5.1.1 进程之间的通信
- 运输层向上面的应用层提供通信服务,它属于面向通信部分的最高层,也用户功能的最低层。
- 只有主机的协议栈有运输层,路由器转发分组只用到下三层
- 从IP层来说,通信的两段是两台主机
- 当运输层采用面向连接的 TCP 协议时,尽管下面的 络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
- 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道。
5.1.2 运输层的两个主要协议
TCP/IP 的运输层有两个不同的协议:
- 用户数据 协议 UDP(User Datagram Protocol)
- 传输控制协议 TCP(Transmission Control Protocol)
- UDP是无连接的
- UDP使用尽最大努力交付,即不保证可靠交付
- UDP是面向 文的,将应用层交下来的 文照样发送,也就是一次交付一个完整的 文
- UDP没有拥塞控制
- UDP支持一对一,一对多,多对一和多对多的交互通信
- UDP首部开销小
5.3 传输控协议TCP概述
5.3.1 TCP的主要特点
- TCP是面向连接的运输层协议
- 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
- TCP 提供可靠交付的服务。
- TCP 提供全双工通信。
- 面向字节流。
TCP与应用程序的交互是一次一个数据块(大小不定),TCP将应用程序交下来的数据看成是一连串的无结构的字节流,并且TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但是接收方应用程序收到的字节流必须与发送的一致。也就是过程中的数据分块可以多样,但是最终的结果是传输数据完整一致。
- A发送完分组后,必须暂时保留已发送分组的副本
- 分组和确认分组应进行编
- 超时计时器应该比平均往返时间长一些
确认丢失
当B向A发送的对M1的确认丢失了,A在超时计时器到期后未收到M1的确认,于是A会重传M1,此时B收到M1后,会丢弃重复的这个M1,然后再次向A发送M1的确认。
确认迟到
同样B收到M1后发送M1的确认,但是M1因为 络等等原因并未及时被A收到,这时A有重传了M1,B收到后同样是丢弃重复的M1并再次发送M1的确认。
5.4.2 连续ARQ协议
设置一个发送窗口,实质就是一个数字,如下图的连续将五个分组发送出去而不等待对方确认,当发送方每接收一个确认,发送窗口就向前滑动一个分组的位置。
- 源端口和目的端口:个占2字节,分别写入源端口和目的端口 ,从而通过实现分用
- 序 :占4个字节,表示携带的数据 首个字节的序 ,因此总感觉字段也称为“ 文段序 ”
- 确认 :占4个字节,是期望对方下一个 文段的第一个数据字节序 ,若确认 =N,则表明到序 N-1为止的所有数据都已正确收到
- 数据偏移:占4位,表明TCP数据起始处位置,数据偏移单位为32位(4个字节),因此TCP首部最大长度不超过60字节(4*2^4)
- 保留:占6位
-
6个控制位
- 紧急URG:当URG=1,表明紧急指针字段有效,URG字段可使 文段在发送方传输时进行加急插队
- 推送PSH:发送方将PSH置1,接收方收到PSH=1的 文段,会尽快交付到应用程序,也就是在接收方进行加急插队
- 确认ACK:仅当ACK=1时确认 字段才有效,TCP规定在建立连接后所有传送的 文段都必须将ACK置1
- 同步SYN,在建立连接时用来同步序 ,SYN = 1 表示这是一个连接请求或连接接受 文
- 复位RST:当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
- 终止FIN:用来释放一个连接。FIN = 1 表明此 文段的发送端的数据已发送完毕,并要求释放运输连接
- 窗口:占2个字节,用来让对方设置发送窗口的依据。窗口字段指明选择允许对方发送的数据量
- 校验和:占2个字节,检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 文段的前面加上 12 字节的伪首部
- 紧急指针:占2个字节,只有URG=1紧急指针才有意义,它支持本 文段中紧急数据的字节数
- 选项:长度可变,最长可达40字节,TCP最初只规定了一种选项MSS表示 文段的数据字段的最大长度(数据字段+TCP首部=TCP 文段)
5.6 TCP可靠传输的实现
为方便讨论,这里我们假定数据传输只在一个方向进行(实际一般都是双向进行的)
5.6.1 以字节为单位的滑动窗口
假设A收到B发送的确认 文段,得知B的接收窗口是20,确认 是31,于是A就将发送窗口设为20,然后向B发送31以后的大小不定的 文段,直到发送窗口的字节发送完毕,B收到A发送的 文段,累积一定的字节(假设为10字节)就会发送确认信息并加上确认 41,发送完确认信息软件就能从接收缓存读取接收的 文段,并且接收窗口会往后移动,A收到确认信息同样发送窗口也会往后移动。
TCP的流量控制
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使 络发生拥塞。利用滑动窗口机制可以很方便地在 TCP连接上实现流量控制。
通过滑动窗口机制可以动态调整双方的发送与接收窗口,从而不至于一次性发送大量数据而导致接收方处理不过来。
A与B建立连接,B告诉A它的接收窗口rwnd是400字节
5.8.2 TCP的拥塞控制方法
TCP拥塞控制算法有四种:
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
慢开始和拥塞避免
拥塞控制也叫做基于窗口的拥塞控制,发送方维持一个叫做拥塞窗口 cwnd (congestionwindow)的状态变量。
慢开始算法的原理:增大发送端的拥塞窗口cwnd,可以使分组注入到 络的速率更加合理。使用慢开始算法后,没经过一个传输轮次,拥塞窗口cwnd就加倍。
快重传和快恢复
快重传算法首先要求接收方每收到一个失序的 文段后就立即发出重复确认。这样做可以让发送方及早知道有 文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的 文段。
发送窗口的上限值 = Min [rwnd, cwnd]
5.9 TCP的运输连接管理
运输连接有三个阶段:
- 连接建立
- 数据传输
- 连接释放
TCP 连接的建立都是采用客户服务器方式。主动发起连接建立的应用进程叫做客户(client)。被动等待连接建立的应用进程叫做服务器(server)。
5.9.1 TCP的连接建立(三次握手)
TCP建立连接的过程叫握手,握手需要客户与服务器之间交换三个TCP 文段。
下面是三次握手的内容(ACK:确认位,SYN:同步位,seq:序 ,表示 文段数据的第一个字节,ack:确认 ,表示希望收到对方下一个 文段的第一个数据字节序 )
- 客户机A 的 TCP 向 B 发出连接请求 文段,其首部中的同步位 SYN = 1,并选择序 seq = x,表明传送数据时的第一个数据字节的序 是 x。(此时主机A处于SYN-SENT状态)
- 服务器B的TCP收到 文请求后,如果同意建立连接,就会发送确认 文, 文内容为SYN = 1,使 ACK = 1,确认 ack = x + 1,自己选择的序 seq = y。(此时主机B处于SYN-RCVD状态)
- A收到B的确认 文后,向B发送确认 文,此时ACK=1,seq=x+1,ack=y+1,同时A的TCP通知上层应用连接已经建立(此时A处于ESTABLISHED状态)
- B收到确认 文同样通知上层应用:TCP建立已经连接(B也处于ESTABLISHED状态)

注意事项:
- 一开始双方都处于CLOSED(关闭)状态,本例中A主动打开连接,B被动打开连接,双方都首先要创建TCB传输控制模块,然后B将处于LISTEN监听状态(使用80端口)
- 前两次握手SYN位都置1,而ACK位三次都置1,前两次都是SYN同步 文段,所以后面的seq序 都只+1,第三次握手如果不携带数据,下一个数据 文段序 仍然为seq=x+1
为什么前两次已经建立连接,仍然需要第三次握手/strong>
假定出现这种情况:A发送了第一个请求连接,请求 文段并未丢失,而是在 络中滞留了一段时间,A因为没收到确认 文,于是重传了一次连接请求,然后与B正常建立了连接,这时B收到了A第一次发送的请求 文因为A又发了一次新的连接请求,于是向A发送确认 文段,同意建立连接。假如没有第三次握手,B发出确认后,连接已经建立。但是A并未请求新的连接,于是会丢弃B的确认 文,而B因为新的连接已经建立,一直等待A发送数据,这样就造成B的许多资源浪费。
5.9.2 TCP的连接释放(四次挥手)
传输结束后,双方可释放连接,选择A和B都处于ESTABLSHED状态(终止位FIN同样不携带数据,但是要消耗一个序 )
下面是四次挥手过程:
- A数据传输完成,发送连接释放 文,将FIN=1,seq=u等待B的确认(此时A处于FIN-EAIT-1状态)
- B收到释放连接 文段后发出确认,ACK=1,seq=v,ack=u+1,TCP服务器进程会通知高层应用,TCP连接处于半关闭状态,只有B还能向A发送数据(此时B进入CLOSE-WAIT状态)
- A收到B的确认,进入FIN-WAIT2状态,等待B的连接释放 文
- 当B没有数据向A发送时,应用进程会通知TCP释放连接,B发送释放连接 文,FIN=1,seq=w,ack=u+1,然后等待A的确认(B进入LAST-ACK最后确认状态)
- A收到B的连接释放 文段后,必须发送确认,将ACK置1,确认 ack=w+1,seq=u+1,然后进入TIME-WAIT状态,但是现在TCP连接还没释放,只有等待2MSL(每个MSL为2分钟)后,A才进入CLOSED状态
- B收到A的确认则立即进入CLOSED状态
为什么A进入TIME-WAIT必须等待 2MSL 的时间/strong>
- 为了保证 A 发送的最后一个 ACK 文段能够到达 B。
- 防止 已失效的连接请求 文段出现在本连接中。A 在发送完最后一个 ACK 文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有 文段,都从 络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求 文段。
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树认识身边的计算机 络常见的 络设备22114 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!