这篇文章上次修改于 309 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

计算机网络笔记7——UDP

运输层协议保证了运行在不同主机上的应用进程之间的逻辑通信。注意是应用之间的逻辑通信,而主机之间的逻辑通信是由网络层协议负责的。

因特网有两种运输层协议,即TCP和UDP。

运输协议也能使用加密来确保应用程序报文不被入侵者读取。、

IP被称为不可靠服务,它只负责数据包的传输,不保证数据包的交付、顺序、完整性和流量控制。这些可靠性的保证通常由传输层协议(如TCP)来实现。TCP(传输控制协议)通过建立连接、序列号、确认机制和重传机制等手段,提供了可靠的数据传输服务,弥补了IP协议的不足。

多路复用和多路分解

创建一个情景,当你的计算机在运行多个网络进程程序,假设有FTP会话,HTTP进程,Telnet进程,那么当你的计算机收到数据包的时候,就需要判断当前数据包是属于哪个进程来接收。

首先,每个应用都有一个或者多个套接字,在接收主机中的运输层实际上是把数据包交付给了套接字,而并没有标记线程。

对于套接字的理解,可以理解为很多个邮箱,一个进程选择了一个或多个邮箱,然后UDP会把数据确保给到数据包对应的邮箱上。

接收主机怎样将一个到达的运输层报文段定向到对应的套接字:

  • 发送方(多路复用):多个应用进程的数据被传输层的TCP协议处理,添加TCP头部信息(包括源端口号和目标端口号),并通过IP层发送到目标主机。
  • 接收方(多路分解):目标主机的运输层协议(TCP)接收到数据包后,根据TCP头部的目标端口号,将数据包传递给相应的应用进程。

虽然看起来有点复杂,实际上就是使用一个网络层协议的封装,里面可以有多个不同应用的数据被运输层协议封装。

运输层多路复用要求:

套接字有唯一标识符 以及 每个报文段有字段指定要交付到的套接字。

该字段为:有源端口字段 和 目的端口号字段

端口号是16bit的数,在0~65535之间。在0 ~ 1023范围的端口号称为周知端口号,被保留给重要协议,比如http协议,FTP协议等等。

UDP套接字和TCP套接字

UDP套接字通常是一个二元组包含着源端口号和目的地端口号。

TCP套接字是一个四元组包含 源ip 源端口 目的ip 目的端口。

源端口号可以用户发送回复信息的时候使用。注意,至于发给哪个ip的主机,这是网络层负责的事情,与目前的运输层无关。

TCP包含的ip信息可以保证连接唯一性。

在同一时间,同一主机(源IP地址)和同一端口(源端口号)可以与不同的目标主机(目标IP地址)和端口(目标端口号)建立多个连接。因此,四元组确保了网络中的每个TCP连接都是唯一的。

来回的数据只要ip端口匹配,就连接完毕可以互相发送数据。

UDP

UDP只是做了运输层协议能够做的最少工作。UDP完成多路复用和多路分解,并且让接收方能顺利把数据包给对应端口的进程。并且在UDP之前没有任何的连接(握手),也就是“无连接”的体现。

DNS就是一个UDP的例子,发送DNS查询之前没有做任何的试探,直接发送,如果对方没有回应,就尝试去发送给其他的DNS或者直接反应无响应。

优点

  • 把详细任务交给应用层控制
  • 没有连接时延,不会堵塞
  • 不连接,无需保留众多连接参数
  • 首部小,只有8字节,TCP有20字节

问题

  • 没有堵塞控制,会使链路或者路由器发生分组溢出,丢包率大。(可以被自适应堵塞控制解决)

UDP报文结构

UDP报文首部有四个字段,源端口,目的端口,长度,校验和。

长度字段指明了包括首部在内的UDP报文段长度。

UDP校验和

用于检测,在源到目的时是否发生改变。

计算校验和

  • 将UDP头部和数据部分每16位(2字节)一组进行加法运算(考虑进位)。
  • 相加的时候如果出现溢出,则回卷(最高位加到最低位)
  • 最后对运算结果取反码
  • 对于接收方,再计算每部分2字节一组加法运算+反码将会为1111111111111111.