我们首先要知道什么是传输层,传输层就是负责数据能够从发送端传输到接收端。
端口号(Port)标识了一个主机上进行通信的不同的应用程序。
在 TCP/IP 协议中, 用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看);
有些服务器是非常常用的, 为了使用方便, 人们约定一些常用的服务器, 都是用以下这些固定的端口号:
我们自己写一个程序使用端口号时, 要避开这些知名端口号。普通用户进程无法直接绑定这些端口号。如果需要绑定这些端口号,通常需要提升进程的权限(例如使用root用户运行程序)
可以的!我们要的是端口号到服务的唯一性,一个进程可以创建多个Socket,每个Socket都可以绑定一个端口号!
对于服务端而言,绑定多个端口号通常是为了提供多种服务或处理不同类型的连接请求。例如,一个Web服务器可能同时监听HTTP和HTTPS两种协议,分别对应80和443两个端口。在这种情况下,服务端进程需要绑定这两个端口,以便能够同时处理来自这两个端口的连接请求。
虽然客户端通常不需要像服务端那样显式地绑定端口号(因为客户端的端口号通常由操作系统动态分配),但在某些情况下,客户端进程也可能需要绑定特定的端口号。例如,当客户端需要与多个服务端进行通信,并且希望每个连接都使用不同的端口号时,客户端进程就可以绑定多个端口号。此外,在某些网络编程框架中,也允许客户端进程显式地绑定端口号,以便更好地控制网络连接。
在编程实现上,一个进程可以通过创建多个套接字(socket),并将每个套接字绑定到不同的端口号上,来实现绑定多个端口号的功能。
一个端口号在同一时间内不能被多个进程绑定。在操作系统中,端口号是用于区分不同网络服务或应用程序的唯一标识符。当一个进程绑定到一个端口号时,操作系统会记录这个绑定关系,以确保后续的网络请求能够被正确地路由到该进程。
如果多个进程尝试绑定到同一个端口号,操作系统通常会阻止这种操作,因为它无法同时处理来自同一个端口号的多个网络请求。这种限制有助于防止网络请求被错误地路由到错误的进程,从而确保网络通信的准确性和可靠性。
最大长度限制:由于UDP协议首部中有一个16位的最大长度字段,因此一个UDP数据报所能传输的最大长度是64K(65536字节减去IP和UDP首部的长度)。在实际应用中,还需要考虑数据链路层的最大传送单元(MTU)限制。
UDP 传输的过程类似于寄信
应用层交给 UDP 多长的报文, UDP 原样发送, 既不会拆分, 也不会合并;
举个例子:
用 UDP 传输 100 个字节的数据:
如果发送端调用一次 sendto, 发送 100 个字节, 那么接收端也必须调用对应的一次 recvfrom, 接收 100 个字节; 而不能循环调用 10 次 recvfrom, 每次接收 10 个字节;
UDP 的 socket 既能读, 也能写, 这个概念叫做 全双工
我们注意到, UDP 协议首部中有一个 16 位的最大长度. 也就是说一个 UDP 能传输的数据最大长度是 64K(包含 UDP 首部). 然而 64K 在当今的互联网环境下, 是一个非常小的数字. 如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;
由于UDP具有无连接、不可靠和面向数据报等特点,它非常适合于那些对实时性要求较高但对数据完整性要求不高的应用场景。以下是一些常见的UDP应用:
需要注意的是,虽然UDP具有许多优点,但由于其不可靠性,它并不适合所有应用场景。对于需要高可靠性和完整性的数据传输,建议使用TCP(传输控制协议)或其他可靠的传输层协议。