计网--传输层

传输层的服务

  • 为运行在不同主机上的进程之间提供了逻辑通信,网络层提供主机之间的逻辑通信
  • 复用和分用
    • 复用:发送方不同的应用进程都可使用同一个传输层协议传送数据
    • 分用:接收方的传输层在剥去报文的首部后能把这些数据正确交付到目的应用进程
  • 对收到的报文进行差错检测(首部和数据部分),网络层只检查 IP 数据报的首部,不检查数据部分是否出错
  • 提供两种不同的传输协议:面向连接的 TCP 和无连接的 UDP。网络层无法同时实现两种协议

端口号表示本计算机应用层中的各进程

端口号拼接到 IP 地址即构成套接字 Socket,唯一的表示网络中一台主机和其上的一个进程

面向连接服务:在通信双方进行通信之前,必须先建立连接,需要通信结束后释放这个连接

无连接服务:两个实体间的通信不需要先建立好连接

UDP

仅在 IP 的数据报服务上加了两个最基本的服务:

  • 复用和分用
  • 差错检测

优点

  • 无须建立连接,不会引入建立连接的时延(DNS需要快)
  • 无连接状态,能支持更多服务
  • 分组首部开销小:TCP 20B, UDP 8B
  • 应用层能更好的控制发送的数据和发送时间,因为 UDP 没有拥塞控制
  • 支持一对一,一对多,多对一,多对多的交互通信

通常用于一次性传输较少数据的网络应用,如DNS, SNMP等。

UDP是面向报文的,报文不可分割,是UDP数据报处理的最小单位。因此,应用程序必须选择大小合适的报文

UDP格式

在这里插入图片描述
UDP数据报包含两部分:

  • UDP首部
    • 一共 8B ,由四个字段组成,每个字段长度都是 2B
      • 源端口:在需要对方回信时选用,不用时可全用 0
      • 目的端口:在终点交付报文时必须用到
      • 长度:UDP数据报的长度(包括首部和数据),最小值是 8(只有首部)
      • 校验和:检测 UDP 数据报在传输中是否有错,有错就丢弃。该字段可选,不想校验时,直接设为全 0
  • 用户数据

传输层从 IP 层收到 UDP 数据报时,根据首部中的目的端口,把数据上交给对应的应用进程。如果发现不存在对应端口号的进程,就丢弃该报文。并由 ICMP 发送差错报文给发送方

UDP校验

在最前面增加 12 字节伪首部,把首部和数据部分一起校验

没看,感觉有点难呢

TCP

在不可靠的 IP 层上,实现的可靠的数据传输协议,主要解决传输的可靠,有序,无丢失和不重复问题

  • 是面向连接的传输层协议
  • 每条 TCP 连接只能由两个端点,每条 TCP 连接只能是点对点的(一对一)
  • 提供可靠的交付服务
  • 提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据。因此,两端都设有发送缓存和接收缓存,用来临时存放双星通信的数据
    • 发送缓存存放
    • 接收缓存存放
  • 是面向字节流的,TCP 把应用程序交下来的数据仅视为一连串无结构的字节流

报文段

TCP 传送的数据单元称为报文段。报文段既可以用来运载数据,又能用来建立连接,释放连接和应答

在这里插入图片描述
分为首部和数据

  • 首部:最短为 20B,后面有 4N 字节是根据需要而增加的选项,长度通常为 4B 的整数倍

    • 源端口和目的端口号:各2B

    • 序号:4B,范围是 0 − − − − 2 32 − 1 0----2^{32}-1 02321 。TCP传送时是逐个字节传送的,所以 TCP 连接传送的字节流中每个字节都按顺序编号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号

    • 确认号:4B,是期望收到对方下一个报文段的第一个数据字节的序号,若确认号为 N,则表明到序号 N-1 为止所有数据都已正确收到

    • 数据偏移:4位,就是首部长度,数据偏移的单位是 4B,当此字段为 15时,达到TCP首部最大长度 60B

    • 确认位ACK:ACK=1时,确认号字段才有效。ACK=0时,确认号字段无效。连接建立后,所有传送的报文段都必须把 ACK 置 1

    • 同步位SYN:SYN=1表示这是一个连接请求 / 连接接受报文

    • 窗口:2B,允许对方发送的数据量,因为接收方缓存窗口是有限的

    • 校验和:2B,检验范围包括首部和数据。和UDP一样,校验时要加 12B 伪首部

    • 选项:长度可变,最初只规定了一种选项,即最大报文段长度(MSS),是TCP报文段中数据字段的最大长度

  • 数据:

TCP连接管理

TCP连接有三个阶段:连接建立,数据传送和连接释放。TCP把连接作为最基本的抽象

TCP连接的端口即为套接字或插口,每条TCP连接唯一地被通信的两个端点(套接字)确定

采用 客户 / 服务器形式

连接的建立

