TCP和UDP的区别

  传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

  文章为写完TCP和UDP的实验程序后,基于《计算机网络:自顶向下方法(6th)》对于TCP和UDP的一次基本梳理。

什么是TCP

TCP定义

  根据《计算机网络:自顶向下方法(6th)》中的定义:TCP是因特网运输层的面向连接的可靠的运输协议。

TCP连接

  TCP被称为是面向连接的(connection-oriented),这是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先互相“握手”,即它们必须相互发送某些预备报文段,以建立确保数据传输的参数。

  TCP连接提供的是全双工服务(full-duplex service),即TCP连接的两端数据流是双向的。

  TCP连接也总是点对点(point-to-point)的,即在单个发送发与单个接收方之间的连接。

  TCP连接的组成包括:一台主机上的缓存、变量和与进程连接的套接字,以及另一台主机上的另一组缓存、变量和与进程连接的套接字。在理解TCP建立连接的过程之前,了解TCP的报文段结构是很有必要的。

TCP报文段结构

image

  TCP的报文段结构如图所示,TCP报文段由首部字段和一个数据字段组成。TCP的首部一般是20字节(比UDP首部多12字节)。

  TCP的首部包括源端口号和目的端口号、检验和字段。此外,TCP报文段首部还包括:

  • 32比特的序号字段和32比特的确认号字段。用于实现可靠数据传输服务。
  • 16比特的接收窗口字段。用于流量控制。
  • 4比特的首部长度字段。该字段指示了以32比特的字为单位的TCP首部长度。(TCP首部的长度是可变的)
  • 可选与变长的选项字段。用于双方协商MMS(最大报文段长度)或用作串口调节因子、此外还定义了一个时间戳选项。
  • 6比特的标志字段。
    • ACK:用于指示确认字段中的值是有效的。
    • RST、SYN、FIN:用于连接的建立和拆除。
    • PSH:被设置时,指示接收方应立即将数据交给上层而不是缓存。
    • URG:用来指示报文段里存在着被发送端的上层实体置为“紧急”的数据。

TCP连接的建立

  • 第一步:客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文段。该报文段不包含应用层数据。但是报文段中的首部中SYN标志被置为1,所以此报文段被称为SYN报文段。另外,客户端会随记地选择一个初始序列号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。该报文段被封装在一个IP数据报中,并发送给服务器。
  • 第二步:一旦包含TCP SYN报文段的IP数据报到达服务器主机,服务器会从中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向该客户端TCP发送允许连接的报文段(也不包含应用层数据)。此报文段的首部包含三个重要信息:SYN被置为1、确认号字段被置为client_isn + 1、服务器选择自己的初始序号(server_isn),并将其放置到TCP报文段首部的序号字段中。此报文段有时被称为SYNACK报文段。
  • 第三步:在收到SYNACK报文段后,客户端也要给该连接分配缓存和变量。客户端向服务器发送另外一个报文段,将server_isn + 1放置到TCP报文段首部的确认号字段,以你为连接已经建立了,所以将SYN置为0。该三次握手的第三个阶段可以再报文段的负载中携带客户端到服务器的数据。

建立连接过程如图:

image

什么是UDP

UDP定义

  用户数据包协议(User Datagram Protocol,UDP),又称用户数据报文协议,是一个简单的面向数据报的传输层协议。该协议由 [RFC 768]中被规范。

UDP特点

  • 关于何时、发送什么数据的应用层控制更为精细
  • 无需建立连接:相较于TCP的三次握手,UDP不需要任何准备即可进行数据传输,因此UDP不会引入建立连接的延时。
  • 无连接状态:UDP不需要像TCP一样维护连接状态,也不跟踪参数,因此UDP一般能够支持更多的活跃客户。
  • 分组首部开销小:每个UDP报文段的首部仅有8字节的开销。

UDP报文段结构

image

  UDP的报文段结构如上图所示。UDP首部只有4个字段,每个字段由两个字节组成。源端口号可以使目的主机将应用数据交给运行在目的端系统中的相应进程。长度字段指示在UDP报文段中的字节数。

TCP和UDP的区别

总的来说,TCP和UDP主要有以下的基本区别:

  1. TCP基于连接,建立连接需要三次握手,UDP无连接。
  2. 数据报上,TCP最低20字节,UDP8字节。
  3. TCP要求资源较多,UDP较少。
  4. TCP基于数据流,UDP基于数据报。
  5. TCP为点对点,UDP可以“多播”。
  6. TCP有拥塞控制,可靠传输,保证顺序和完整性,UDP无拥塞控制,可能导致高丢包率。

在编程时的区别就参考之前的文章:

C语言基于TCP的简易聊天程序

C语言基于UDP的简易聊天程序

打赏点猫粮钱吧~