知识点
1、从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层
2、此层包含TCP和UDP协议。TCP 传送的数据单位协议是 TCP 报文段(segment),UDP 传送的数据单位协议是 UDP 报文或用户数据报。
3、IP数据报要经过互连网中许多路由器的存储转发,但 UDP用户数据报是在传输层的端到端抽象的逻辑信道中传送的。
4、网络层为主机之间提供逻辑通信,传输层为进程之间提供逻辑通信。
5、套接字:IP:端口号,通过 IP 找到主机,通过端口找到进程。
6、常用的熟知端口号:
7、UDP特点:
(1)无连接:通信之前不需要建立连接
(2)尽最大努力交付:不能保证可靠交付,不保证不出错
(3)面向报文
(4)没有拥塞控制
(5)首部开销小:只有 8 字节,TCP 首部 20 字节
IP 检验是只检验首部,不检验数据部分,UDP 检验是首部和数据都检验。
TCP特点:
(1)面向连接
(2)可靠交付
(3)提供全双工通信
(4)面向字节流
8、TCP 报文首部格式:
(1)序号:占 4 字节,每个字节都要编号,序号指本报文段的数据部分的第一个字节编号
(2)确认号:占 4 字节,期望收到对方下一个报文段的数据部分的第一个字节的序号,若确认号=N,表明到序号 N-1 为止的数据全部正确接收。
(3)数据偏移:占 4 字节,TCP 报文段的数据起始处到 TCP 报文段的起始处的距离,实质是 TCP 报文段的首部格式。
(4)紧急字段:URG=1 表明这是一个紧急数据
(5)确认 ACK:ACK=1 时,确认号字段有效;ACK=0 时,确认号字段无效
(6)检验和:检验首部和数据两部分
9、UDP的首部格式
10、TCP 连接建立:(三次握手)A 和 B 建立
(1)A 发出连接请求报文段:同步位 SYN=1,选择一个初始序号 seq=x,这个报文段不携带数据,但要消耗一个序号
(2)B 收到请求后,如果同意建立连接,向 A 发送确认,确认报文段中,SYN=1,ACK=1,确认号 ack=x+1,自己选一个初始序号 seq=y,这个报文段也不能携带数据,但消耗一个序号
(3)A 收到确认后,还要向 B 发送确认,这个确认报文的 ACK=1,确认号 ack=y+1,自己的序号 seq=x+1,这个报文段可以携带数据,但如果不携带数据,就不消耗序号。为什么要进行三次握手:可以解决延迟分组问题,保证数据的交换和可靠性。
![在这里插入图片描述](https://img-blog.csdnimg.cn/4be3d77abf684e19bb94e7fee16410a3.png11、TCP 连接释放
(1)A 发送连接释放报文段
(2)B 对 A 的连接释放确认
(3)B 对 A 发送连接释放报文段
(4)A 对 B 的连接释放进行确认
理由:TCP 提供全双工通信,四次才能全部释放
A 必须等待 2MSL 的时间
第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B。
第二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段
12、流量控制和拥塞控制
(1)拥塞控制用于保证网络通畅的传送数据,涉及网络中所有与之相关的主机和路由器的发送和转发行为,是一种全局性的控制措施。
(2)流量控制只涉及发送端和接收端之间的点到点的流量控制行为,主要用于保证发送端的发送速率与接收端的缓冲区容量相匹配,防止在接收端缓冲区不足时发生数据丢失现象。
13、TCP 的拥塞控制方法
(1) 算法:慢开始、拥塞避免、快重传、快恢复
(2)慢开始算法:发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1
(3)拥塞避免算法:让拥塞窗口缓慢增大,每经过一个往返时间 RTT 就把发送方的拥塞窗口加 1,“加法增大”,拥塞窗口按线性规律增长。
(4)快重传算法:接收方不用等待发送数据时捎带确认,要立即发送确认,发送方只要连续收到三个重复确认,就立即进行重传
(5)快恢复:把拥塞窗口的值设为慢开始门限改变后的数值,跳过慢开始过程,直接执行拥塞避免算法。
14、停止等待协议的优点是简单,但缺点是信道利用率太低。信道的利用率U
15、流水线传输:发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
16、连续ARQ协议
17、累积确认
接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
18、Go-back-N(回退N)
如果发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。
这就叫做 Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。
可见当通信线路质量不好时,连续ARQ协议会带来负面的影响。
19、注意:A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
20、流量控制举例
A 向 B 发送数据。在连接建立时,B 告诉 A:“我的接收窗口 rwnd = 400(字节)”
21、出现资源拥塞的条件:对资源需求的总和 > 可用资源
22、慢启动算法的原理
在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。
用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
使用慢启动算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。
22、设置慢启动门限状态变量ssthresh。慢启动门限 ssthresh 的用法如下:
当 cwnd < ssthresh 时,使用慢启动算法。
当 cwnd > ssthresh 时,停止使用慢启动算法而改用拥塞避免算法。
23、无论在慢启动阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢启动门限ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢启动算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕
24、快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送
方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
25、快恢复算法:当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢启动门限ssthresh 减半。但接下去不执行慢启动算法。
26、发送窗口的上限值 = Min [rwnd, cwnd]
经典例题
- 主机 A 向主机 B 连续发送了两个 TCP 报文段,其序号分别是 70 和 100。试问:
(1)第一个报文段携带了多少字节的数据?
(2)主机 B 收到第一个报文段后发回的确认中的确认号应当是多少?
(3)如果 B 收到第二个报文段后发回的确认中的确认号是 180,试问 A 发送的第二个报文段中的数据有多少字节?
(4)如果 A 发送的第一个报文段丢失了,但第二个报文段到达了 B。B 在第二个报文段到达后向 A 发送确认。试问这个确认号应为多少?
解答:分别求解如下:
(1)第一个报文段的数据序号是 70 到 99,共 30 字节的数据。
(2)B 期望收到下一个报文段的第一个数据字节的序号是 100,因此确认号应为 100。
(3)A 发送的第二个报文段中的数据中的字节数是 180-100=80 字节。
(4)B 在第二个报文段到达后向 A 发送确认,其确认号应为 70。 - TCP 的拥塞窗口 cwnd 大小与传输轮次 n 的关系如下所示:
(1)试画出拥塞窗口与传输轮次的关系曲线。
(2)指明 TCP 工作在慢开始阶段的时间间隔。
(3)指明 TCP 工作在拥塞避免阶段的时间间隔。
(4)在第 16 轮次和第 22 轮次之后发送方是通过收到三个重复的确认还是通过超时检
测到丢失了报文段?
(5)在第 1 轮次、第 18 轮次和第 24 轮次发送时,门限 ssthresh 分别被设置为多大?
(6)在第几轮次发送出第 70 个报文段?
(7)假定在第 26 轮次之后收到了三个重复的确认,因而检测出了报文段的丢失,那么
拥塞窗口 cwnd 和门限 ssthresh 应设置为多大?
解答:
(1)拥塞窗口和传输轮次的关系曲线如图:
(2)慢开始时间间隔:[1,6]和[23,26]。
(3)拥塞避免时间间隔:[616]和[17,22]。
(4)在第 16 轮次之后发送方通过收到三个重复的确认,检测到丢失了报文段,因为题目给出,下一个轮次的拥塞窗口减半了。在第 22 轮次之后发送方是通过超时检测到丢失了报文段,因为题目给出,下一个轮次的拥塞窗口下降到 1 了。
(5)在第 1 轮次发送时,门限 ssthresh 被设置为 32,因为从第 6 轮次起就进入了拥塞避免状态,拥塞窗口每个轮次加 1。
在第 18 轮次发送时,门限 ssthresh 被设置为发生拥塞时拥塞窗口 42 的一半,即 21。
在第 24 轮次发送时,门限 ssthresh 被设置为发生拥塞时拥塞窗口 26 的一半,即 13。
(6)第 1 轮次发送报文段 1。(cwnd=1)
第 2 轮次发送报文段 2、3。(cwnd=2)
第 3 轮次发送报文段 4~7。(cwnd=4)
第 4 轮次发送报文段 8~15。(cwnd=8)
第 5 轮次发送报文段 16~31。(cwnd=16)
第 6 轮次发送报文段 32~63。(cwnd=32)
第 7 轮次发送报文段 64~94。(cwnd=33)
因此第 70 报文段在第 7 轮次发送出。
(7)检测出了报文段的丢失时拥塞窗口 cwnd 是 8,因此拥塞窗口 cwnd 的数值应当减半等于 4,而门限 ssthresh 应设置为检测出报文段丢失时拥塞窗口 8 的一半,即 4。 - 如图为 TCP 拥塞控制
(1)第 12 个传输轮次 TCP 检测出了什么?新的门限值是多少?
(2)最初 MSS 为 1KB,带宽为 1024KB/S,一个 RTT 为 20ms,假设不考虑慢开始门限(即完全指数型增长),需要经过多长时间,慢开始发送的数据会充满整个带宽
答:(1)检测到了网络拥塞,新的门限值 12
(2)当充满带宽时,发送了数据 1024*0.02=20.48KB经过 4 个传输轮次后,数据达到 16KB,第五次将直接达到 20.48KB 因此需要经过 5RTT=100ms - TCP 报文首部的数据是 0XFD EF 00 17 00 01 7E 32 00 03 61 60 10 60 00 CE 05 00 00,请问源端口号?目的端口号?序列号?TCP 首部长度多少?该报文是不是服务器发送给客户端的?为什么?
答:源端口号:FD EF,十进制 65007,二进制 1111110111101111
目的端口号:00 17,十进制 23(7160+1161=23),二进制 10111(除 2 取余,逆序排余数)
序列号:00 01 7E 32,十进制 97842,二进制 10111111000110010
TCP 首部长度根据数据偏移字段求出,第 13 字节的前 4 位是数据偏移,即 10 60 中第一个数字 1,因此偏移了一位,一位 4 字节,由于最低 20B 因此 20B+4B=24B 不是服务器给客户端的,因为目的端口号 23,是服务器端口号 - A 给 B 发送若干 TCP 报文,此时,B 给 A 发送了 TCP 报文,该报文首部数据信息是0X00 15 FD EF 00 00 0E 88 00 00 25 81 50 10 30 00 C0 05 00,请问是否有确认序号?如果有,从第一个报文开始到现在 A 已经给 B 发送了多少数据?
答:ACK=1,说明已确认收到。确认号为 00 00 25 81,十进制为 9601,说明前面 9600 字节已经确认收到。 - TCP 是面向连接的、可靠的,但 TCP 使用的 IP 协议是不可靠的。在一个不可靠的 IP 上
能实现可靠的 TCP 吗?
答:TCP 实现的是主机应用程序之间的通信,IP 协议只实现主机之间的通信。TCP 协议是以 IP 协议为基础实现的,给应用层提供服务;IP 协议为 TCP 提供服务。简单说,IP 协议负责将数据从一台主机传输到另一台主机,而 TCP 协议保证传输的正确性