1、传输层
1.1 传输层的作用

1.2 传输层协议应用场景
- TCP/IP 的运输层有两个不同的协议: (1) 用户数据报协议 UDP (User Datagram Protocol) (2) 传输控制协议 TCP (Transmission Control Protocol)* 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。 TCP 传送的数据单位协议是
TCP 报文段(segment)
UDP 传送的数据单位协议是UDP 报文或用户数据报
。* TCP 分段、编号、流量控制、建立会话* 比如看电影,一台服务器同时提供多人观看电影,要建立连接,保证电影资源传输完成的情况下还要知道每个用户看的是哪部电影* 服务端向客户端发送数据,当客户端处理不过来的时候,可以通知服务端,进行流量限制 - UDP 一个数据报就能完成数据通信,不建立会话、多广播* 好比聊QQ,消息发送出去就可以,也不知道用户下次什么时候会再发消息,所以不会建立会话;如果发送失败了就尝试几次,再失败就直接告诉用户发送失败* 浏览器访问网站的时候,我们输入网址,然后通过域名解析获取网站地址,我们只把网站域名送出去,等服务器给我们返回网站的地址即可,拿到地址后再去访问网站就可以了,中间并不建立会话,一个包就可以搞定
1.3 传输层和应用层的关系
- HTTP = TCP + 80端口
- HTTPS = TCP + 443端口
- FTP = TCP + 21端口
- SMTP = TCP + 25端口
- POP3 = TCP + 110端口
- RDP = TCP + 3389端口
- 共享文件夹 = TCP + 445端口
- SQL(微软的SqlServer) = TCP + 1433端口
- DNS = UDP + 53端口 or TCP + 53端口(较少)
1.4 应用层协议和服务之间的关系
服务运行后在TCP或UDP的某个端口侦听客户端请求
1.5 UDP简析
- UDP是面向报文的
1.6.1 TCP概述
-
TCP
是面向连接
的运输层协议。 -
每一条
TCP
连接只能有两个端点
(endpoint),每一条TCP
连接只能是点对点
的(一对一)。 -
TCP
提供可靠交付
的服务。 -
TCP
提供全双工通信。 -
面向字节流
。TCP
面向字节流图解: -
TCP
把连接作为最基本的抽象。 -
每一条
TCP
连接有两个端点。 -
TCP
连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP
连接的端点叫做套接字
(socket)或插口。 -
端口号
拼接到(contatenated with)IP 地址
即构成了套接字
。
网络层只负责把数据包从一个网段转到另一个网段,传输中若丢了,网络层是不管的。可靠传输则是又传输层来实现的
- 停止等待协议
- 信道利用率 停止等待协议的优点是简单,但缺点是信道利用率太低。
- 发送方可
连续发送
多个分组,不必每发完一个分组就停顿下来等待对方的确认。 - 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
上面说到了连续发送来增加信道利用率,那么在连续发送
的过程中如何保证传输的可靠性呢,这个时候就需要滑动窗口
的技术

虽然使用了滑动窗口
可以连续发送,但是每个数据包都需要ack
,这样效率还是会受影响,因此可以使用累积确认
:
- 接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
- 累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
1.6.5 TCP报文段的首部格式

源端口
和目的端口
字段——各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。序号字段
——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。确认号
字段——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。数据偏移
(即首部长度)——占 4 位,它指出TCP 报文段
的数据起始处
距离TCP 报文段的起始处
有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。保留
字段——占 6 位,保留为今后使用,但目前应置为 0。- 紧急
URG
—— 当URG
= 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 确认 ACK
—— 只有当ACK
= 1 时确认号字段才有效。当ACK
= 0 时,确认号无效。同步 SYN
—— 同步SYN
= 1 表示这是一个连接请求或连接接受报文。终止 FIN (FINis)
—— 用来释放一个连接。FIN 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接窗口字段
—— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节检验和
—— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。紧急指针
字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。选项
字段 —— 长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”> MSS (Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度。数据字段加上 TCP 首部才等于整个的 TCP 报文段*填充
字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
1.6.6 TCP可靠传输实现
1)以字节为单位的滑动窗口技术




