1 功能
1.1 进程间通信
-
从通信和信息处理的角度看,运输层向应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层
-
当 络的边缘部分中的两个主机使用 络的核心部分的功能进行端到端的通信时,只有位于 络边缘部分的主机的协议栈才有运输层,而 络核心部分中的路由器在转发分组时都只用到下三层的功能
-
运输层为相互通信的应用进程提供了逻辑通信
1.3 运输层的主要功能
- 为应用进程之间提供端到端的逻辑通信
- 对收到的 文进行差错检测
- 需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。
1.4 两种不同的运输协议
- 运输层向高层用户屏蔽了下面 络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道
- 当运输层采用面向连接的 TCP 协议时,尽管下层的 络都是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道
- 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道
2 UDP与TCP异同
2.1 TCP 与 UDP
-
两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。
-
TCP 传送的数据单位协议是 TCP 文段(segment)
-
UDP(User Datagram Protocol) 传送的数据单位协议是 UDP 文或用户数据
-
TCP/IP 体系中的运输层协议
-
第一次握手
建立连接时,客户端发送syn包(syn=j)到服务器,进入态,待服务器确认
SYN:同步序列编 (Synchronize Sequence Numbers)
- 第二次握手
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,服务器进入态 - 第三次握手
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入状态,完成三次握手
完成三次握手,也就建立了客户端与服务端的连接。客户端与服务器开始传送数据。一个完整的三次握手也就是:请求—应答—再次确认。
那说到现在,到底什么是连接就是经过 TCP 三次握手后,双方主机准备好数据传输的资源(比如各种数据结构)。
4.2.3 四次挥手
由于TCP连接是全双工,因此每个方向都必须。
原则
当一方完成它的数据发送任务后,就能发送一个FIN来终止这个方向的连接。
收到一个 FIN只代表这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
首先进行关闭的一方将执行主动关闭,另一方执行被动关闭。
工作流程
- 客户端A发送一个FIN,以关闭Client A —->>>Server B的数据传送
- B收FIN,发ACK,确认序 为收到的序 加1
- B关闭与A的连接,发FIN给A
- 将应用数据分割为 TCP 认为最合适发送的数据块
- 超时重传
当 TCP 发出一个段后,他启动一个定时器,等待目的端确认收到这个 文段
若不能及时收到一个确认,将重发这个 文段 - 若 TCP 收到包,校验出包有错,丢弃 文段,不给出响应,TCP 发送端会超时重传
- 对于失序数据进行重排序,然后交给应用层
TCP 文段作为 ip 数据 进行传输,而 ip 数据 的到达会失序,因此 TCP 文段的到达也可能失序。若必要,TCP 将对收到的数据进行重新排列,以正确的顺序交给应用层 - 对于重复数据,直接丢弃。
- TCP 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出。
- ARQ表明重传的请求是自动进行的
接收方不需要请求发送方重传某个出错的分组 - 一个发送窗口
- 一个接收窗口
-
持续计时器(persistence timer)
- TCP 为每一个连接设有一个持续计时器
- 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器
- 若持续计时器设置的时间到期,就发送一个零窗口探测 文段(仅携带 1 字节的数据),而对方就在确认这个探测 文段时给出了现在的窗口值
- 若窗口仍是零,则收到这个 文段的一方就重新设置持续计时器。
- 若窗口不是零,则死锁的僵局就可以打破了
4.2.4 为什么建立连接是三次握手,而关闭连接却四次握手
服务端的状态下的socket当收到syn 文的连接请求后,它可把ACK和SYN(ACK起应答作用,SYN起同步作用)放在同一个 文发送。
但关连接时,当收到对方的FIN 文时,仅表示对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了,所以你大可不必立即关闭socket,即你可能还需发送一些数据后,再发FIN来表示你也可以关连接了,所以这里的ACK 文和FIN 文多数情况下都是分开发送的。
4.3 可靠传输
4.3.1 工作原理
4.3.2 可靠传输的实现
TCP 通过下列方式提供可靠性
使用上述的确认和重传机制,我们就可以在不可靠的传输 络上实现可靠的通信
这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)
4.3.3 TCP 可靠通信的具体实现
TCP 连接的每一端都必须设有两个窗口
TCP 的可靠传输机制用字节的序 进行控制:所有的确认都是基于序 而不是基于 文段
TCP 两端的四个窗口经常处于动态变化中
TCP 连接的往返时间 RTT 也不是固定不变的:需要使用特定的算法估算较为合理的重传时间
应用场景
聊天消息传输、推送,单人语音、视频聊天等。几乎UDP能做的都能做,但需要考虑复杂性、性能问题。
限制
无法进行广播、多播等操作
5 TCP 文段的首部格式
6.2 传输效率
可以用不同的机制来控制 TCP 文段的发送时机
- TCP 维持一个变量,等于最大 文段长度(MSS)
只要缓存中存放的数据达到MSS 字节,就组装成一个 TCP 文段发送出去 - 由发送方的应用进程指明要求发送 文段
即 TCP 支持的推送(push)操作 - 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入 文段(但长度不能超过 MSS)发送出去
7 TCP的拥塞控制
7.1 原理
在某段时间,若对 络中某资源的需求超过了该资源所能提供的可用部分, 络的性能就要变坏——产生拥塞(congestion)
- 出现拥塞的条件
对资源需求 > 可用资源 - 若 络中有许多资源同时产生拥塞, 络性能就会明显变坏,整个 络的吞吐量将随输入负荷的增大而下降
拥塞控制与流量控制的关系
-
拥塞控制
- 所要做的都有一个前提,就是 络能够承受现有的 络负荷
- 是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低 络传输性能有关的所有因素
-
流量控制
- 在给定的发送端和接收端之间的点对点通信量的控制
- 抑制发送端发数据的速率,以便使接收端来得及接收
-
拥塞控制所起的作用
传输轮次(transmission round)
- 使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍
- 一个传输轮次所经历的时间其实就是往返时间 RTT
- “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的 文段都连续发送出去,并收到了对已发送的最后一个字节的确认
- 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个 文段,并收到这 4 个 文段的确认,总共经历的时间
设置慢开始门限状态变量ssthresh
- 当 cwnd < ssthresh 时,使用慢开始算法。
- 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
- 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
- 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长
当 络出现拥塞时
- 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断 络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)
- 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法
- 这样做的目的就是要迅速减少主机发送到 络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕
2.1.5 乘法减小(multiplicative decrease)
- 不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次 络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5
- 当 络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到 络中的分组数
2.1.6 加法增大(additive increase)
执行拥塞避免算法后,在收到对所有 文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止 络过早出现拥塞。
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树首页概览22327 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!