这篇文章上次修改于 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.