- 发送缓存
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
- 加权平均往返时间
1.6.8 TCP流量控制
- 一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
流量控制
(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。- 利用
滑动窗口机制
可以很方便地在 TCP 连接上实现流量控制。
1.6.9 TCP拥塞控制
拥塞控制的一般原理
- 出现资源拥塞的条件: 对资源需求的综合 > 可用资源
拥塞控制
是一个全局性的过程,涉及到所有主机、所有的路由器,以及与降低网络传输性能有关的所有因素流量控制
往往指在给定的发送端和接收端之间的点对点通信量的控制,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
拥塞控制所起的作用

控制拥塞方法-慢开始和拥塞避免
- 慢开始:* 在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。* 在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。* 用这样的方法逐步增大发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理
注意: “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。 “拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
快重传举例

- 快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。
- 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
- 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。
快恢复举例
- 当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
- 由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
发送窗口的上限值 = Min [rwnd, cwnd]
- 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值。
- 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
1.6.10 TCP的传输连接管理
- 传输连接有三哥阶段,即:
连接建立
、数据传输
和连接释放
* TCP连接的建立都是采用客户服务器
方式* 主动发起连接建立的应用进程叫做客户(client)
* 被动等待连接建立的应用进程叫做服务器(server)
#### TCP建立连接的三次握手

分析:
- 由上图可以看到,其实在前两次的握手过程中,已经可以确认信息,建立连接了,哪怕是需要确认接收窗口rwnd的大小也可以实现,那么为何还需要第三次握手呢?* 1、现假如没有第三次握手,客户端A向服务端B发送了一个请求,而这个请求选择了一条较远的路径传输,因此发送的时间较长;* 2、这时客户端A发现一直没有响应就重新发了一遍连接请求,而这次的路径较短,请求很快就到达了服务端B;* 3、服务端B的确认也很快,直接到达了A,这时就建立了连接,开始进行数据的传输;* 4、而这时最开始较远的那条连接请求也到了服务端B;* 5、服务器B这时收到了请求后就又会给客户端发送连接确认,等待数据传输;* 6、因为A、B已经建立了连接,所以对于这条信息A就会不理会,而B就会一直等,这样就消耗了B的资源,若这样的情况太多就会造成服务器B的“崩溃”
- 所以,就要进行第三次握手,当B返回确认后,由A再次返回确认,这时建立连接,开始传输数据,B不再进行等待;若长时间没有收到第三次握手,B就释放此次连接。#### TCP的连接释放






最后需要等2MSL时间(默认为4分钟)才可以释放,是因为防止最后A向B的ACK没有发送成功,这时在这4分钟内便可以使B重新发送释放连接请求,A也就可以再次ACK到B进行连接释放。
2、相关面试题
2.1 UDP相关
- UDP 和 TCP 的简单介绍* TCP分段、编号、流量控制、建立会话,一个面向连接的,面向字节流的传输层协议* UDPUDP 是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。 其余可详见上文
- **为什么要加有伪首部?**目的是让 UDP 两次检查数据是否已经正确到达目的地。 IP 接受正确的目的地址,传送到正确的上层程序。 所有伪首部包括:源 IP 地址,目的 IP 地址,0,协议号,UDP 长度。2.2 TCP相关
- TCP 通过哪些方式来保证可靠性?
1.应用数据被分割成 TCP 认为最适合发送的数据块。
2.确认机制,发送报文后,等待确认。
3.重发机制,没有收到确认,将重发数据段。
4.保持它首部和数据的校验和。确认数据的准确性。
5.排序,丢弃重复的,流量控制
- TCP 与 UDP 的概念相互的区别及优劣
1.TCP 面向连接,UDP 面向无链接
2.TCP 面向字节流,UDP面向报文
3.TCP 提供可靠传输服务(数据顺序、正确性),UDP 传输不可靠
4.TCP 协议传输速度慢,UDP协议传输速度快
5.TCP 协议对系统资源要求多(头部开销大),UDP 协议要求少
- 为什么要 3 次握手,4 次挥手* 3 次握手:防止已过期的连接请求报文突然又传送到服务器,因而产生错误* 4 次挥手:确保数据能够完成传输,但关闭连接时,当收到对方的 FIN 报文通知时,它 仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文 给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的
- TCP 的流量控制机制(详见上文)* **慢启动(慢开始)😗1.慢开始不是指 cwnd 的增长速度慢(指数增长),而是指 TCP 开始发送设置 cwnd=1。 2. 思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大 逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时 拥塞窗口大小是以字节为单位的。2.为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限(ssthresh 状态变量) 当 cnwd<ssthresh,使用慢开始算法 当 cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法 当 cnwd>ssthresh,使用拥塞避免算法 **拥塞避免:*3.拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增 长,使网络比较不容易出现拥塞。4.思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞控 制窗口加一。 无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有 收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做 拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口 设置为 1,执行慢开始算法。 **快速重传:*5.快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及 早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设 置的重传计时器时间到期。6.由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。 **快速恢复:**7.当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。 但是接下去并不执行慢开始算法。8.考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络 可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小, 然后执行拥塞避免算法。