三次握手

  • 客户机的 TCP向服务器 TCP 发送连接请求报文。报文段首部中同步位 SYN=1,同时选择一个初始序号 seq=x。SYN报文段不能携带数据,但是会消耗掉一个序号
  • 服务器 TCP 收到连接请求报文后,若同意,则向客户机发回确认,并为该 TCP 连接分配缓存和变量。在确认报文中,SYN=ACK=1,确认号是 ack=x+1,同时也为自己选择一个初始序号 seq=y。确认报文段不能携带数据,但也要消耗一个序号
  • 客户机收到确认报文后,给服务器确认,并为该 TCP 连接分配缓存和变量。ACK=1, 确认号 ack=y+1,序号 seq=x+1。该报文段可携带数据。若不携带,则不消耗序号。

服务器端资源在完成第二次握手时分配,客户端在完成第三次握手时分配。

就是:客户机说我想来,服务器说来吧,客户机就来了

连接的释放

  • 客户机向其 TCP 发送连接释放报文段,并停止发送数据,报文段终止位 FIN=1,序号 seq=u,是前面传送过数据的最后一个字节的序号加 1。即使不携带数据,也消耗一个序号。这时客户就不能向服务器发送数据了。但是服务器还可以发
  • 服务器收到连接释放报文段,发出确认。确认号为 ack = u + 1,序号 seq = v,等于前面已经发送过的数据的最后一个字节的序号加 1。此时从客户机到服务器这个方向的连接就释放了
  • 若服务器没有要向客户机发送的数据,则通知 TCP 释放连接,发出 FIN = 1 的连接释放报文段。seq = w,ack = u + 1
  • 客户机收到后,发出确认。ACK=1,ack=w+1,seq=u+1。此时 TCP连接还未释放,必须经过一段时间(最长报文寿命)客户机才关闭。

就是:客户机说我没东西传了,服务器说那拜拜,服务器自己传自己的,然后没东西传了,客户机说那拜拜

TCP可靠传输

序号

首部的序号字段用来保证数据能有序提交给应用层

确认

首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。

发送方缓存区会继续存储那些已发送但未收到确认的报文段,以在需要时重传

默认使用累计确认,只确认到第一个丢失字节为止的字节。比如收到了 0–2和6—7,但是此时的确认号是 3。(3是第一个丢失字节)

重传

超时 和 冗余ACK 都重传

  • 超时:TCP每发送一个报文段,就对这个报文段设置一次计时器。设置的重传时间到了但还没收到确认,就重传。自适应地计算加权的平均往返时间 R T T s RTT_s RTTs 。设置的时间应略大于 R T T s RTT_s RTTs
  • 冗余ACK(冗余确认):
    • TCP规定,每当比期望序号大的失序报文段到达时,就发送一个冗余ACK。
    • 当发送方收到对同一个报文段的3个冗余 ACK 时,就认为这个报文段之后的报文段丢失。

TCP流量控制

消除发送方使接收方缓存区溢出的可能性,是端到端的问题

基于滑动窗口协议

  • 接收窗口 rwnd:接收方允许连续接收的最大能力,接收方根据自己接收缓存的大小调整,由接收方通过报文中的窗口字段通知发送方
  • 拥塞窗口 cwnd:发送方根据当前网络拥塞程度确定的值
  • 发送方实际窗口大小是二者的最小值

TCP拥塞控制

防止过多的数据注入网络,保证网络中的路由器或链路不过载,是网络的全局问题。

发送窗口的上限 = min[rwnd, cwnd]

慢开始和拥塞避免

  • 慢开始:TCP刚连接好时,令拥塞窗口 cwnd=1(一个最大报文段长度 MSS),每收到一个对新的报文段的确认,将 cwnd 增加 1。每经过一个传输轮次(一个往返时延 RTT),cwnd就会加倍。增加到一个阈值 ssthresh,开始用拥塞避免算法。
  • 拥塞避免:让 cwnd 缓慢增大。每经过一个 RTT,cwnd加一,而不是加倍。
  • 网络拥塞处理:只要发送方判断网络拥塞(未按时收到确认),就把阈值 ssthresh 设为出现拥塞时,发送方 cwnd 的一半,然后把 cwnd 重新设为 1,开始使用慢开始算法

快重传和快恢复

  • 快重传:发送方连续收到三个重复的 ACK 报文时,直接重传对方尚未收到的报文段,而不必等待设置的重传计时器超时
  • 快恢复:当发送方连续收到三个冗余 ACK 时,将 ssthresh 设为 cwnd 的一半。把 cwnd 设置为 ssthresh 改变后的数值,再执行拥塞避免算法(不用从 1 开始,因此是快恢复)

流量控制中,发送方发送数据的量由接收方确定。在拥塞控制中,则由发送方自己通过检测网络状况来决定。

在 TCP 连接建立和网络出现超时时,采用慢开始和拥塞避免算法

当发送方接收到冗余 ACK 时,采用快重传和快恢复算法。

猜你喜欢

转载自blog.csdn.net/qq_52852138/article/details/125899781