[What]图解TCPIP_TCP&UDP

理解传输层常用的TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)协议。

TCPIP通过IP、端口号、以及协议号来确定要发送的目的计算机以及运行于其上的应用程序。

TCP

TCP是面向连接的、可靠的流协议。

  • TCP用于在传输层有必要实现可靠传输的情况。
tcp_protocol.jpg- 序列号: 指发送数据的位置,每发送一次数据就累加一次该数据字节数的大小
  • 确认应答: 指下一次应该收到的数据的序列号
  • 数据偏移: 表示TCP所传输数据部分应该从TCP包哪个位开始计算,索引为此值乘以4字节
  • 控制位: 对应的控制位上值为1时代表此位有效
  • 窗口大小: 代表本接收端可以接收的数据大小,对方就可以控制发送速度
  • 紧急指针: 当URG控制位为1时有效。表示从数据部分的起始到紧急指针所指示的位置为止为紧急数据。
  • 选项字段用于提高TCP的传输性能。
    • 比如设置窗口扩大来改善TCP吞吐量。

吞吐量的计算使用公式: Tmax = W / RTT

  • Tmax : 最大吞吐量
  • W : 窗口字节数
  • RTT : 往返时间

通过序列号与确认应答提高可靠性

  • 当发送端的数据到达接收主机时,接收端主机会返回一个已收到的消息同喜,这称为应答
    • 当发送端在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发
      • 如果是从机确实没有接收到数据,那么发送端第二次发送将会接收。如果是从机的应答包被丢失,那么发送端第二次发送数据将会被丢弃
  • 在以上基础之上,为发送数据的每个字节都表上号码,接收端查询接收TCP首部的序列号和数据长度,将自己下一步应该接收的序列号作为确认应答返送回去

重发超时的确定

重发超时是指在重发数据之前,等待确认应答到来的哪个特定的时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。

TCP在每次发包时都会计算往返时间(RTT,Round Trip Time)和其偏差,而超时时间就是比这两个值之和稍大一点的值。

连接管理

TCP在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答,在通信结束时会进行断开连接的处理包(FIN包)。

一个连接的建立与断开正常过程至少需要来回发送7个包才能完成。

  • 建立连接时的3次握手,断开连接时的4次确认

以段为单位发送数据

TCP在传送大量数据时,是以MSS(Maximum Segment Size)的大小将数据进行分割发送,进行重发时也是以MSS为单位。

MSS是在3次握手的时候,在两端主机之间被计算得出。

利用窗口控制提高速度

如果每发一个小包就等待一次应答,那网络的吞吐量就会很差。

TCP中利用窗口的概念,将包一次性发送多个,然后下次一次性接收多个应答的方式,来提高吞吐量。

  • 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值
  • 当其中几个确认应答没有收到时(数据已经发送,但应答信号丢失),也可以通过推断其他的应答来确认数据是否到达了对端

当报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。发送端主机如果连续3次收到同一个确认应答, 就会将其所对应的数据进行重发。

  • 这种机制比超时重发更加高效,也被称为高速重发控制(Fast Retransmission).

流量控制

流控制就是指:TCP可以让发送端根据接收端的实际接收能力控制发送的数据量,而避免接收端处理能力有限丢失数据。

  • 由接收端向发送端通知自己可以接收数据的大小,发送端会发送不超过这个限度的数据,这个大小就是窗口大小。
    • 发送端在发送途中会时不时发送窗口探测数据段,以获取最新的窗口大小信息

拥塞控制

为了避免刚开始通道发送大量数据包而导致网络瘫痪的情况,TCP会首先发送较少的数据包,随后依次增加。

最开始将拥塞窗口的大小设置为1个数据段,之后每收到一次确认应答,拥塞窗口的值就乘2.

  • 以这种方式增加也会可能导致拥塞,所以为其规定了一个阀值,只要超过此值,其增长比例为: (1个数据段的字节数)^2 / 拥塞窗口字节数

提高网络利用率的规范

Nagle

Nagle算法:至少满足下面其中一个情况才进行数据发送

  1. 已发送的数据段已经收到确认应答时
  2. 可以发送的数据已达到最大段长度时(MSS)

这中算法可能会导致数据延迟提高,所以在一些应用场合下会关闭该算法的启用。

延迟确认应答

在没有收到 2x最大段长度的数据 为止不做确认应答,其他情况下,最大延迟0.5秒发送确认应答

捎带应答

捎带应答(PiggyBack Acknowledgement):在某些通信中,TCP的确认应答和回执数据可以通过一个包发送。

  • 回执数据的生成需要时间,所以此应答方式具有延迟

UDP

UDP是不具有可靠性的数据包协议,更多的处理交给上层应用去完成。

  • UDP可以确保发送消息的大小,但不能保证接收端一定可以接收到这么多的数据。
  • UDP主要用于高速传输和实时性有较高要求的通信或广播通信。
    • 包总量较少的通信(DNS、SNMP等)
    • 视频、音频等多媒体通信
    • 限定于LAN等特定网络中的应用通信
    • 广播、多播通信
udp_protocol.jpg

端口号

数据链路和IP中的地址,分别指的是MAC地址(识别同一链路中不同的计算机)和IP地址(识别TCP/IP网络中互连的主机和路由器)。

在传输层中的地址指的是端口号,用于识别同一台计算机中进行通信的不同应用程序,也称为程序地址。

端口号的确定

  • 标准既定的端口号: 事先约定好的端口号,客户端对应端口号进行对应操作即可( 不同的传输协议可以使用相同的端口号 )
    • 事先约定的端口号有: 0 ~ 49151,其中0~1023是知名端口号
      • wiki 上列出了这些端口号对应的意义
  • 时序分配法: 由操作系统来自动分配,应用程序不用关心
    • 随机分配端口号有: 49152 ~ 65535

其他传输层协议

UDP-Lite(Lightweight User Datagram Protocol)

UDP-Lite 提供与UDP几乎相同的功能,不过计算校验和和范围可以由应用自行决定。

这样可以只针对不允许发生错误的部分进行校验和检查,对于其他部分,即使发生了错误,也会被忽略不计。 而这个包也不会被丢弃,而是直接传给应用继续处理。

SCTP(Stream COntrol Transmission Protocol)

与TCP一样,都是对一种提供数据到达与否相关可靠性检查的传输层协议。

  • 主要用于进行通信的应用之间发送众多较小消息的情况,这些消息被称为数据块(Chunk),多个数据块组成一个数据包

其有如下特点:

  • 以消息为单位收发
  • 支持多重宿主
  • 支持多数据流通信
  • 可以定义消息的生存期限

DCCP(Datagram Congestion Control Protocol)

由于UDP没有拥塞控制机制,此协议用于辅助UDP控制拥塞。

Last Updated 2019-10-28 一 07:42.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)