【计算机网络7】四. 传输层 (TCP/UDP)

一、 传输层

  为进程提供通用的数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。传输层具有复用和分用功能,复用就是多个应用层进程可以同时使用下面传输层的服务;分用则相反,指传输层把收到的信息分别交付给上面应用层中的相应进程。主要使用传输控制协议TCP和用户数据报协议UDP

二、TCP和UDP的区别

  • TCP提供可靠的、面向连接的传输服务,在传输数据前必须三次握手建立连接,传输结束后,四次挥手释放连接。而且在数据传输时,拥有确认应答、超时重传、滑动窗口、拥塞控制等机制来保证数据传输的可靠性,所以TCP适合用在对网络通信质量要求较高的地方,比如文件传输、邮件发送等场景。
  • UDP不提供可靠交付,传输数据前不建立连接,目的主机收到UDP报文后也不需要给出确认。一般用于即时通信,比如语音、视频、直播等场景。

三、TCP和UDP的首部结构

TCP报文分为首部和数据两个部分。
TCP首部的前20个字节是固定的,后面还有根据需要来增加的选项字段,所以TCP首部至少有 20 个字节。(1字节byte = 8位bit)

  1. 源端口和目的端口:它们各占 2 个字节,分别写入源端口号和目的端口号,用来实现分用功能。(分用指传输层把收到的信息分别交付给应用层中相应的进程)
  2. 序号:占 4 个字节,指的是报文段所发送数据的第一个字节的序号。
  3. 确认号:占 4 个字节,指的是期望收到下一个报文段所发送数据的第一个字节的序号。
  4. 数据偏移:占 4 位,它指出 TCP报文段的数据开始处 到 TCP报文段开始处 的距离,也就是指出TCP报文段的首部长度。因为TCP首部有长度不确定的选项字段,所以设置了数据偏移字段来指出它。
  5. 保留:占 6 位,用于以后使用。
  6. 六个控制位:分别是URG、ACK、PSH、RST、SYN、FIN,用于说明报文段的性质。
  7. 窗口:占 2 个字节,指的是自己的接收窗口,用于限制对方发送的数据量。
  8. 检验和:占 2 个字节,检验TCP报文在传输中是否出错。需要在报文前面临时添加一个伪首部(12字节)来计算检验和。
  9. 紧急指针:占 2 个字节,用于指出紧急数据的字节数。
  10. 选项:长度可变,最多占 40 字节。
    在这里插入图片描述

UDP报文分为首部和数据两个部分。
UDP的首部比TCP的小,只有8个字节(TCP的首部至少有20个字节),其中 源端口、目的端口、长度、检验和,各占 2 个字节。

  • 源端口和目的端口:分别写入源端口号和目的端口号,用来实现分用功能。(分用指传输层把收到的信息分别交付给应用层中相应的进程)
  • 长度:指的是UDP报文的长度。
  • 检验和:检验UDP报文在传输中是否出错。需要在报文前面临时添加一个伪首部(12字节)来计算检验和。
    在这里插入图片描述

四、TCP 如何实现的可靠传输?

  1. 数据包校验:检测数据包在传输过程中是否有变化, 如果有,就丢弃并且不做出响应, 这时 TCP 发送数据端超时后会重发数据;
  2. 滑动窗口:滑动窗口以字节为单位,发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和拥塞情况来设置自己的窗口大小。发送窗口不能超过接收窗口的数值。TCP 通过滑动窗口进行流量控制,抑制发送端发送数据的速率,以便接收端来得及接收。
  3. 确认应答:当 TCP 收到来自 TCP 连接另一端发来的数据时, 它会发送一个确认来告知对方自己收到了这个报文。
  4. 超时重传:当 TCP 发出一个报文段后,会启动一个定时器,等待目的端确认收到这个报文段。如果没有及时收到这个确认,就会重发这个报文段。
  5. 拥塞控制:它是为了防止过多的数据注入到网络, 导致网络中的路由器或者链路过载。拥塞控制采用了四种算法, 即:慢开始、拥塞避免、快重传和快恢复。

五、TCP 拥塞控制

  (流量控制: 指抑制发送端发送数据的速率,以便接收端来得及接收。是个端到端的问题
  (拥塞控制: 指防止过多的数据注入网络,导致路由器或链路过载,是个全局性的过程,涉及所有主机和路由器)

  TCP拥塞控制方法: TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复

慢开始与拥塞避免:

  首先使用慢开始算法,发送方维持一个叫做拥塞窗口的状态变量(cwnd),一开始发送方设置 cwnd 的值为1,发送第1个报文段,当收到确认后,将 cwnd 的值乘以2,每个轮次都这样增长,也就是2,4,8,16… 为了防止增长过快导致网络拥塞,所以需要设置一个慢开始算法的阈值(ssthresh)。当 cwnd 小于这个阈值时,使用慢开始算法;当大于这个阈值时,改用拥塞避免算法,每次只将 cwnd 加1,控制为线性增长。如果出现了超时,就将阈值设为当前 cwnd 值的一半,同时设置 cwnd = 1,然后重新执行慢开始算法。

快重传与快恢复:

  快重传算法要求接收方每次收到报文段都对最后一个收到的有序报文段进行确认。比如已经接收到 M1 和 M2,此时收到 M4,则应该发送对 M2 的确认。如果发送方重复收到三个对 M2 的确认,就表示 M2 的下一个报文段 M3 丢失了,立即重传 M3。这种情况只是丢失个别报文段,并不是网络拥塞,因此执行快恢复算法,令 阈值 = 当前 cwnd 值的一半 ,然后设置 cwnd = 阈值,接着执行拥塞避免算法。

  慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为阈值 ssthresh。
在这里插入图片描述
在这里插入图片描述

六、TCP粘包、拆包问题

产生原因:

  • 发送方的原因:在发送数据时,TCP默认使用 Nagle (妮狗)算法,将数据量较小的数据合成一个数据包进行发送,这样收到的就是一个粘包数据了。
  • 接收方的原因:TCP先用缓冲区来接收数据,如果接收数据的速度大于应用程序从缓冲区读取数据的速度,那多个包就会被缓冲区缓存在一起,发生粘包。如果数据大于缓冲区的大小,就会发生拆包

为什么TCP有粘包问题,而UDP没有:

  • 因为TCP以流的方式传输数据,把数据看成一连串无结构的字节流,数据包之间没有保护边界。而 UDP 的数据包之间有保护边界,接收方一次只接受一条独立的信息,所以不存在粘包问题。
如何处理粘包、拆包问题?
  1. 发送端关闭 Nagle 算法。
  2. 发送端将数据包封装为固定的长度,不够的话可以用 0 来填充,然后接收端每次从缓冲区读取这个固定长度的数据。
  3. 给每个数据包添加一个消息头,消息头存储数据包的长度,接收端通过消息头解析出长度,然后向后读取该长度的内容。
  4. 在数据包之间设置边界,比如添加特殊符号,这样接收端就可以通过这个边界将不同数据包分离开来。

TCP端点

( 每一条 TCP 连接只能有两个端点,连接只能是端对端。TCP 连接的端点叫套接字(socket),IP地址通过冒号拼接上端口号就构成了套接字。套接字 = (IP地址 : 端口号) 。(比如IP地址为 192.3.4.5,端口号为80,则拼接出的套接字为 192.3.4.5:80)。提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值